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
Résolu ! Accéder à la solution.
Résolu par CADaSchtroumpf. Accéder à la solution.
@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.
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 !
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.
Hello @oliv.bonnefoy
SVP tu rajoutes cette ligne au debut du Lisp : (vl-load-com)
La Sante, Bye, Patrice
Patrice BRAUD
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
Didier Aveline
Vous n'avez pas trouvé ce que vous recherchiez ? Posez une question à la communauté ou partagez vos connaissances.