Lewel Posté(e) le 28 novembre Posté(e) le 28 novembre Bonjour, Etant tout nouveau sur ce forum mais également dans le domaine des LISP, j'espère m'exprimer comme il se doit. J'ai pour projet d'améliorer certaines tâches dans un but de gain de temps lors de la création de plans. Cela serait notamment possible en réalisant une liste de débit qui utiliserait une zone de sélection au préalable afin d'ériger un tableau reprenant : Le nom du bloc (original) Sa quantité Sa section (autrement nommé en intégrant quelle visibilité est utilisée) Sa longueur (représentée dans les blocs dynamiques par le paramètre de distance nommé "L") Je vous joins mon .dwg test, ainsi que le fichier LISP utilisé afin de réaliser cette liste de débit. Mon soucis étant : à l'heure actuelle, mon fichier LISP reste incomplet concernant la récupération du paramètre "L" afin de l'intégrer dans la colonne "Longueur en mm)" du tableau créé. Sauriez-vous quels éléments apporter au fichier LISP afin de mener à bien ce projet ? Vous remerciant en tout bien tout honneur pour le temps accordé à ma question, Un total néophyte Test liste de débit.dwg QSD.lsp
(gile) Posté(e) le 28 novembre Posté(e) le 28 novembre Salut, Essaye comme ça : (defun c:QSD (/ ss props data prop blocks found 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 "\nSélectionner le(s) bloc(s) ou Entrée pour tous") (or (setq ss (ssget '((0 . "INSERT")))) (setq ss (ssget "_X" '((0 . "INSERT"))) ) ) (if ss (progn ;; Build a list of sub-lists (numberOfReferences blockName section length) from the selection set (vlax-for x (setq ss (vla-get-ActiveSelectionSet *acdoc*)) (if (not (vlax-property-available-p x 'Path)) (setq props (mapcar '(lambda (p) (cons (vlax-get p 'propertyname) (vlax-get p 'value))) (vlax-invoke x 'GetDynamicBlockProperties) ) data (list (vla-get-EffectiveName x) (if (setq prop (assoc "Section" props)) (cdr prop) "" ) (if (setq prop (assoc "L" props)) (cdr prop) "" ) ) blocks (if (setq found (vl-some '(lambda (l) (if (equal (cdr l) data) l ) ) blocks ) ) (subst (cons (1+ (car found)) data) found blocks) (cons (cons 1 data) blocks) ) ) ) ) (vla-delete ss) ;; Prompt for insertion point (initget 1) (setq insPt (trans (getpoint "\nPoint d'insertion: ") 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) 4 ;_ number of colums 100 ;_ cell height 800 ;_ row width ) ) (vla-put-VertCellMargin table 4.0) (vla-put-TitleSuppressed table :vlax-false) (vla-put-HeaderSuppressed table :vlax-false)_ ;; Textes version Francaise (vla-setText table 0 0 "Liste de débit") (vla-setText table 1 0 "Nom") (vla-setText table 1 1 "Quantité") (vla-setText table 1 2 "Section") (vla-setText table 1 3 "Longueur (en mm)") (vla-SetTextHeight table 7 50.0) ;; fill the following rows from the list contents (setq row 2) (foreach item blocks (vla-settext table row 0 (cadr item)) (vla-settext table row 1 (car item)) (vla-settext table row 2 (caddr item)) (vla-settext table row 3 (cadddr item)) (setq row (1+ row)) ) ) ) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Lewel Posté(e) le 28 novembre Auteur Posté(e) le 28 novembre Rien à redire, la LISP tourne parfaitement ! Un incroyable merci Gile ! Vous souhaitant à tous une bonne journées/soirée et en espérant que cette LISP pourra être utile à d'autres.
Lewel Posté(e) le 6 décembre Auteur Posté(e) le 6 décembre Bonjour, Après avoir récolté quelques retours sur l'exploitation du tableau, sauriez-vous comment ajouter les éléments suivants au fichier LISP en PJ ? Trier par "Section" les éléments dans le tableau En ajoutant un code couleur par "Section" : En couleurs vraies : 145x45 : 220,218,218 120x45 : 221,179,212 95x45 : 173,221,247 45x45 : 173,221,247 27x45 : 206,204,230 22x45 : 243,169,134 Trier la colonne "Longueur (en mm)" du plus grand au plus petit Voir exemple ci-dessous : (J'en demande sûrement beaucoup et j'en suis navré, l'objectif étant de montrer à quel point le codage LISP est pratique pour négocier une formation dessus) A voir si c'est réalisable, je vous remercie par avance pour vos retours, bonne journée à vous ! QSD.lsp
(gile) Posté(e) le 8 décembre Posté(e) le 8 décembre Salut, Essaye comme ça. (defun c:QSD (/ ss props data prop blocks found insPt colors color rgb table row) (vl-load-com) (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object))) ) (or *blocks* (setq *blocks* (vla-get-Blocks *acdoc*)) ) ;; Sélectionner les blocs (prompt "\nSélectionner le(s) bloc(s) ou Entrée pour tous") (or (setq ss (ssget '((0 . "INSERT")))) (setq ss (ssget "_X" '((0 . "INSERT"))) ) ) (if ss (progn ;; Créer une liste avec des en-têtes (numberOfReferences blockName section length) de la sélection précédente (vlax-for x (setq ss (vla-get-ActiveSelectionSet *acdoc*)) (if (not (vlax-property-available-p x 'Path)) (setq props (mapcar '(lambda (p) (cons (vlax-get p 'propertyname) (vlax-get p 'value))) (vlax-invoke x 'GetDynamicBlockProperties) ) data (list (vla-get-EffectiveName x) (if (setq prop (assoc "Section" props)) (cdr prop) "" ) (if (setq prop (assoc "L" props)) (cdr prop) "" ) ) blocks (if (setq found (vl-some '(lambda (l) (if (equal (cdr l) data) l ) ) blocks ) ) (subst (cons (1+ (car found)) data) found blocks) (cons (cons 1 data) blocks) ) ) ) ) (vla-delete ss) ;; tri des blocs collectés (setq blocks (vl-sort blocks '(lambda (a b) (if (= (caddr a) (caddr b)) (< (cadddr b) (cadddr a)) (< (caddr a) (caddr b)) ) ) ) ) ;; Texte du point d'insertion (initget 1) (setq insPt (trans (getpoint "\nPoint d'insertion: ") 1 0)) ;; couleurs (setq colors '(("145x45" 220 218 218) ("120x45" 221 179 212) ("95x45" 173 221 247) ("45x45" 173 221 247) ("27x45" 206 204 230) ("22x45" 243 169 134) ) ) (setq color (vlax-create-object (strcat "AutoCAD.AcCmColor." (substr (getvar "ACADVER") 1 2) ) ) ) ;; Créer la liste (setq table (vla-addtable (vla-get-modelspace *acdoc*) (vlax-3d-point insPt) (+ 2 (length blocks)) ;_ Nombre de rangées (Comprend Titre et En-têtes) 4 ;_ Nombre de colonne 125 ;_ Hauteur de cellule 500 ;_ largeur de cellule ) ) (vla-put-VertCellMargin table 4.0) (vla-put-TitleSuppressed table :vlax-false) (vla-put-HeaderSuppressed table :vlax-false) ;; Textes (vla-setText table 0 0 "Liste de débit") (vla-setText table 1 0 "Nom") (vla-setText table 1 1 "Quantité") (vla-setText table 1 2 "Section") (vla-setText table 1 3 "Longueur (en mm)") (vla-SetTextHeight table 7 50.0) ;; Remplit les lignes suivantes à partir du contenu de la liste (setq row 2) (foreach item blocks (vla-settext table row 0 (cadr item)) (vla-settext table row 1 (car item)) (vla-settext table row 2 (caddr item)) (if (setq rgb (assoc (caddr item) colors)) (progn (vla-SetRgb color (cadr rgb) (caddr rgb) (cadddr rgb)) (vla-setCellBackgroundColor table row 2 color) ) ) (vla-settext table row 3 (cadddr item)) (setq row (1+ row)) ) ) ) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Lewel Posté(e) le 9 décembre Auteur Posté(e) le 9 décembre Bonjour Gile, Je te remercie pour ce retour, je ne comprends pas vraiment pourquoi la commande ne sélectionne plus l'ensemble des différentes sections etc... Voici ce qu'il en ressort, tableau à droite issue de la sélection des blocs dynamiques en vert et bleu à gauche :
(gile) Posté(e) le 9 décembre Posté(e) le 9 décembre il y a 55 minutes, Lewel a dit : je ne comprends pas vraiment pourquoi la commande ne sélectionne plus l'ensemble des différentes sections etc... Voici ce qu'il en ressort, tableau à droite issue de la sélection des blocs dynamiques en vert et bleu à gauche : Il m'est impossible de répondre sans pouvoir tester avec le DWG concerné. Ça fonctionne avec le fichier "Liste de debit.dwg" joint dans le premier message. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Lewel Posté(e) lundi à 12:58 Auteur Posté(e) lundi à 12:58 Navré pour ce retour tardif, j'utilise pourtant toujours le fichier joint au début du fil de la conversation. La seule modification est que j'ai "bougé" et copié plusieurs fois dans des formes différents le bloc déjà présent dans le fichier .dwg pour voir ce qu'il en résultait. Dans le doute, en utilisant le fichier .dwg initial (sans modifications) + le .lsp corrigé, j'ai bel et bien ce résultat : -> En jaune, la première version du fichier .lsp -> En orange, la seconde version du fichier .lsp
(gile) Posté(e) lundi à 15:14 Posté(e) lundi à 15:14 Ce que j'ai (et que tu devrais avoir) avec le code ci-dessus. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Lewel Posté(e) mardi à 09:26 Auteur Posté(e) mardi à 09:26 Si seulement ... J'ai beau ré essayer dans tous les sens, même en allant sur le poste d'un collègue et en refaisant la manipulation pour implanter le lisp dans son autocad, je ne comprends pas pourquoi ça ne fonctionne pas ... (C'est un cri du coeur, je désespère un peu) Je ne pense pas m'y être mal pris pour re charger le .lsp corrigé dans le fichier concerné par cette liste de débit créée pourtant.
(gile) Posté(e) mardi à 14:29 Posté(e) mardi à 14:29 Le fichier QSD.zip téléchargeable en cliquant sur >ce lien< contient un screencast (QSD.mp4) qui a été réalisé avec le fichier QSD.lsp contenu dans ce même zip. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Lewel Posté(e) mardi à 14:58 Auteur Posté(e) mardi à 14:58 Je m'excuse, mais je ne comprends pas la dernière réponse ...
(gile) Posté(e) mardi à 15:31 Posté(e) mardi à 15:31 J'ai modifié le message ci-dessus. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Lewel Posté(e) mercredi à 08:17 Auteur Posté(e) mercredi à 08:17 Je t'ai également fait une vidéo, dis moi si j'ai fais quelque chose de la mauvaise manière, je ne comprends vraiment pas. 09-15-32-1.mp4 En utilisant sur plusieurs cas la première version du fichier, serait-il possible de prendre les valeurs des données "L" au 0, car même si le bloc est bien renseigné avec un longueur de 5730mm dans cet exemple comme nous pouvons le voir dans l'onglet propriété, le tableau renseigne une valeur bien plus "précise" mais là encore je ne comprends pas vraiment d'où cette valeur sort :
(gile) Posté(e) mercredi à 10:09 Posté(e) mercredi à 10:09 Il y a 1 heure, Lewel a dit : Je t'ai également fait une vidéo, dis moi si j'ai fais quelque chose de la mauvaise manière, je ne comprends vraiment pas. On aperçoit dans la vidéo le message d'erreur dans la ligne de commande : "; erreur: type d'argument incorrect: VLA-OBJECT nil". Tu aurais dû commencer par signaler ça. Il semble qu'il y ait un problème avec la version d'AutoCAD et l'interface AcCmColor. Quelle version d'AutoCAD utilises-tu ? Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) mercredi à 10:17 Posté(e) mercredi à 10:17 Il y a 1 heure, Lewel a dit : En utilisant sur plusieurs cas la première version du fichier, serait-il possible de prendre les valeurs des données "L" au 0, car même si le bloc est bien renseigné avec un longueur de 5730mm dans cet exemple comme nous pouvons le voir dans l'onglet propriété, le tableau renseigne une valeur bien plus "précise" mais là encore je ne comprends pas vraiment d'où cette valeur sort Remplace : (vla-settext table row 3 (cadddr item)) par (vla-settext table row 3 (rtos (cadddr item) 2 0)) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Lewel Posté(e) mercredi à 10:52 Auteur Posté(e) mercredi à 10:52 il y a 37 minutes, (gile) a dit : On aperçoit dans la vidéo le message d'erreur dans la ligne de commande : "; erreur: type d'argument incorrect: VLA-OBJECT nil". Tu aurais dû commencer par signaler ça. Il semble qu'il y ait un problème avec la version d'AutoCAD et l'interface AcCmColor. Quelle version d'AutoCAD utilises-tu ? Mea culpa, effectivement, c'est la version d'AutoCAD LT 2025, désolé. il y a 30 minutes, (gile) a dit : Remplace : (vla-settext table row 3 (cadddr item)) par (vla-settext table row 3 (rtos (cadddr item) 2 0)) C'est fait, en utilisant la première version du .lsp que tu m'avais donné, les données affichées sont bien au 0 :
(gile) Posté(e) mercredi à 13:20 Posté(e) mercredi à 13:20 Il y a 2 heures, Lewel a dit : Mea culpa, effectivement, c'est la version d'AutoCAD LT 2025, désolé. Avec une LT, en LISP, on ne peut pas attribuer de couleur (de fond ou de contenu) aux cellules d'un tableau. Une version qui ne joue pas avec les couleurs mais groupe les débits par section et trie les longueurs en ordre décroissant. (defun c:QSD (/ ss props data prop blocks found 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*)) ) ;; Sélectionner les blocs (prompt "\nSélectionner le(s) bloc(s) ou Entrée pour tous") (or (setq ss (ssget '((0 . "INSERT")))) (setq ss (ssget "_X" '((0 . "INSERT"))) ) ) (if ss (progn ;; Créer une liste avec des en-têtes (numberOfReferences blockName section length) de la sélection précédente (vlax-for x (setq ss (vla-get-ActiveSelectionSet *acdoc*)) (if (not (vlax-property-available-p x 'Path)) (setq props (mapcar '(lambda (p) (cons (vlax-get p 'propertyname) (vlax-get p 'value))) (vlax-invoke x 'GetDynamicBlockProperties) ) data (list (vla-get-EffectiveName x) (if (setq prop (assoc "Section" props)) (cdr prop) "" ) (if (setq prop (assoc "L" props)) (rtos (cdr prop) 2 0) "" ) ) blocks (if (setq found (vl-some '(lambda (l) (if (equal (cdr l) data) l ) ) blocks ) ) (subst (cons (1+ (car found)) data) found blocks) (cons (cons 1 data) blocks) ) ) ) ) (vla-delete ss) ;; tri des blocs collectés (setq blocks (vl-sort blocks '(lambda (a b) (if (= (caddr a) (caddr b)) (< (cadddr b) (cadddr a)) (< (caddr a) (caddr b)) ) ) ) ) ;; Texte du point d'insertion (initget 1) (setq insPt (trans (getpoint "\nPoint d'insertion: ") 1 0)) ;; Créer la liste (setq table (vla-addtable (vla-get-modelspace *acdoc*) (vlax-3d-point insPt) (+ 2 (length blocks)) ;_ Nombre de rangées (Comprend Titre et En-têtes) 4 ;_ Nombre de colonne 125 ;_ Hauteur de cellule 500 ;_ largeur de cellule ) ) (vla-put-VertCellMargin table 4.0) (vla-put-TitleSuppressed table :vlax-false) (vla-put-HeaderSuppressed table :vlax-false) ;; Textes (vla-setText table 0 0 "Liste de débit") (vla-setText table 1 0 "Nom") (vla-setText table 1 1 "Quantité") (vla-setText table 1 2 "Section") (vla-setText table 1 3 "Longueur (en mm)") (vla-SetTextHeight table 7 50.0) ;; Remplit les lignes suivantes à partir du contenu de la liste (setq row 2) (foreach item blocks (vla-settext table row 0 (cadr item)) (vla-settext table row 1 (car item)) (vla-settext table row 2 (caddr item)) (vla-settext table row 3 (cadddr item)) (setq row (1+ row)) ) ) ) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Lewel Posté(e) mercredi à 16:44 Auteur Posté(e) mercredi à 16:44 Ah ... Que de tristesse, il n'y a aucun moyen de contourner cette lacune de la version LT j'imagine ? Encore une fois, merci Gile, pour la patience et l'investissement, le Lisp ci-dessus fonctionne parfaitement avec les fonctions décrites.
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