Aller au contenu

TROUVER DANS UN BLOC DIRECTEMENT L'ATTRIBUT


PHILPHIL

Messages recommandés

Bonjour

 

j'ai des blocs paramétriques avec des attributs et des propriétés rien de plus simple

 

un attribut "REF"

une propriété dynamique "LONGUEUR BAS" ( influence une longueur de wipeout )

 

comme on connait le Nom de l'attribut et celui du paramètre

peut on accéder directement a la propriété de l'attribut et modifie la valeur de la propriété dynamique

ce qui doit etre plus rapide

 

 

que de passé par un "FOREACH" a chaque fois comme je suis en train de le faire

car la on passe en revu tout les attributs jusqu’à ce que l'on trouve "REF"

puis apres on passe en revu toutes les proprietés dynamique jusqu’à ce que l'on trouve "LONGUEUR BAS"

 

 

 

EXTRAIT DU CODE ( ne fonctionne pas je sais )

 

(setq compt 0)
 (acet-ui-progress-init "Avancement" com)
 (while (< compt com)
   (foreach prop (vlax-invoke (vlax-ename->vla-object (cdr (assoc -1 (entget (ssname selinsert compt)))))
                              'getattributes
                 )
     (if (= (vla-get-tagstring prop) "REF")
       (vla-put-value "LONGUEUR BAS" ;; ne marche pas car la proprietée n'a pas été "invoquée" ?
                 )
                      (* (1+ (round (- (caadr (textbox (list (cons 1 (vla-get-textstring prop)))))
                                       (caar (textbox (list (cons 1 (vla-get-textstring prop)))))
                                    )
                                    0.25
                             )
                         )
                         4
                      )
       )
     )
   )
   (acet-ui-progress-init (strcat "Avancement " (rtos (/ (* compt 100) (float com)) 2 2) " %") com)
   (acet-ui-progress-safe compt)
   (setq compt (1+ compt))
 )
 (acet-ui-progress-done)

 

 

 

comme j'ai plusieurs attributs et parametres

mon autre solution est de faire la liste des données des attributs avec un "foreach" tout passé en revue donc

puis ensuite modifie les parametres avec un "foreach" tout passé en revue

 

 

 

bon week end

 

Phil

Autodesk Architecture 2023 sous windows 11 64

24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Le lisp MAT de notre regretté Patrick_35 devrait répondre à ta demande.

Steven________________________________________

Pour le taf; Windows (et ses emmerdes) sinon pas d'AutoCAD.

Pour le perso Linux Mint et pas de problèmes. Mais pas d'AutoCAD.

En rêve; AutoCAD sous Linux.

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Tu fais :

(setq bloc (car (entsel)))

et tu sélectionnes ton bloc, puis tu fais :

(dumpallproperties bloc)

et tu ouvres la fenêtre de texte (F2).

Tu devrais trouver des propriétés nommées "AcDbDynBlockPropertyXXX" qui correspondent à chacune des propriétés dynamiques de ton bloc ainsi que des propriétés correspondant aux étiquettes des attributs ("REF").

Tu peux lire les valeurs de ces propriétés avec getpropertyvalue et modifier leurs valeurs avec setpropertyvalue

(setpropertyvalue bloc "AcDbDynBlockPropertyLONGUEUR BAS" 50.0)
(setpropertyvalue bloc "REF" "toto")

 

