Aller au contenu

LISP pour récupérer dans un texte la surface d'une polyligne


Messages recommandés

Posté(e)

Bonjour,

 

Mes tribulations professionnelles m'ont tenu éloigné d'AutoCad. J'y reviens en ce moment, avec plaisir, mais j'ai un peu perdu la main et le logiciel a continué à évoluer.

J'ai besoin d'obtenir dans un attribut la surface d'une polyligne déjà dessinée.

Ou plutôt, j'ai besoin de faire cette opération un grand nombre de fois, car il s'agit d'obtenir les surfaces de chaque logement dans un plan (et à terme, la surface de chaque pièce de chaque logement), et ceci pour plusieurs plans de niveau.

J'ai ressorti mes vieux LISP qui faisaient ça, mais ils ne fonctionnent plus dans les versions que j'utilise (ACAD 2015 et 2020 selon les postes de travail).

J'ai cherché sur le site mais je ne trouve pas exactement ce que je cherche, càd juste un LISP que je lance pour chaque polyligne pour lui associer un attribut où figurera la surface, sans avoir à redessiner chaque polyligne, ou à régler à chaque fois les paramètres d'un champ (je dessine en cm et je veux afficher les surfaces en m²).

 

Quelqu'un pourrait-il m'aider ? Merci !!!

  • Réponses 55
  • Créé
  • Dernière réponse

Meilleurs contributeurs dans ce sujet

Meilleurs contributeurs dans ce sujet

Posté(e)

Salut,

Lel isp TotalArea de Gile devrait faire ton bonheur. Il fonctionne sur les versions 2015 et 2020.

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.

Posté(e)

juste un LISP que je lance pour chaque polyligne pour lui associer un attribut où figurera la surface, sans avoir à redessiner chaque polyligne, ou à régler à chaque fois les paramètres d'un champ (je dessine en cm et je veux afficher les surfaces en m²).

 

Ce que je peux te proposer écrit automatiquement un champ dynamique (lié à la polyligne ou autre objet fermé)

(vl-load-com)
(defun c:surf_curve-closed ( / AcDoc Space js nw_obj ename ent_text dxf_ent key)
 (setq
AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))
Space
(if (= 1 (getvar "CVPORT"))
 	(vla-get-PaperSpace AcDoc)
 	(vla-get-ModelSpace AcDoc)
)
 )
 (princ "\nSélectionnez un objet fermé")
 (while
(setq js
 	(ssget "_+.:E:S"
   	'(
     	(-4 . "<OR")
       	(-4 . "<AND")
         	(0 . "*POLYLINE")
         	(-4 . "<AND")
           	(-4 . "<NOT") (-4 . "&") (70 . 120) (-4 . "NOT>")
           	(-4 . "&") (70 . 1)
         	(-4 . "AND>")
       	(-4 . "AND>")
       	(0 . "CIRCLE")
       	(-4 . "<AND")
         	(0 . "SPLINE")
         	(-4 . "&") (70 . 1)
       	(-4 . "AND>")
       	(-4 . "<AND")
         	(0 . "ELLIPSE")
         	(41 . 0.0)
         	(42 . 6.283185307179586)
       	(-4 . "AND>")
     	(-4 . "OR>")
   	)
 	)
)
(if (zerop (getvar "USERR1")) (setvar "USERR1" (/ (getvar "VIEWSIZE") 75.0)))
(setq nw_obj
 	(vla-addMtext Space
   	(vlax-3d-point (trans (getvar "VIEWCTR") 1 0))
   	0.0
   	(strcat "S="(rtos (vlax-get-property (setq ename (vlax-ename->vla-object (ssname js 0))) "Area") 2 2) "m²")
 	)
)
(mapcar
 	'(lambda (pr val)
   	(vlax-put nw_obj pr val)
 	)
 	(list 'AttachmentPoint 'Height 'DrawingDirection 'StyleName 'Layer 'Rotation 'BackgroundFill 'Color)
 	(list 1 (getvar "USERR1") 5 (getvar "TEXTSTYLE") (getvar "CLAYER") 0.0 -1 250)
)
(setq
 	ent_text (entlast)
 	dxf_ent (entget ent_text)
 	dxf_ent (subst (cons 90 1) (assoc 90 dxf_ent) dxf_ent)
 	dxf_ent (subst (cons 63 255) (assoc 63 dxf_ent) dxf_ent)
)
(entmod dxf_ent)
(while (and (setq key (grread T 4 0)) (/= (car key) 3))
 	(cond
   	((eq (car key) 5)
     	(setq dxf_ent (subst (cons 10 (trans (cadr key) 1 0)) (assoc 10 dxf_ent) dxf_ent))
     	(entmod dxf_ent)
   	)
 	)
)
(vlax-put
 	(vlax-ename->vla-object (entlast))
 	'TextString
 	(strcat
   	"{\\fArial|b0|i0|c0|p34;"
   	"%<\\AcObjProp.16.2 Object(%<\\_ObjId "
   	(itoa (vla-get-ObjectID ename))
   	">%).Area \\f \"%lu2%pr2%ps[s=,"
   	"m²]\">%"
 	)
)
 )
 (prin1)
)

 

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Coucou

 

Si on parle de superficie de logement il va falloir gérer des "trous" à soustraire de l'aire de la polyligne extérieure

Dans ce cas de figure comment faire ?

 

Amicalement

 

Bonjour,

 

Merci pour ta réponse,

 

Pour l'instant, mes plans en sont à l'esquisse : une polyligne me suffit.

Au pire, si je dois vraiment gérer des "trous" (par exemple pour une trémie d'escalier au niveau haut d'un duplex), je peux faire le contour de la trémie et le rattacher au contour principal par un petit "couloir" d'1 ou 2 cm de large) – technique éprouvée et sans incidence sur le résultat final.

Posté(e)

Salut,

Lel isp TotalArea de Gile devrait faire ton bonheur. Il fonctionne sur les versions 2015 et 2020.

 

Bonjour,

 

Merci pour le tuyau. Effectivement, ça fait très bien le job (moyennant un petit temps de prise en main).

 

 

J'ai juste un souci d'implémentation.

Habituellement, lorsque je veux utiliser un nouveau LISP, je le colle à la fin d'un fichier unique qui les rassemble tous, pour éviter d'avoir une multitude de petits fichiers LISP à charger.

Mais avec celui-là, ça ne marche pas. Je dois le charger à part.

Tu aurais une explication ?

 

 

Merci en tous cas.

Posté(e)

Ce que je peux te proposer écrit automatiquement un champ dynamique (lié à la polyligne ou autre objet fermé)

 

Bonjour,

 

Merci pour ta réponse et l'effort que tu as fait pour écrire le LISP.

En fait, le LISP de Gile indiqué par Steven me convient bien.

J'ai quand même testé le tien. Pour une raison que j'ignore (limitation d'AutoCad ou paramètrage inconnu de moi) le champ ne se met pas à jour dès qu'on modifie la polyligne, je dois faire un REGEN.

De même, il faut bidouiller le format du champ et j'ai un peu oublié avec les années...

Donc pour l'instant j'en reste au LISP de Gile.

Mais merci encore.

Posté(e)

J'ai juste un souci d'implémentation.

Habituellement, lorsque je veux utiliser un nouveau LISP, je le colle à la fin d'un fichier unique qui les rassemble tous, pour éviter d'avoir une multitude de petits fichiers LISP à charger.

Mais avec celui-là, ça ne marche pas. Je dois le charger à part.

Tu aurais une explication ?

Si tu colles bien tout le contenu du fichier (qui contient plusieurs routines), tu ne devrais pas avoir de souci.

 

Pour une raison que j'ignore (limitation d'AutoCad ou paramètrage inconnu de moi) le champ ne se met pas à jour dès qu'on modifie la polyligne, je dois faire un REGEN.

C'est le fonctionnement normal des champs avec AutoCAD.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Comme les REGIONS sont des objets trop complexes à analyser, j'avais écrit ce Ch'Ti programme :

 

(setvar "CMDECHO" 1)

(defun c:surf()

(cond

( (= (getvar "INSUNITS") 4) (setq unite 1000000 ) )

( (= (getvar "INSUNITS") 5) (setq unite 10000 ) )

( (= (getvar "INSUNITS") 6) (setq unite 1 ) )

( (= (getvar "INSUNITS") 0) (prompt "\nDessin SANS UNITES !!! Il faut corriger les unités...") (exit) )

);cond

 

(command "_VIEW" "_SA" "VUE_ORG_SURF")

(prompt "\Sélectionner les objets pour le calcul de surface...")

(setq ENT (ssget)

NUM 0

);setq

 

(if ENT

(setq OBJ (ssname ENT NUM) )

);if

 

(while OBJ

(command "_zoom" "_OB" OBJ "")

(command "_AREA" "_OB" OBJ)

(setq SURF (/ (getvar "AREA") UNITE)

CENTRE (getvar "VIEWCTR")

);setq

(command "_-TEXT" "_J" "_C" CENTRE 0.0 (strcat (rtos SURF 2 2) " m²") )

(setq NUM (+ NUM 1)

OBJ (ssname ENT NUM)

);setq

);while

 

(command "_VIEW" "_RE" "VUE_ORG_SURF")

(princ)

);defun

;;; ----------------------------

(defun *error*(err)

(princ)

);defun

;;; --------------------- fin prog -------------------------------------------

(prompt "\nTaper SURF pour inscrire la surface au centre des OBJETS sélectionnés...")

(princ)

 

Il suffira d'adapter la création du texte par l'insertion d'un bloc + ATTRIBUTS... Voici le fichier source...

 

Christian

Formateur, Consultant Expert AutoCAD, REVIT MEP, INVENTOR, télécharger , des Outils AutoCAD...

cad123 @ wanadoo.fr (enlever les espaces de part et d'autre de @)

Posté(e)

Pas mail, ton lisp, Christian smile.gif

Il fait comme TotalArea mais sous forme de texte.

Le soucis avec les régions, c'est qu'elles sont figées et on ne peut pas les modifier en cas de modification de superficie sad.gif

Il faudrait une région modifiable comme les espaces sur AutoCAD Architecture quand ils sont fait en polygone.

 

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.

Posté(e)

Steven, j'utilise très souvent les REGIONS...

 

La méthode de travail est différente ! Jamais on ne décomposera une REGION, il faut utiliser les commandes UNION et SOUSTRACTION... et plus rarement INTERSECTION...

 

Christian

 

 

Formateur, Consultant Expert AutoCAD, REVIT MEP, INVENTOR, télécharger , des Outils AutoCAD...

cad123 @ wanadoo.fr (enlever les espaces de part et d'autre de @)

  • 1 an après...
Posté(e)

Bonjour à la communauté.

Je cherche à faire un peu la même chose. Mais juste cliquer une polyligne pour n'avoir que sa surface... 

J'ai vu le super truc qu'à fait (gile) avec TotalArea, mais je n'ai pas besoin de tant. Je ne sélectionne qu'une et unique polyligne à la fois et n'ai pas besoin de bloc, juste un texte unique.

J'ai commencé un code que je ne posterais pas, car encore à l'état de brouillon...

Si quelqu'un à la solution de récupérer l'aire d'une polyligne après sa sélection, je suis preneur.

Bonne soirée à toutes et à tous.

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Salut,

En vla, tu fais un vlax-dump-object et tu regardes si une des propriétés correspond à ce que tu cherches, tu utilises ensuite cette propriété avec :
(vlax-get vla-obj "NomDeLaPropriete") ou (vla-get-NomDeLaPropriete vla-obj).

En "our AutoLISP", tu fais un dumpallproperties et tu regardes si une des propriétés correspond à ce que tu cherches, tu utilises ensuite cette propriété avec :
(getpropertyvalue ename
"NomDeLaPropriete").

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Bonjour (gile) et merci pour ton aide.

J'ai essayé plusieurs trucs mais je n'obtient rien. Je te mets le détail de mes essais, je ne vois pas où je me trompe :

  (setq ename (car (entsel "\nSelectionner un contour : ")))
  (princ "\nAire=")
  (princ (vla-get-area ename))
  (princ (vlax-get ename "area"))
  (princ (getpropertyvalue ename "area"))

Je n'ai aucune réponse, même pas un nil...

Je vais chercher une autre solution si je n'y arrive pas.

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

L'argument pour les fonctions vla ou vlax doit-être de type vla-object et pas de type ename.

Les noms des propriétés sont sensibles à la casse "area" est différent de "Area".

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

J'ai donc essayé de faire de ma sélection un objet vla, mais je ne sais pas si j'ai bien compris le truc :

  (setq ename (car (entsel "\nSelectionner un contour : ")))
  (setq aire (vlax-get-property (vlax-ename-> vla-object ename) 'area))
  (princ "\nAire=")
  (princ aire)

Mais j'ai le même résultat, rien...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

J'ai dit une bêtise, les noms des propriétés ne sont pas sensibles à la casse.

10 minutes ago, DenisHen said:

  (setq ename (car (entsel "\nSelectionner un contour : ")))
  (setq aire (vlax-get-property (vlax-ename-> vla-object ename) 'area))
  (princ "\nAire=")
  (princ aire)

Mais j'ai le même résultat, rien...

Comment fais-tu tes essais, en ligne commande ou dans la console de l'éditeur Visual LISP ?

Que vois-tu quand tu fais : (setq ename (car (entsel "\nSélectionner un coutour : "))) ?

 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Je fais mes testes généralement après le chargement du Lisp dans AutoCAD, de cette façon, la Console me dit immédiatement si le code est chargé, donc correcte.

Mais pour les codes courts, je le fais à la Console, là, j'ai ça :

_$(setq ename (car (entsel "\nSélectionner un coutour : ")))
nil
<Nom d'entité: 255e093c900>
_$ 

 

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

J'ai oublié de précisé que j'ai bien (vl-load-com) de "chargé"...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Et si ensuite, toujours dans la console, tu fais : (getpropertyvalue ename "Area") ?

Ou (setq vla-obj (vlax-ename->vla-object ename)) ? puis (vla-get-Area vla-obj) ?

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Effectivement, dans la Console, ça à l'air de fonctionner :

_$(setq ename (car (entsel "\nSélectionner un coutour : ")))
nil
<Nom d'entité: 255e093c900>
_$ 
_$ (getpropertyvalue ename "Area")
4909.63
_$ 

 

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)
Just now, (gile) said:

Ça marche alors... Je ne comprends pas où est le problème.

Ben moi non plus ... Dans la Console, c'est OK, dans AutoCAD, rien...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

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é