Bonjour,
j'ai ce lisp qui me sert de test :
(defun c:dessiner1 ()
(setq blocs (ssget "X" '((2 . "INCORPO1")))) ; Sélectionne tous les blocs nommés "INCORPO1"
(if blocs
(progn
(setq nbr-blocs (sslength blocs))
(setq i 0)
(while (< i nbr-blocs)
(setq blk (ssname blocs i))
(setq ent (entget blk))
(setq insert-point (cdr (assoc 10 ent))) ; Récupère les coordonnées d'insertion du bloc
; Dessine une ligne en partant de l'insertion
(command "_line" insert-point "0,0" "")
(setq i (1+ i))))
(prompt "\nAucun bloc nommé 'INCORPO1' trouvé.")))
(dessiner1)
Il fonctionne sur mes blocs nommés "INCORPO1" qui on un attibut. Mais dès que je déplace mon attribut de place avec la poignée et que je relance le lisp le bloc en question n'est plus pris en compte.
Quelqu'un aurai une solution ?
Merci
Le titre du sujet a été modifié par un modérateur pour faciliter la recherche. Titre original:
LT / Problème SSGET blocs avec attributs
Résolu ! Accéder à la solution.
Résolu par _gile. Accéder à la solution.
Bonjour @remi_clavel87TZH
Je ne constate pas ce que vous dîtes. ça fonctionne dans tous les cas.
Toutefois, vous pouvez corriger/améliorer :
Amicalement
Didier Aveline
Salut,
La seule explication que je devine serait que le bloc "INCORPO1" soit un bloc dynamique avec le déplacement de l'attribut lié à un paramètre dynamique.
Pour pouvoir donner une réponse fiable, il faudrait voir le bloc en question.
Mais si je devine bien, en plus des blocs nommés "INCORPO1" il faut aussi sélectionner les blocs "anonymes" (*U1, *U2, ...) parce que dès qu'on modifie les propriétés dynamiques d'un bloc dynamique, AutoCAD crée une nouvelle définition de bloc avec les nouvelles caractéristiques et lui attribue un nom incrémenté commençant par *U.
Une fois sélectionnés tous les blocs "INCORPO1" (non modifiés) et tous les blocs anonymes, il faut vérifier que ces derniers soient bien issus d'un bloc "INCORPO1", pour ce faire, on teste la valeur de la propriété "BlockTableRecord/Name" qui correspond au nom de la définition du bloc original.
(defun c:dessiner1 (/ ss i blk blocs insert-point)
;; Sélectionne tous les blocs nommés "INCORPO1" et les blocs anonymes
(if (setq ss (ssget "X" '((2 . "INCORPO1,`*U*"))))
;; Crée une liste avec les blocs effectivement nommés "INCORPO1"
(repeat (setq i (sslength ss))
(setq blk (ssname ss (setq i (1- i))))
(if (= (getpropertyvalue blk "BlockTableRecord/Name") "INCORPO1")
(setq blocs (cons blk blocs))
)
)
)
(if (zerop (length blocs))
(prompt "\nAucun bloc nommé 'INCORPO1' trouvé.")
(foreach blk blocs
;; Récupère les coordonnées d'insertion du bloc
(setq insert-point (getpropertyvalue blk "Position"))
;; Dessine une ligne en partant de l'insertion
(command-s "_.line" "_non" insert-point "_non" '(0 0) "")
)
)
(princ)
)
PS: quand on poste du code, il est préférable d'utiliser le bouton "Insert/Edit code sample" (</>) pour conserver le formatage du code.
Vous n'avez pas trouvé ce que vous recherchiez ? Posez une question à la communauté ou partagez vos connaissances.