Aller au contenu

Aligner des blocs perpendiculairement à une polyligne


doublecriquet

Messages recommandés

Bonjour,

 

Tout d'abord "Un grand bravo" et merci à tous les membres actifs de ce site, qui regorge de trésors et de petites fonctions très utiles. :D

 

Je suis débutant en Autocad, je ne connais pas la programmation, alors peut-être que ma question va paraitre simplisme ou idiote, ou peut-être pas. Ça serait sympa si l'un d'entre vous pouvait me dire si c'est réalisable ou non, et comment ?

 

Je souhaiterais aligner de manière automatique une série de blocs identiques perpendiculairement le long d'une polyligne (par exemple des "symboles kilométriques" représentés par des blocs le long d'une route représentée par un polyligne en 2D). En effet, la route fait plusieurs milliers de kms, et ce serait long de faire une rotation de chaque bloc un par un à la main à l'aide des poignées...

 

En fait, mes symboles kilométriques sont déjà correctement placés sur la polyligne (en remplaçant des points présents sur la polyligne par des wblocs de manière automatique à l'aide d'un petit LISP que j'ai trouvé sur ce site) le problème est que l'angle d'insertion automatique de ce LISP est 0, alors que je souhaiterais que ces blocs soient perpendiculaires le long de la polyligne.

 

Existe t-il un LISP ou une autre fonction permettant de sélectionner tous les blocs (symboles kilométriques) d'un seul coup sur le dessin et de leur faire faire une rotation indépendante automatique le long de la polyligne ? :casstet:

 

[Edité le 8/7/2008 par doublecriquet]

Lien vers le commentaire
Partager sur d’autres sites

salut

 

une auttre solution

 

dans ton fichier de base qui te sert de bloc

tu tournes l'attribut de 90 degres dans le sens horaire ou trigo a toi de voir

et tu le rappel en remplacement des tes milliers de bloc

comme tes blocs sont déja en place avec une certaines rotation

 

ils seront tous tournés de 90 degres

 

sinon quel LISP as tu utilisé ?

il est peut etre modifiable pour faire en sorte de demander l'angle par rapport a la polyligne au point d'insertion ce qui pourrait servir a d'autres

 

phil

 

[Edité le 8/7/2008 par PHILPHIL]

FREELANCE

Autodesk Architecture 2025 sous windows 11 64

REVIT

24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal

Lien vers le commentaire
Partager sur d’autres sites

... Merci pour vos réponses super rapides ! :)

 

...Mais je crois que j'ai mal formulé ma demande : je souhaiterais que les blocs soient perpendiculaires aux différentes pentes de la polyligne 2D et non à 90°sur le dessin (ces blocs doivent donc avoir tous au final une rotation différente en fonction de la pente de la polyligne sur laquelle ils sont placés).

 

Il faudrait donc qu'il y ait un calcul automatique des pentes de la polyligne (séparée sur un calque différent) pour qu'ils s'orientent perpendiculairement par rapport à chaque pente de cette polyligne.

 

PHILPHIL, Pour l'insertion automatique des blocs en remplacement des points, j'ai utilisé le LISP "pt-blc" , mais ils se placent avec une rotation = 0 :

 

;;; Remplace Nodal par Bloc demandé :

 

