JPhil Posté(e) le 11 octobre 2017 Posté(e) le 11 octobre 2017 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 :(
JPhil Posté(e) le 6 février 2019 Auteur Posté(e) le 6 février 2019 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 ?
lecrabe Posté(e) le 6 février 2019 Posté(e) le 6 février 2019 Hello Super de partager ... Neanmoins je te propose une excellente routine de notre Grand Maitre Francais GILLES !! Cette routine "ListBlock" genere un magnifique tableau quantitatif des Blocs AutoCAD ... Elle n'a qu'un seul defaut (A mon gout) : 1 - Elle ne traite pas les Blocs inclus dans les Reseaux associatifs 2012-201X ! 2 - Elle ne traite pas les INSERM de Blocshttp://help.autodesk.com/view/ACD/2016/FRA/?guid=GUID-A780A2FA-4A2E-4574-950F-E788AB71F527Mais tres tres peu de gens utilisent INSERM ... Si jamais GILLES passe "nous voir" et peut l'ameliorer !? Bye, lecrabe (LSP tiree de mon stock de 2000 routines) ;; ;; https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/lisp-table/m-p/7822698#M365879 ;; ;; Routine: ListBlock par GC ;; ;; Table des Blocs : Nom , Nombre , Graphisme du Bloc ;; ;; ;; Voir aussi ce sujet par GC : ;; https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/block-in-table/m-p/7827274#M366031 ;; ;; To be clearer, you can set the text height by row type: ;; Only data rows (bit 1) ;; (vla-SetTextHeight table 1 height) ;; Only title row (bit 2) ;; (vla-SetTextHeight table 2 height) ;; Only header row (bit 4) ;; (vla-SetTextHeight table 1 height) ;; You can also combinate this, e.g. for the entire table (+ 1 2 4): ;; (vla-SetTextHeight table 7 height) ;; ;;;;; ;;;;; Hauteur des Textes dans la Table = 5.0 ;;;;; ;;;;; (vla-SetTextHeight table 7 5.0) ;;;;; (defun c:ListBlock (/ ss name block blocks insPt table row) (vl-load-com) (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object))) ) (or *blocks* (setq *blocks* (vla-get-Blocks *acdoc*)) ) ;; Select blocks (prompt "\nSelect blocks to list or <All>") (or (setq ss (ssget '((0 . "INSERT")))) (setq ss (ssget "_X" '((0 . "INSERT"))) ) ) (if ss (progn ;; Build a list of dotted pairs (blockName . numberOfReferences) from the selection set (vlax-for x (setq ss (vla-get-ActiveSelectionSet *acdoc*)) (if (not (vlax-property-available-p x 'Path)) (setq name (vla-get-EffectiveName x) blocks (if (setq block (assoc name blocks)) (subst (cons name (1+ (cdr block))) block blocks) (cons (cons name 1) blocks) ) ) ) ) (vla-delete ss) ;; Prompt for insertion point (initget 1) (setq insPt (trans (getpoint "\nInsertion point: ") 1 0)) ;; Create the table (setq table (vla-addtable (vla-get-modelspace *acdoc*) (vlax-3d-point insPt) (+ 2 (length blocks)) ; number of rows (including title and header) 3 ; number of colums 20 ; cell height 80 ; row width ) ) (vla-put-VertCellMargin table 4.0) (vla-put-TitleSuppressed table :vlax-false) (vla-put-HeaderSuppressed table :vlax-false) ;; Fill the titel and the header ; (vla-setText table 0 0 "Blocks") ; (vla-setText table 1 0 "Name") ; (vla-setText table 1 1 "Count") ; (vla-setText table 1 2 "Symbol") ;; Textes version Francaise (vla-setText table 0 0 "Quantitatif des Blocs") (vla-setText table 1 0 "Nom") (vla-setText table 1 1 "Nombre") (vla-setText table 1 2 "Symbole") ;;;;; Hauteur des Textes dans la Table = 5.0 ;;;;; (vla-SetTextHeight table 7 5.0) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; fill the following rows from the list contents (setq row 2) (foreach item blocks (vla-settext table row 0 (car item)) ; block name (vla-settext table row 1 (cdr item)) ; references count (vla-SetBlockTableRecordId ; block symbol table row 2 (vla-get-ObjectId (vla-Item *blocks* (car item))) :vlax-true ) (setq row (1+ row)) ) ) ) (princ) ) Autodesk Expert Elite Team
philsogood Posté(e) le 7 février 2019 Posté(e) le 7 février 2019 hello,@lecrabe : c'est quoi INSERM??Phil Projeteur Revit Indépendant - traitement des eaux/CVC
JPhil Posté(e) le 7 février 2019 Auteur Posté(e) le 7 février 2019 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.
JPhil Posté(e) le 14 février 2019 Auteur Posté(e) le 14 février 2019 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
JPhil Posté(e) le 14 février 2019 Auteur Posté(e) le 14 février 2019 Hello Super de partager ... Neanmoins je te propose une excellente routine de notre Grand Maitre Francais GILLES !! Cette routine "ListBlock" genere un magnifique tableau quantitatif des Blocs AutoCAD ... Elle n'a qu'un seul defaut (A mon gout) : 1 - Elle ne traite pas les Blocs inclus dans les Reseaux associatifs 2012-201X ! 2 - Elle ne traite pas les INSERM de Blocshttp://help.autodesk.com/view/ACD/2016/FRA/?guid=GUID-A780A2FA-4A2E-4574-950F-E788AB71F527Mais tres tres peu de gens utilisent INSERM ... Si jamais GILLES passe "nous voir" et peut l'ameliorer !? Bye, lecrabe (LSP tiree de mon stock de 2000 routines) [...]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:
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