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 LT / Problème SSGET blocs avec attributs

2 RÉPONSES 2
RÉSOLU
Répondre
Message 1 sur 3
remi_clavel87TZH
189 Visites, 2 Réponses

AutoCAD LT / Problème SSGET blocs avec attributs

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

2 RÉPONSES 2
Message 2 sur 3
-didier-
en réponse à: remi_clavel87TZH

Bonjour @remi_clavel87TZH 

 

Je ne constate pas ce que vous dîtes. ça fonctionne dans tous les cas.

Toutefois, vous pouvez corriger/améliorer :

  • La dernière ligne ne sert à rien, la supprimer
  • Déclarer les variables pour qu'à chaque appel de la commande, il reparte à vide.
    (defun c:dessiner1 ( / blk blocs ent i insert-point nbr-blocs)

Amicalement

 

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

Didier Aveline

EESignature

Message 3 sur 3
_gile
en réponse à: remi_clavel87TZH

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.



Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

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