(defun c:pt-blc (/ sel i nb)

(vl-load-com)

(princ "\n Choix des points :")

(or (setq sel (ssget '((0 . "POINT"))))

(setq sel (ssget "_X" '((0 . "POINT")))))

(setq nb (getstring T (strcat "\n Entrez le nom du bloc <"(getvar "INSNAME")">:")))

(if (equal nb "") (setq nb (getvar "INSNAME")))

 

(repeat (setq i (sslength sel))

(command "_insert" nb (cdr (assoc 10 (entget (ssname sel (setq i (1- i))))))

1 1 0)

(vla-delete (vlax-ename->vla-object (ssname sel i)))

)

(princ (strcat "\n " (rtos (sslength sel)) " Points remplacé par Bloc "(getvar "INSNAME")""))

(princ)

)

 

 

;;;Remplace Bloc Selectionné par Nodal

(defun c:bloc-pt (/ sel i)

(vl-load-com)

(princ "\n Choix des Blocs :")

(or (setq sel (ssget '((0 . "INSERT"))))

(setq sel (ssget "_X" '((0 . "INSERT")))))

 

(repeat (setq i (sslength sel))

(command "_point" (cdr (assoc 10 (entget (ssname sel (setq i (1- i)))))))

(vla-delete (vlax-ename->vla-object (ssname sel i)))

)

(princ (strcat "\n " (rtos (sslength sel)) " Blocs remplacé par Point."))

(princ)

)

 

 

Il ne manquerait donc plus que chaque bloc effectue une rotation auto pour être perpendiculaire à la pente de la polyligne.

 

Auriez-vous une petite idée ? :)

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Si j'ai bien compris la demande, pas besoin de LISP.

 

Essaye la commande MESURER (_MEASURE) option "Bloc" et répondre "Oui" à l'invite "Aligner le bloc avec l'objet ?"

 

À toi d'orienter ta définition de bloc pour qu'il soit "perpendiculaire" à l'objet (polyligne).

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

 

Merci à tous pour vos réponses.

 

gile, tu as trouvé la fonction exact que je cherchais, la fonction "MESURER" combiné aux blocs qui permet de les aligner perpendiculairement sur la polyligne. :D

 

Parfois j'ai aussi d'autres symboles à placer de la même manière (perpendiculairement à la polyligne), mais leur placement n'est pas régulier comme les symboles kilométriques. J'ai leurs coordonnées xy. Pour l'instant je place ces points avec un script, puis avec le LISP que j'ai décrit plus haut, je remplace par des blocs qui se positionnent bien au point d'insertion, mais avec une rotation = 0 , et non perpendiculairement à la polyligne comme je le voudrais.

 

Y-a-t-il une méthode (peut-être un LISP là pour le coup ?) pour ces symboles "non réguliers" où je ne peux pas utiliser la fonction "MESURER" ?

 

 

Lien vers le commentaire
Partager sur d’autres sites

Y-a-t-il une méthode (peut-être un LISP là pour le coup ?) pour ces symboles "non réguliers" où je ne peux pas utiliser la fonction "MESURER" ?

 

Une proposition vite faite, devrait bien fonctionner pour des blocs sans attributs.

 

((lambda ( / js dxf_cod n js_lw obj dxf_ent pt pt_cl deriv alpha)
(princ "\nSélectionnez un bloc modèle pour obtenir son nom.")
(while
	(null
		(setq js
			(ssget "_+.:E:S"
				(list
					'(0 . "INSERT")
					(cons 67 (if (eq (getvar "CVPORT") 1) 1 0))
					(cons 410 (if (eq (getvar "CVPORT") 1) (getvar "CTAB") "Model"))
				)
			)
		)
	)
	(princ "\nCe n'est pas un bloc!")
)
(setq dxf_cod (entget (ssname js 0)))
(princ (strcat "\nSélectionnez par une fenetre filtrée les blocs " (cdr (assoc 2 dxf_cod)) " : ")) 
(setq
   js (ssget (list (assoc 0 dxf_cod) (assoc 2 dxf_cod) (assoc 8 dxf_cod) (assoc 67 dxf_cod) (assoc 410 dxf_cod)))
   n -1
 )
(princ "\nSélectionnez une polyligne où aligner les blocs.")
(while
	(null
		(setq js_lw
			(ssget "_+.:E:S"
				(list
					'(0 . "*POLYLINE")
					(cons 67 (if (eq (getvar "CVPORT") 1) 1 0))
					(cons 410 (if (eq (getvar "CVPORT") 1) (getvar "CTAB") "Model"))
				)
			)
		)
	)
)
(vl-load-com)
(setq obj (vlax-ename->vla-object (ssname js_lw 0)))
(repeat (sslength js)
	(setq
		dxf_ent (entget (ssname js (setq n (1+ n))))
		pt (cdr (assoc 10 dxf_ent))
		pt_cl (vlax-curve-getClosestPointTo obj pt T)
     deriv (vlax-curve-getFirstDeriv obj (vlax-curve-getParamAtPoint obj pt_cl))
     alpha (atan (cadr deriv) (car deriv))
     dxf_ent (subst (cons 50 alpha) (assoc 50 dxf_ent) dxf_ent)
   )
   (entmod dxf_ent)
   (entupd (cdar dxf_ent))
 )
 (prin1)
))

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Re,

 

le même genre de routine pour des éléments de texte

 

Je me sers souvent de ce lisp (désolé, je ne me rapelle pas l'auteur, mais je ne pense pas que ce soit glané sur ce site,..)

 

Commande : align_text

 

(defun c:align_text ( / ss1 obj_txt ss2 obj_curv pt_sel param deriv alpha pt1 pt2 bdx mid_text delta obj_cpy pt1 pt2 key e_sel)
(princ "\nChoix du texte à aligner: ")
(while (not (setq ss1 (ssget "_+.:E:S" '((0 . "*TEXT"))))))
(setq obj_txt (vlax-ename->vla-object (ssname ss1 0)))
(while (not (setq ss2 (entsel "\nAligner le texte sur: "))))
(setq obj_curv (vlax-ename->vla-object (car ss2)))
(cond
	((member
		(vlax-get-property obj_curv 'ObjectName)
		'("AcDbLine" "AcDbXline" "AcDbPolyline" "AcDb2dPolyline" "AcDbSpline" "AcDbEllipse" "AcDbArc" "AcDbCircle")
	 )
		(setq
			pt_sel (vlax-curve-getClosestPointTo obj_curv (trans (cadr ss2) 1 0))
			param (vlax-curve-getparamatpoint obj_curv pt_sel)
			deriv (vlax-curve-getfirstderiv obj_curv param)
			alpha (atan (cadr deriv) (car deriv))
		)
		(vlax-put-property obj_txt 'Rotation alpha)
		(vlax-invoke-method
			obj_txt
			'GetBoundingBox
			'pt1
			'pt2
		)
		(setq
			bdx (mapcar 'vlax-safearray->list (list pt1 pt2))
			mid_text (mapcar '* (mapcar '+ (car bdx) (cadr bdx)) '(0.5 0.5 0.5))
			obj_cpy (vlax-invoke-method obj_txt 'Copy)
		)
		(if (eq (vlax-get-property obj_txt 'ObjectName) "AcDbText")
			(setq delta (vlax-get-property obj_txt 'Height))
			(setq delta (cdr (assoc 43 (entget (ssname ss1 0)))))
		)
		(vlax-invoke-method
			obj_txt
			'Move
			(vlax-3d-point mid_text)
			(vlax-3d-point (setq pt1 (polar pt_sel (+ alpha (/ pi 2)) delta)))
		)
		(vlax-invoke-method
			obj_cpy
			'Move
			(vlax-3d-point mid_text)
			(vlax-3d-point (setq pt2 (polar pt_sel (- alpha (/ pi 2)) delta)))
		)
		(setq ss2 (ssadd) ss2 (ssadd (vlax-vla-object->ename obj_cpy) ss2))
		(if (zerop (getvar "PICKFIRST")) (setvar "PICKFIRST" 1))
		(if (and ss1 ss2 (= 0 (getvar "CMDACTIVE"))) 
			(progn
				(sssetfirst nil ss2)
				(princ "\n pour choix effacement; /[Espace]/Click+droit pour finir!.")
				(while (and (not (member (setq key (grread T 4 2)) '((2 13) (2 32)))) (/= (car key) 25))
					(cond
						((eq (car key) 5)
							(if (									(sssetfirst nil ss1)
								(sssetfirst nil ss2)
							)
						)
					)
				)
			)
		)
		(setq e_sel (ssname (cadr (ssgetfirst)) 0))
		(if (eq e_sel (ssname ss1 0))
			(setq obj_txt (vlax-ename->vla-object (ssname ss2 0)) pt_sel pt2)
			(setq obj_txt (vlax-ename->vla-object (ssname ss1 0)) pt_sel pt1)
		)
		(entdel e_sel)
		(princ "\n ou [Click+gauche] pour tourner de 90°/ ou [Click+droit] pour finir!.")
		(while (and (not (member (setq key (grread nil 4 0)) '((2 13)))) (/= (car key) 25))
			(vlax-invoke-method
				obj_txt
				'Rotate
				(vlax-3d-point pt_sel)
				(/ pi 2.0)
			)
		)
	)
	(T
		(princ "\nL'objet ne peut servir de référence d'alignement")
	)
)
(prin1)
) 

 

Pas mal bonuscad !

 

Et il est ou cette fois ton "defun c:align_bloc", par exemple ?!. Cela m'intéresse de conserver ce code. Merci d'avance.

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Lien vers le commentaire
Partager sur d’autres sites

Je me sers souvent de ce lisp (désolé, je ne me rapelle pas l'auteur, mais je ne pense pas que ce soit glané sur ce site,..)

 

Commande : align_text

 

Sur ma page , mais aussi sur cadxp !

D'ailleurs il y avait une variante pour les blocs demandé par Kallain.

 

 

Et il est ou cette fois ton "defun c:align_bloc", par exemple ?!.

 

Je me sers souvent de lambda quand je fais une version test, ou que je ne sais pas quoi mettre comme nom de fonction.

 

Je rappelle que lon peut remplacer sans aucun souci

((lambda ( / ....) ......))

par

(defun c:CEQUONVEUT ( / ....).....)

pour en faire une fonction permanente à l'inverse de lambda qui est une fonction anonyme qui ne peut se lancer qu'une seule fois.

Ne pas omettre cependant d'enlever une paire de parenthèses appariées qui se trouve avec lambda.

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Bonjour à toutes et tous,

 

Sur ma page , mais aussi sur cadxp !

 

Milles excuses de ne pas t'avoir reconnu !!! (Faut dire le "defun c:CEQUONVEUT " est en début de lisp,...???!!! ) Encore un outil super génial au passage, ...

 

Je rappelle que lon peut remplacer sans aucun souci,.....

 

Merci pour cette piqure de rappel, je m'le note quelque part,...!)

 

@+,

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Merci à tous, je suis comblé ! mon travail va avancé vite vite grâce à votre aide ! ! !

 

Merci lili2006 pour Align_Text, encore une routine qui va me (presque) changer la vie !

 

Merci bonuscad pour le LISP "CEQUONVEUT" (<acronym class=dict title=) et le petit tuto de remplacement du lambda par defun, ça à pas l'air, mais pour quelqu'un qui ne connait pas le LISP, ça change bcp de chose...

 

Merci Gile pour l'explication de MESURER avec des blocs !

 

Merci Philphil de ton aide

 

Bref Merci, Merci, et encore Merci a vous tous et au super esprit d'entraide qui règne sur ce site !!

:D:D:D

 

 

Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité