AutoCAD | LISP : Rotation blocs selon polyligne

SET040
Advocate
Advocate

AutoCAD | LISP : Rotation blocs selon polyligne

SET040
Advocate
Advocate

Bonjour,

 

Après quelques recherches, j'ai trouvé ce lisp qui permet effectivement de tourner les blocs selon une polyligne.

 

Mais j'ai deux soucis :

1. le bloc tourne mais l'attribut ne suit pas

2. j'aurais voulu sélectionner une seule fois tous les blocs et qu'ils s'orientent tous par rapport à la ligne la plus proche, après je suppose que ça doit être compliqué en terme de programmation.

 

Je joins un .dwg d'exemple pour effectuer d'éventuels tests.

 

Un tout grand merci d'avance.

 

 

(defun c:RotateToLine nil (c:AlignToLine) (princ))
(defun c:AlignToLine ( / ss pl i en ed pc pt pp an et)
  
  (if (and (setq ss (ssget "_:L" '((0 . "*TEXT,INSERT"))))
	   (setq pl (car (entsel "\nSelect line to enclose to: ")))
	   (wcmatch (cdr (assoc 0 (entget pl))) "*LINE,ARC,CIRCLE,RAY")
	   (wcmatch (cdr (assoc 0 (entget pl))) "~MLINE")
	   )
    (repeat (setq i (sslength ss))
      (if (setq en (ssname ss (setq i (1- i)))
		ed (entget en)
		et (cdr (assoc 0 ed))
		pc (if (and (= "TEXT" et)
			 (/= 0 (cdr (assoc 72 ed)) (cdr (assoc 73 ed))))
		       11
		       10)
		pt (cdr (assoc pc ed))
		pp (vlax-curve-getClosestPointTo pl pt)
		an (angle '(0 0 0) (vlax-curve-getFirstDeriv pl (vlax-curve-getParamAtPoint pl pp))))
	(entmod (append ed
			(list ;(cons pc (polar pp (angle pp pt) 0))
			  (cons 50 (setq an (if (= et "MTEXT")
					      (- an (angle '(0 0 0) (getvar 'UCSXDIR)))
					      an)
					 an (if (< an 0)
					      (+ an (* 2 pi))
					      an)
					 an (if (and (<= (if (= et "MTEXT")
							   an
							   (angle (trans '(0 0 0) 0 1) (trans (polar '(0 0 0) an 1) 0 1))) ; readable text mtext ucs
							 (* 1.5 pi))
						     (>  (if (= et "MTEXT")
							   an
							   (angle (trans '(0 0 0) 0 1) (trans (polar '(0 0 0) an 1) 0 1)))
							 (* 0.5 pi)))
					      (+ an pi)
					      an)))))))))
  (princ)
  )

 

 


Le titre du sujet a été modifié par un modérateur pour faciliter la recherche. Titre original:
Rotation blocs selon polyligne

 

0 J'aime
Répondre
Solutions acceptées (1)
1 296 Visites
6 Réponses
Replies (6)

CADaSchtroumpf
Advisor
Advisor
Solution acceptée

@SET040  a écrit :

Bonjour,

 

Après quelques recherches, j'ai trouvé ce lisp qui permet effectivement de tourner les blocs selon une polyligne.

 

Mais j'ai deux soucis :

1. le bloc tourne mais l'attribut ne suit pas

2. j'aurais voulu sélectionner une seule fois tous les blocs et qu'ils s'orientent tous par rapport à la ligne la plus proche, après je suppose que ça doit être compliqué en terme de programmation.

 

Je joins un .dwg d'exemple pour effectuer d'éventuels tests.

 

Un tout grand merci d'avance.

 

 


Bonjour,

Avec ton exemple ton lisp fonctionne très bien.

Tu peux sélectionner tous les blocs par fenêtre et choisir une SEULE polyligne (rouge par exemple)

Tout les blocs vont s'aligner avec cet angle (le point de base ne change pas: mis en commentaire dans le code)

Ceci fait, utilise la commande ATTSYNC et mets à jour le bloc TCPoint, tes attributs vont tourner aussi.

0 J'aime

SET040
Advocate
Advocate

Ah super, cela fonctionne effectivement.

 

J'ai rajouté en fin de code : 

(command "attsync" "selectionner" "D" "")

 

Cela tourne correctement !

 

Par contre, le lisp demande de cliquer chaque polyligne 'unes par unes'.

 

Aurais-tu une solution pour cela ? Sinon je prendrai mon mal en patience... 🙂

 

Déjà merci pour ton aide !

0 J'aime

oliv.bonnefoy
Community Visitor
Community Visitor

Bonjour,

 

Votre code m'intéresse beaucoup, mais lorsque je lance la commande cela me renvoie l'erreur :

 

Selection Ligne: ; erreur: no function definition: VLAX-CURVE-GETCLOSESTPOINTTO

 

Sauriez-vous d'où cela vient ?

Merci d'avance.

0 J'aime

braudpat
Mentor
Mentor

Hello @oliv.bonnefoy 

 

SVP tu rajoutes cette ligne au debut du Lisp : (vl-load-com)

 

La Sante, Bye, Patrice

 

Patrice ( Supporting Troops ) - Autodesk Expert Elite
If you are happy with my answer please mark "Accept as Solution" and if very happy please give me a Kudos (Felicitations) - Thanks

Patrice BRAUD

EESignature


0 J'aime

oliv.bonnefoy
Community Visitor
Community Visitor

Merci beaucoup pour ta réponse.

0 J'aime

-didier-
Advisor
Advisor

Bonjour @oliv.bonnefoy 

 

Pour faire plus "simple", on peut utiliser la commande de rotation sur le bloc et

dans ce cas, on n'a plus besoin de ATTSYNC.

Suivant votre intérêt de la chose, je peux vous proposer une solution.

 

Amicalement

Éternel débutant.. my site for learning : Programmer dans AutoCAD

Didier Aveline

EESignature

0 J'aime