Aller au contenu

Messages recommandés

Posté(e)

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

Posté(e)

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

Posté(e)

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.

 

Posté(e)

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 :

image.png.aa12d9cead8cfdf0f2fef7d247ac5eb4.png

(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

Posté(e)

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

Posté(e)

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 :

image.thumb.png.5ee3c8d2d144e99ff6c5eccc10a0f2d5.png

Posté(e)
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

Posté(e)

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

 

image.png.072078d98372e2644e4e3cedd02e15f8.png

 

Posté(e)

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.

Posté(e)

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.

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

image.thumb.png.e0774b50b6153a86aa524554295d1fbb.png

 

 

Posté(e)
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

Posté(e)
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

Posté(e)
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 :

image.png.56eafd7e920067fceffa69eabed3dc5d.png

Posté(e)
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

Posté(e)

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. 

 

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é