Communauté
AutoCAD – tous produits - Français
Bienvenue sur les forums AutoCAD d’Autodesk. Partagez vos connaissances, posez des questions, et explorez les sujets AutoCAD populaires.
annuler
Affichage des résultats de 
Afficher  uniquement  | Rechercher plutôt 
Vouliez-vous dire : 

AutoCAD | LISP : Rotation blocs selon polyligne

6 RÉPONSES 6
RÉSOLU
Répondre
Message 1 sur 7
SET040
1188 Visites, 6 Réponses

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

AutoCAD | LISP : Rotation blocs selon polyligne

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

 

6 RÉPONSES 6
Message 2 sur 7
CADaSchtroumpf
en réponse à: SET040

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  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.

Message 3 sur 7
SET040
en réponse à: CADaSchtroumpf

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

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 !

Message 4 sur 7
oliv.bonnefoy
en réponse à: SET040

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

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.

Message 5 sur 7
braudpat
en réponse à: oliv.bonnefoy

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

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


Message 6 sur 7
oliv.bonnefoy
en réponse à: braudpat

oliv.bonnefoy
Community Visitor
Community Visitor

Merci beaucoup pour ta réponse.

0 J'aime

Merci beaucoup pour ta réponse.

Message 7 sur 7
-didier-
en réponse à: oliv.bonnefoy

-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

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

Vous n'avez pas trouvé ce que vous recherchiez ? Posez une question à la communauté ou partagez vos connaissances.

Publier dans les forums  

Autodesk Design & Make Report