Ces fonctions qui permettent d'accéder "directement" à une valeur d'attribut ou de propriété dynamique en LISP font très probablement le 'foreach' dans leur implémentation (mais e C, c'est peut-être un peu plus rapide).

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

hello Gile

 

ca marche bien et c'est plus rapide et le lisp est plus court qu'avec des "foreach"

 

voici le lisp si besoin

 

 

pour trouver toutes les données d'une entitée

(defun c:dump_all_activeX (/ ent obj )
 (while (setq ent (car (entsel "\nSélectionnez l'entité pour obtenir les données activeX: ")))
   (dumpallproperties ent )
   )
 (princ)
)

 

pour sélectionner des blocs avec le nom ( effectivename) suivant une liste prédéfinie (listenamebloc) voir lisp suivant

 

;; renvoie un jeu de sélection filtré par une liste de nom 
(defun ssbnameLISTE ( listenamebloc /
;;;                     selinsert
                    i ent)
 (prompt "\nSELECTIONNER LES BLOCS :")
 (if (setq selinsert (ssget (list (cons 0 "INSERT")
;;;                                   (cons 2 (strcat "`*U*," namebloc1))
                                  )))
   (repeat (setq i (sslength selinsert))
     (setq ent (ssname selinsert (setq i (1- i))))
     (if (= (member (vla-get-effectivename (vlax-ename->vla-object ent)) listenamebloc )
            nil
         )
       (ssdel ent selinsert)
     )
   )
 )
selinsert
)

 

 

 

 

 

exemple

 

selectionne des blocs suivant une liste de nom

suivant un nom de bloc "MARCOG" ou "MARCOD"

modifie la propriete dynamique du bloc "LARGEUR CACHE" suivant la longueur du texte dans l'attribut "COUPE"

 

 

(defun c:adapter_wipeout_attribut (/)
 (setvar "cmdecho" 0)
 (setvar "CURSORSIZE" 10)
 (setq osm (getvar "osmode"))
 (prompt "\nSELECTIONNER LES BLOCS DE NIVEAU POUR LA MODIFICATION DES WIPEOUT :")
 (setq listenamebloc (list "MARCOG" "COTNIVG" "COTNIVD" "MARCOD"))
 (ssbnameliste listenamebloc)
 (setq com (sslength selinsert))
 (setq compt 0)
 (acet-ui-progress-init "Avancement" com)
 (while (< compt com)
   (if (or (= (vla-get-effectivename (vlax-ename->vla-object (cdr (assoc -1 (entget (ssname selinsert compt))))))
              "COTNIVG"
           )
           (= (vla-get-effectivename (vlax-ename->vla-object (cdr (assoc -1 (entget (ssname selinsert compt))))))
              "COTNIVD"
           )
       )
     (progn (setpropertyvalue (cdr (assoc -1 (entget (ssname selinsert compt))))
                              "AcDbDynBlockPropertyLONGUEUR BAS"
                              (* (1+
                                   (round (- (caadr
                                               (textbox (list (cons 1 (getpropertyvalue (cdr (assoc -1 (entget (ssname selinsert compt)))) "REF")))
                                               )
                                             )
                                             (caar
                                               (textbox (list (cons 1 (getpropertyvalue (cdr (assoc -1 (entget (ssname selinsert compt)))) "REF")))
                                               )
                                             )
                                          )
                                          0.25
                                   )
                                 )
                                 4
                              )
            )
            (setpropertyvalue (cdr (assoc -1 (entget (ssname selinsert compt))))
                              "AcDbDynBlockPropertyLONGUEUR MILIEU"
                              (* (1+
                                   (round (- (caadr
                                               (textbox (list (cons 1 (getpropertyvalue (cdr (assoc -1 (entget (ssname selinsert compt)))) "ALT")))
                                               )
                                             )
                                             (caar
                                               (textbox (list (cons 1 (getpropertyvalue (cdr (assoc -1 (entget (ssname selinsert compt)))) "ALT")))
                                               )
                                             )
                                          )
                                          0.25
                                   )
                                 )
                                 4
                              )
            )
            (if (= (getpropertyvalue (cdr (assoc -1 (entget (ssname selinsert compt)))) "NIVEAU") "")
              (progn (setpropertyvalue (cdr (assoc -1 (entget (ssname selinsert compt))))
                                       "AcDbDynBlockPropertyNb NIVEAU"
                                       "2 NIVEAUX"
                     )
                     (setpropertyvalue (cdr (assoc -1 (entget (ssname selinsert compt))))
                                       "AcDbDynBlockPropertyLONGUEUR HAUT"
                                       1
                     )
              )
              (progn (setpropertyvalue (cdr (assoc -1 (entget (ssname selinsert compt))))
                                       "AcDbDynBlockPropertyNb NIVEAU"
                                       "3 NIVEAUX"
                     )
                     (setpropertyvalue (cdr (assoc -1 (entget (ssname selinsert compt))))
                                       "AcDbDynBlockPropertyLONGUEUR HAUT"
                                       (* (1+
                                            (round (- (caadr
                                                        (textbox
                                                          (list (cons 1 (getpropertyvalue (cdr (assoc -1 (entget (ssname selinsert compt)))) "NIVEAU")))
                                                        )
                                                      )
                                                      (caar
                                                        (textbox
                                                          (list (cons 1 (getpropertyvalue (cdr (assoc -1 (entget (ssname selinsert compt)))) "NIVEAU")))
                                                        )
                                                      )
                                                   )
                                                   0.25
                                            )
                                          )
                                          4
                                       )
                     )
              )
            )
     )
   )
   (if (or (= (vla-get-effectivename (vlax-ename->vla-object (cdr (assoc -1 (entget (ssname selinsert compt))))))
              "MARCOG"
           )
           (= (vla-get-effectivename (vlax-ename->vla-object (cdr (assoc -1 (entget (ssname selinsert compt))))))
              "MARCOD"
           )
       )
     (progn (setpropertyvalue (cdr (assoc -1 (entget (ssname selinsert compt))))
                              "AcDbDynBlockPropertyLARGEUR CACHE"
                              (* (1+
                                   (round (- (caadr
                                               (textbox
                                                 (list (cons 1 (getpropertyvalue (cdr (assoc -1 (entget (ssname selinsert compt)))) "COUPE")))
                                               )
                                             )
                                             (caar
                                               (textbox
                                                 (list (cons 1 (getpropertyvalue (cdr (assoc -1 (entget (ssname selinsert compt)))) "COUPE")))
                                               )
                                             )
                                          )
                                          0.25
                                   )
                                 )
                                 8
                              )
            )
            (setpropertyvalue (cdr (assoc -1 (entget (ssname selinsert compt))))
                              "AcDbDynBlockPropertyLONGUEUR"
                              (* (+ 4
                                    (round (- (caadr
                                                (textbox
                                                  (list (cons 1 (getpropertyvalue (cdr (assoc -1 (entget (ssname selinsert compt)))) "COUPE")))
                                                )
                                              )
                                              (caar
                                                (textbox
                                                  (list (cons 1 (getpropertyvalue (cdr (assoc -1 (entget (ssname selinsert compt)))) "COUPE")))
                                                )
                                              )
                                           )
                                           0.25
                                    )
                                 )
                                 8
                              )
            )
     )
   )
   (acet-ui-progress-init (strcat "Avancement " (rtos (/ (* compt 100) (float com)) 2 2) " %") com)
   (acet-ui-progress-safe compt)
   (setq compt (1+ compt))
 )
 (acet-ui-progress-done)
 (setvar "osmode" osm)
 (princ)
)

 

 

Phil

Autodesk Architecture 2023 sous windows 11 64

24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal

Lien vers le commentaire
Partager sur d’autres sites

Petite précision, ces fonctions ne sont pas liées à ActiveX.

Au contraire, elles ont été développées pour les versions MAC comme une alternative à ActiveX (qui est spécifique à Windows).

 

Pour le "EffectiveName", tu peux aussi les utiliser :

(getpropertyvalue (getpropertyvalue (entlast) "BlockTableRecord") "Name")

Qui peut s'écrire plus implement pour les dernières versions :

(getpropertyvalue (entlast) "BlockTableRecord/Name")

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité