Aller au contenu

additionner des surfaces avec des polylignes


Messages recommandés

Posté(e)

Bonjour à tous,

 

J'ai commencé à créer un programme pour obtenir une surface du calque souhaité en ayant un message qui apparait à la fin.

 

Je voudrais savoir comment l'on pourrais additionner toutes les surfaces du même calques dans les même conditions que mon programme.

 

Merci d'avance en vous faisant confiance !!!

 

MON PROGRAMME EN COURS :

 

(defun c:aires+()

(vl-load-com)

 

;sélection de l'élément désiré

(setq LI (entsel " Sélectionnez un élément du calque désiré " ))

(setq NomEntite (car LI))

(setq LISTE (entget NomEntite))

(setq calc (cdr (assoc 8 liste)))

 

 

;début du programme aire

 

(command "aire" "o" pause)

(setq surf (getvar "area"))

(setq surf (/ surf 10000))

(setq surftxt (rtos surf 2 2))

 

; Message texte de la surface

(alert

(strcat "L'aire sur le calque " calc " est de "

surftxt

" m²"

)

)

 

)

 

;FIN

 

Posté(e)

Salut,

 

Regarde dans l'aide la fonction ssget pour faire un jeu de sélection.

L'option "_x" permet de faire une sélection dans tout le dessin sans intervention de l'utilisateur.

Tu peux utiliser un filtre pour ne sélectionner que les polylignes, sur le calque spécifié (calc):

(setq SelSet (ssget "_X" (list '(0 . "LWPOLYLINE") (cons 8 calc))))

Il te faudra ensuite parcourir le jeu de sélection (avec while ou repeat) pour additionner les aires de chacune des polylignes qu'il contient.

Tu peux t'inspirer de cette version du LISP Long_line.

 

PS1 : (vl-load-com) n'est nécessaire que si tu utilises des fonctions vla-*, vlax-* ou vlr-*.

 

PS2 : tu peux effacer ton message en doublon ici (Editer > !Effacer ce message!).

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

Posté(e)

Merci pour ton aide GILE

 

mais je n'arrive pas à aboutir à mon programme :casstet: !!!

 

il me renvois : lselsetp nil

 

peux-tu m'aider à arranger ceux-ci

 

Merci encore !!!

 

MON PROGRAMME EN COURS :

 

(defun c:aires+()

(vl-load-com)

 

;sélection de l'élément désiré

(setq LI (entsel " Sélectionnez un élément du calque désiré " ))

(setq NomEntite (car LI))

(setq LISTE (entget NomEntite))

(setq calc (cdr (assoc 8 liste)))

 

 

;début du programme aires+

 

;(command "aire" "o" pause)

 

;selectionne dans la liste les surfaces du calque souhaité

 

(setq js (ssget "X" (list (cons 0 "area")(cons 8 calc))))

 

;donne le nombre de volumes sélectionnés

 

(setq nb_pl (sslength js))

(setq indice 0)

(setq surftotal 0)

 

( repeat nb_pl

(setq ent (ssname js indice))

 

 

(setq surf (vlax-get-property

(vlax-ename->vla-object ent)

'surface

))

 

 

 

 

 

(setq surftotal (+ surftotal surf))

(setq indice (1+ indice))

 

 

)

 

(setq surftotal (/ surftotal 10000))

(setq surftxt (rtos surftotal 2 2))

 

; Message texte de la surface totale

(alert

(strcat "L'aire sur le calque " calc " est de "

surftxt

" m²"

)

)

 

)

 

;FIN

 

Posté(e)

Coucou

 

tu es mal parti

je te mets sur la voie

car si je te mets la solution tu n'apprendras rien.

 

choisir une entité pour trouver calque

faire une sélection des objets polylignes de ce calque

vérifier si elles sont closes

additionner toutes les surfaces

éditer le résultat

 

ceci est la marche à suivre

c'est 80% du travail.

 

décompose ton travail sans commandes superflues

comme liste et aire

 

amicalement

Posté(e)

Re

 

Merci pour ton aide didier,

 

Mais je bloque à un niveau en m'aidant du programme LONG_LINE

 

(repeat (sslength js)

(setq ent (ssname js (+ nb_l nb_pl)))

(cond

((= (val_dxf 0 ent) "LINE")

(setq nb_l (1+ nb_l)

lo_l (+ lo_l (LONGOBJT ent))

)

)

 

la surface s'obtient comment, j'essaye de comparer avec "LINE"

je n'arrive pas à comprendre le système ? :casstet:

 

Merci d'avance

Posté(e)

Salut,

 

(setq js (ssget "X" (list (cons 0 "area")(cons 8 calc))))

Le groupe de code DXF 0 correspond au type d'entité, "area" n'est pas un type d'entité. Si tu veux sélectionner les polylignes, il faut écrire :

(cons 0 "LWPOLYLINE") ou '(0 . "LWPOLYLINE)

 

(setq surf (vlax-get-property
(vlax-ename->vla-object ent)
'surface
))

La propriété "surface" n'existe pas pour les polylignes, essaye plutôt avec "Area" :

(setq surf (vlax-get-property (vlax-ename->vla-object ent) 'Area))

ou

(setq surf (vla-get-Area (vlax-ename->vla-object ent)))

 

PS : utilise le bbcodes pour le code, il conservera son identation et sera plus lisible. Bouton Dièse (#).

Tu peux utiliser le bouton citer sur ce message pour le lire dans sa version source.

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

Posté(e)

Re

 

j'ai encor un petit service à vous demander

 

En ayant obtenu le résultat souhaité, j'aimerais introduire cette valeur dans un tableau d'autoCAD dans une case aproprié au résultat cherché.

 

sans faire de saisi pour ne pas se tromper de valeur

 

Est ce possible ???

 

Je sais que que l'on peut enregistrer la valeur directement sous excel mais le probleme est que je voudrais insérer ce résultat dans une case spéciphique et dans un tableur déja créer .Ceux-ci est compliqué donc c'est pour cela que j'ai créer un tableau sous autocad et que j'importeré toute mes valeurs en fichier.csv

 

quel formule de lisp pourrai faire cela ?

 

Posté(e)

OK

 

Je vous met à disposition mon programme, mais je voudrais bien le finir en vous posant la

 

question en REPONSE N°7

 

MON PROGRAMME ENCOURS :

 

(defun c:aires+()

(vl-load-com)

 

;sélection de l'élément désiré

(setq LI (entsel " Sélectionnez un élément du calque désiré " ))

(setq NomEntite (car LI))

(setq LISTE (entget NomEntite))

(setq calc (cdr (assoc 8 liste)))

 

 

;début du programme aires+

 

;(command "aire" "o" pause)

 

;selectionne dans la liste les surfaces du calque souhaité

 

(setq js (ssget "X" (list (cons 0 "LWPOLYLINE")(cons 8 calc))))

 

;donne le nombre d'aires sélectionnés

 

(setq nb_pl (sslength js))

(setq indice 0)

(setq surftotal 0)

 

( repeat nb_pl

(setq ent (ssname js indice))

 

 

(setq surf (vla-get-area (vlax-ename->vla-object ent)

 

))

 

(setq surftotal (+ surftotal surf))

(setq indice (1+ indice))

 

)

 

;(setq surf (getvar "area"))

(setq surftotal (/ surftotal 10000))

(setq surftxt (rtos surftotal 2 3))

 

; Message texte de la surface totale

 

(alert

(strcat "L'aire sur le calque " calc " est de "

surftxt

" m²"

)

)

 

)

 

;FIN

 

Posté(e)

Salut,

 

Manipuler des tableaux AutoCAD en LISP n'est pas une chose très aisée et je n'ai pas le temps en ce moment de t'expliquer (vu ce qui me semble être ton niveau actuel).

 

Peut-être quelqu'un d'autre...

 

PS : arrête de multiplier les messages ça devient impossible à suivre !

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

  • 2 semaines après...
Posté(e)

Mais non je suis de retour !!!

 

Dsl je ne vous avez pas dis que j'étais parti en vacances !!!

 

Et je voulais un peu de calme (pas de téléphone ni de PC) pendant c vacs.

 

C reparti pour une année de + !!!

 

Je vous souhaite une bonne rentré à tous !

Posté(e)

Salut,

 

Un exemple de tableau qui affiche la somme des aires des polylignes fermées par calque :

;; APC (gile)
;; Insère un tableau contenant la somme des aires des polylignes fermées par calque

(defun c:APC (/ tot ss lst ins len tbl row)
 (vl-load-com)
 (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object))))
 (or *Layers* (setq *Layers* (vla-get-Layers *acdoc*)))
 (vlax-for l *Layers*
   (if (ssget "_X"
              (list
                '(0 . "LWPOLYLINE")
                '(-4 . "&")
                '(70 . 1)
                (cons 8 (vla-get-Name l))
              )
       )
     (progn
       (setq tot 0)
       (vlax-for p (setq ss (vla-get-ActiveSelectionSet *acdoc*))
         (setq tot (+ tot (vla-get-Area p)))
       )
       (vla-delete ss)
       (setq lst (cons (cons (vla-get-Name l) tot) lst))
     )
   )
 )
 (initget 1)
 (setq ins (trans (getpoint "\nPoint d'insertion: ") 1 0)
       len (length lst)
       tbl (vla-addtable
             (vla-get-ModelSpace *acdoc*)
             (vlax-3d-point ins)
             (+ 2 len)
             2
             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 "Aires des polylignes par calques") ; Titre
 (vla-setText tbl 1 0 "Calque")                  ; Titre colonne 1
 (vla-setText tbl 1 1 "Aire")                    ; Titre colonne 2
 (setq row 1)
 (foreach p (reverse lst)
   (vla-SetText tbl (setq row (1+ row)) 0 (car p))
   (vla-SetText tbl row 1 (rtos (/ (cdr p) 10000) 2 3)) ; conversion cm -> m2, 3 décimales
 )
 (vla-setcellalignment tbl row 0 5)
 (vla-setcellalignment tbl row 1 5)
 (princ)
)

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

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é