JPhil
Membres-
Compteur de contenus
207 -
Inscription
-
Dernière visite
-
Jours gagnés
6
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par JPhil
-
Création d'une légende d'un plan en Lisp...
JPhil a répondu à un(e) sujet de JPhil dans Pour aller plus loin en LISP
Testé à l'instant.Ressemble très fortement (au niveau résultat) à "TABLDYNBLOC". Concernant les défauts que tu évoques, difficile de répondre quand on n'y est pas confronter :unsure: -
Création d'une légende d'un plan en Lisp...
JPhil a répondu à un(e) sujet de JPhil dans Pour aller plus loin en LISP
Je viens de trouver une solution pour les blocs qui passent avec le Lisp de 2010 et qui passent pas avec le Lisp de 2019 -> refaire le bloc Je suis partie d'un bloc avec l'attribut "LEGENDE" qui fonctionne, et j'ai refait le dessin, et là ça fonctionne sans problème :D J'ai fait l'essai, juste avant, de copier l'attribut "LEGENDE" dans un bloc qui ne l'a pas, ben ça fonctionne pas <_< Merci aux intervenants :) Par contre pour des besoins plus pratique, je viens juste de renommer "TABLDYNBLOC" en "LGD". J'aurais dû le faire plus tôt dans mes phases de test :P -
Création d'une légende d'un plan en Lisp...
JPhil a répondu à un(e) sujet de JPhil dans Pour aller plus loin en LISP
Merci lecrabe. Je teste à l'occasion. Par contre une idée du pourquoi ces blocs là (dans cet exemple) ne contiennent pas "ATTDEF" alors qu'il y a réellement un attribut (voir plus) dedans ? "BLOCK" "L1-000" --- "LINE" "BLOCK" "L1-MT12" --- "ARC" "BLOCK" "L1-020G" --- "LINE" Y'a peut-être une erreur dans le code puisque ça fonctionne avec le lisp de 2010 :unsure: Si j'arrive un jour à franchir cette étape (qui pourra être utile même à mes collègues ARCHI), je pourrai passer à l'étape n°2 :) Faire des calculs de puissance en fonction de la zone, du couloir, du niveau, du type d'appareils, de la source (permanent/délestable) .... pour Caneco d'ALPI. -
Création d'une légende d'un plan en Lisp...
JPhil a répondu à un(e) sujet de JPhil dans Pour aller plus loin en LISP
Après une pause, je réponds en partie à moi-même. Le code : ;; TABLDYNBLOC ;; Crée un tableau qui liste les blocs sélectionnés (defun c:tabldynbloc (/ ss refs lst ele ins tbl row) (vl-load-com) (or *acad* (setq *acad* (vlax-get-acad-object))) (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*))) (or *blocks* (setq *blocks* (vla-get-Blocks *acdoc*))) (prompt "\nSélectionnez les blocs à lister ou ") (or (setq ss (ssget '((0 . "INSERT")))) (setq ss (ssget "_X" '((0 . "INSERT")))) ) (if ss (progn (vlax-for x (setq ss (vla-get-ActiveSelectionSet *acdoc*)) (or (vlax-property-available-p x 'Path) (setq refs (cons (list (cons (vla-get-EffectiveName x) (gc:GetVisibilityState x) ) (vla-get-Name x) ) refs ) ) ) ) (vla-delete ss) ) ) (foreach n refs (setq lst (if (setq ele (assoc (car n) lst)) (subst (list (car ele) (cadr ele) (1+ (caddr ele))) ele lst) (cons (list (car n) (cadr n) 1) lst) ) ) ) (initget 1) (setq ins (trans (getpoint "\nPoint d'insertion: ") 1 0)) (setq tbl (vla-addtable (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)) ) (vlax-3d-point ins) (+ 2 (length lst)) 4 20 ; Hauteur cellule 80 ; Largeur cellule ) ) (vla-put-VertCellMargin tbl 4.0) ; Marge verticale (vla-put-TitleSuppressed tbl :vlax-false) (vla-put-HeaderSuppressed tbl :vlax-false) (vla-setText tbl 0 0 "Légende") ; Titre (vla-setText tbl 1 0 "Nom") ; Titre colonne 1 (vla-setText tbl 1 1 "Nombre") ; Titre colonne 2 (vla-setText tbl 1 2 "Symbole") ; Titre colonne 3 (vla-setText tbl 1 3 "Désignation") ; Titre colonne 4 (setq row 2) (foreach b lst (setq tag "XXXXX") (if (= (cdr (assoc 0 (entget (cdr (assoc -2 (entget (tblobjname "BLOCK" (caar B))))) '("*")))) "ATTDEF") (if (= (cdr (assoc 2 (entget (cdr (assoc -2 (entget (tblobjname "BLOCK" (caar B))))) '("*")))) "LEGENDE") (setq tag (cdr (assoc 1 (entget (cdr (assoc -2 (entget (tblobjname "BLOCK" (caar B))))) '("*"))))) ) ) (vla-SetText tbl row 0 (if (cdar B) (strcat (caar B) " (" (cdar B) ")") (caar B) ) ) (vla-SetText tbl row 1 (caddr B)) (vla-SetBlockTableRecordId tbl row 2 (vla-get-ObjectId (vla-Item *blocks* (cadr B))) :vlax-true) (vla-SetText tbl row 3 tag) (vla-setcellalignment tbl row 0 5) (vla-setcellalignment tbl row 1 5) (vla-setcellalignment tbl row 3 4) (setq row (1+ row)) ) (princ) ) ;; gc:GetVisibilityState ;; Retourne l'état de visibilité d'un bloc dynamique ou nil (defun gc:GetVisibilityState (blk / state) (if (= (vla-get-IsDynamicblock blk) :vlax-true) (foreach p (vlax-invoke blk 'GetDynamicBlockProperties) (if (= (type (car (vlax-get p 'AllowedValues))) 'STR) (setq state (vlax-get p 'Value)) ) ) ) state ) Le résultat est que pour certains blocs, le programme m'affiche bien la valeur de l'attribut "LEGENDE" et pour les autres "XXXXX". "BLOCK" "L1-000" --- "XXXXX" "BLOCK" "L1-MT12" --- "XXXXX" "BLOCK" "L1-020G" --- "XXXXX" "BLOCK" "L1-020D" --- "Extrémité aveugle coté droit Type L1-020D" "BLOCK" "EBT-HP" --- "Haut Parleur montage en saillie" Quand je tape ma commande pour en savoir plus voici le résultat : Commande: (entget (cdr (assoc -2 (entget (tblobjname "BLOCK" "L1-000")))) '("*")) ((-1 . <Nom d'entité: 3f5e4420>) (0 . "LINE") (330 . <Nom d'entité: 3f5e4400>) (5 . "27A") (100 . "AcDbEntity") (67 . 0) (8 . "0") (100 . "AcDbLine") (10 -0.515811 0.19 0.0) (11 -0.600839 0.19 0.0) (210 0.0 0.0 1.0)) Commande: (entget (cdr (assoc -2 (entget (tblobjname "BLOCK" "L1-MT12")))) '("*")) ((-1 . <Nom d'entité: 3f5e4640>) (0 . "ARC") (330 . <Nom d'entité: 3f5e4610>) (5 . "29C") (100 . "AcDbEntity") (67 . 0) (8 . "0") (100 . "AcDbCircle") (10 0.3125 -0.04 0.0) (40 . 0.0193292) (210 0.0 0.0 1.0) (100 . "AcDbArc") (50 . 1.5708) (51 . 4.71239)) Commande: (entget (cdr (assoc -2 (entget (tblobjname "BLOCK" "L1-020G")))) '("*")) ((-1 . <Nom d'entité: 52849f70>) (0 . "LINE") (330 . <Nom d'entité: 52849f60>) (5 . "629CF") (100 . "AcDbEntity") (67 . 0) (8 . "0") (100 . "AcDbLine") (10 -0.0495 -0.25 0.0) (11 -0.0495 0.25 0.0) (210 0.0 0.0 1.0)) Commande: (entget (cdr (assoc -2 (entget (tblobjname "BLOCK" "L1-020D")))) '("*")) ((-1 . <Nom d'entité: 52bf0ea0>) (0 . "ATTDEF") (330 . <Nom d'entité: 52bf0e90>) (5 . "6285A") (100 . "AcDbEntity") (67 . 0) (8 . "0") (100 . "AcDbText") (10 -0.806469 -0.415743 0.0) (40 . 0.05) (1 . "Extrémité aveugle coté droit Type L1-020D") (50 . 0.0) (41 . 1.0) (51 . 0.0) (7 . "EE_SIMPLEX") (71 . 0) (72 . 1) (11 0.0375786 -0.415743 0.0) (210 0.0 0.0 1.0) (100 . "AcDbAttributeDefinition") (280 . 0) (3 . "LEGENDE") (2 . "LEGENDE") (70 . 9) (73 . 0) (74 . 0) (280 . 0)) Commande: (entget (cdr (assoc -2 (entget (tblobjname "BLOCK" "EBT-HP")))) '("*")) ((-1 . <Nom d'entité: 52846d70>) (0 . "ATTDEF") (330 . <Nom d'entité: 52846d60>) (5 . "62A27") (100 . "AcDbEntity") (67 . 0) (8 . "0") (100 . "AcDbText") (10 -0.615655 -0.171816 0.0) (40 . 0.05) (1 . "Haut Parleur montage en saillie") (50 . 0.0) (41 . 1.0) (51 . 0.0) (7 . "EE_SIMPLEX") (71 . 0) (72 . 1) (11 -0.00136891 -0.171816 0.0) (210 0.0 0.0 1.0) (100 . "AcDbAttributeDefinition") (280 . 0) (3 . "LEGENDE") (2 . "LEGENDE") (70 . 9) (73 . 0) (74 . 0) (280 . 0)) On voit que tous les blocs non pas la valeur "ATTDEF" alors qu'il y a bien un attribut "LEGENDE" dans chaque bloc avec sa valeur : "BLOCK" "L1-000" --- "Luminaire type L1-000" "BLOCK" "L1-MT12" --- "MODULE TECHNIQUE 6 DISJONCTEURS pour 12 appareils (9+3)" "BLOCK" "L1-020G" --- "Extrémité aveugle coté gauche Type L1-020G" "BLOCK" "L1-020D" --- "Extrémité aveugle coté droit Type L1-020D" "BLOCK" "EBT-HP" --- "Haut Parleur montage en saillie" Ce qui est étrange c'est qu'avec le lisp de 2010, avec plus ou moins la même commande j'arrive à avoir toutes les infos. Une idée du pourquoi du comment ? -
Merci. Pour Revit, je ne suis pas surpris, surtout pour la partie Elec de Revit MEP.
-
Création d'une légende d'un plan en Lisp...
JPhil a posté un sujet dans Pour aller plus loin en LISP
Bonjour, Je reprends un ancien Lisp (08/2010) en le mettant au goût du jour avec la fonction tableau. Le but étant de faire apparaître la quantité, le nom du bloc, le symbole et la désignation. Voici donc le Lisp de base : (defun c:LGD () (progn (setq len_l_attr 0) (setq lgd "LEGENDE") (setq lgdq (getstring "Corps d'état de la légende (si rien 'LEGENDE') ? : ")) (if (/= lgdq "") (setq lgd (strcat "LEGENDE" (strcase lgdq))) ) (setq lgdt (strcat "_LGD" lgdq ".txt")) (setq source (strcase (strcat (getvar "DWGPREFIX") (getvar "dwgname") lgdt))) (setq pt_plan (getpoint "\nPosition écriture paramètres plans (Coin haut gauche): ")) (setq htxt 2) (setq lg_pt1 (polar pt_plan (* 0.5 pi) (* 1.65 htxt))) (setq lg_pt3 lg_pt1) (command "_text" pt_plan htxt 0 "Qté") (command "_text" (polar pt_plan 0 (* 3 htxt)) htxt 0 "Symbole") (command "_text" (polar pt_plan 0 (* 10 htxt)) htxt 0 "Nom Bloc") (command "_text" (polar pt_plan 0 (* 20 htxt)) htxt 0 "Type d'Appareil") (setq pt_plan (polar pt_plan (* 1.5 pi) (* 3.3 htxt))) (setq f (open (strcat source) "W")) (setq a (tblnext "block" t)) (while a (progn (setq Bl_Data (cdr (assoc -2 a))) (while Bl_Data (if (= (cdr (assoc 0 (entget Bl_Data))) "ATTDEF") (if (= lgd (cdr (assoc 2 (entget Bl_Data)))) (progn (setq bb (cdr (assoc 2 a))) (setq l_Attr (cdr (assoc 1 (entget Bl_Data)))) (setq sel (ssget "x" (list (cons 2 bb)))) (setq nb 0) (setq nb (itoa (sslength sel))) (setq cc (strcat "Quantité : " nb " / Nom du Bloc : " bb " / Type d'Appareil : " l_attr)) (write-line cc f) (totolgd) (if (> (strlen l_attr) len_l_attr) (setq len_l_attr (strlen l_attr)) ) ) ) ) (setq Bl_Data (entnext Bl_Data)) ) ; fin de while ) ; fin de progn (setq a (tblnext "block")) ) ; fin de while du début (close f) (setq lg_pt4 (polar lg_pt3 0 (+ (* (+ 3 len_l_attr) htxt) (* 10 htxt)))) (setq lg_pt3b (polar lg_pt3 pi (* 1.65 htxt))) (setq lg_pt4b (polar lg_pt4 0 (* 1.65 htxt))) (command "_line" lg_pt3b lg_pt4b "") (command "_line" (polar lg_pt3b (* 1.5 pi) (* 3.0 htxt)) (polar lg_pt4b (* 1.5 pi) (* 3.0 htxt)) "") (setq lg_pt1 (polar pt_plan (* 0.5 pi) (* 1.65 htxt))) (setq lg_pt2 (polar lg_pt1 0 (+ (* (+ 3 len_l_attr) htxt) (* 10 htxt)))) (setq lg_pt1 (polar lg_pt1 pi (* 1.65 htxt))) (setq lg_pt2 (polar lg_pt2 0 (* 1.65 htxt))) (command "_line" lg_pt1 lg_pt2 "") (command "_line" lg_pt1 lg_pt3b "") (command "_line" lg_pt2 lg_pt4b "") ) ) (defun totolgd () (command "_text" pt_plan htxt 0 nb) ;;; (command "-attdef" "" (strcat "NB" bb) bb nb pt_plan htxt 0) (command "_text" (polar pt_plan 0 (* 10 htxt)) htxt 0 bb) (command "_text" (polar pt_plan 0 (* 20 htxt)) htxt 0 l_attr) (command "-inserer" bb (polar pt_plan 0 (* 6 htxt)) "5" "5" "0") (setq pt_plan (polar pt_plan (* 1.5 pi) (* 2.9 htxt))) ) Et le Lisp plus évolué que j'ai trouvé sur ce forum : ;; TABLDYNBLOC ;; Crée un tableau qui liste les blocs sélectionnés (defun c:tabldynbloc (/ ss refs lst ele ins tbl row) (vl-load-com) (or *acad* (setq *acad* (vlax-get-acad-object))) (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*))) (or *blocks* (setq *blocks* (vla-get-Blocks *acdoc*))) (prompt "\nSélectionnez les blocs à lister ou ") (or (setq ss (ssget '((0 . "INSERT")))) (setq ss (ssget "_X" '((0 . "INSERT")))) ) (if ss (progn (vlax-for x (setq ss (vla-get-ActiveSelectionSet *acdoc*)) (or (vlax-property-available-p x 'Path) (setq refs (cons (list (cons (vla-get-EffectiveName x) (gc:GetVisibilityState x) ) (vla-get-Name x) ) refs ) ) ) ) (vla-delete ss) ) ) (foreach n refs (setq lst (if (setq ele (assoc (car n) lst)) (subst (list (car ele) (cadr ele) (1+ (caddr ele))) ele lst) (cons (list (car n) (cadr n) 1) lst) ) ) ) (initget 1) (setq ins (trans (getpoint "\nPoint d'insertion: ") 1 0)) (setq tbl (vla-addtable (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)) ) (vlax-3d-point ins) (+ 2 (length lst)) 4 20 ; Hauteur cellule 80 ; Largeur cellule ) ) (vla-put-VertCellMargin tbl 4.0) ; Marge verticale (vla-put-TitleSuppressed tbl :vlax-false) (vla-put-HeaderSuppressed tbl :vlax-false) (vla-setText tbl 0 0 "Légende") ; Titre (vla-setText tbl 1 0 "Nom") ; Titre colonne 1 (vla-setText tbl 1 1 "Nombre") ; Titre colonne 2 (vla-setText tbl 1 2 "Symbole") ; Titre colonne 3 (vla-setText tbl 1 3 "Désignation") ; Titre colonne 4 (setq row 2) (foreach b lst (vla-SetText tbl row 0 (if (cdar B) (strcat (caar B) " (" (cdar B) ")") (caar B) ) ) (vla-SetText tbl row 1 (caddr B)) (vla-SetBlockTableRecordId tbl row 2 (vla-get-ObjectId (vla-Item *blocks* (cadr B))) :vlax-true) (vla-SetText tbl row 3 "LEGENDE") (vla-setcellalignment tbl row 0 5) (vla-setcellalignment tbl row 1 5) (vla-setcellalignment tbl row 3 4) (setq row (1+ row)) ) (princ) ) ;; gc:GetVisibilityState ;; Retourne l'état de visibilité d'un bloc dynamique ou nil (defun gc:GetVisibilityState (blk / state) (if (= (vla-get-IsDynamicblock blk) :vlax-true) (foreach p (vlax-invoke blk 'GetDynamicBlockProperties) (if (= (type (car (vlax-get p 'AllowedValues))) 'STR) (setq state (vlax-get p 'Value)) ) ) ) state ) Je coince dessus (vla-SetText tbl row 3 "LEGENDE"). Je n'arrive pas à reproduire ce que j'avais fait dans l'ancien Lisp. L'idée étant d'y mettre le contenu (texte) de l'attribut "LEGENDE" des blocs. Sachant que tous les blocs n'ont pas nécessairement cet attribut, je souhaiterai qu'un point "." s'affiche dans ce cas là. Sinon, pour le reste j'en suis plutôt content car plus souple que ce que j'avais en tête à ce moment là. Mais là je donne ma langue au chat :( -
Bonjour, 38 ans. Utilisateur d'AutoCAD (classique) depuis 2002, Revit MEP depuis 2015. Quelques Lisps à mon actif mais sans vraiment bien maitriser le langage. Je m'inscris donc pour obtenir des réponses à mes questions.
