PHILPHIL Posté(e) le 19 octobre 2019 Posté(e) le 19 octobre 2019 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ètrepeut on accéder directement a la propriété de l'attribut et modifie la valeur de la propriété dynamiquece qui doit etre plus rapide que de passé par un "FOREACH" a chaque fois comme je suis en train de le fairecar 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 parametresmon autre solution est de faire la liste des données des attributs avec un "foreach" tout passé en revue doncpuis ensuite modifie les parametres avec un "foreach" tout passé en revue bon week end Phil FREELANCE Autodesk Architecture 2025 sous windows 11 64 REVIT 24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal
Steven Posté(e) le 19 octobre 2019 Posté(e) le 19 octobre 2019 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.
(gile) Posté(e) le 20 octobre 2019 Posté(e) le 20 octobre 2019 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 - GitHub Développements sur mesure pour AutoCAD
PHILPHIL Posté(e) le 20 octobre 2019 Auteur Posté(e) le 20 octobre 2019 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 nomsuivant 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 FREELANCE Autodesk Architecture 2025 sous windows 11 64 REVIT 24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal
(gile) Posté(e) le 20 octobre 2019 Posté(e) le 20 octobre 2019 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 - GitHub Développements sur mesure pour AutoCAD
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant