packagg Posté(e) le 5 août 2009 Posté(e) le 5 août 2009 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
(gile) Posté(e) le 5 août 2009 Posté(e) le 5 août 2009 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
packagg Posté(e) le 5 août 2009 Auteur Posté(e) le 5 août 2009 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
didier Posté(e) le 5 août 2009 Posté(e) le 5 août 2009 Coucou tu es mal partije te mets sur la voiecar si je te mets la solution tu n'apprendras rien. choisir une entité pour trouver calquefaire une sélection des objets polylignes de ce calquevérifier si elles sont closesadditionner toutes les surfaceséditer le résultat ceci est la marche à suivrec'est 80% du travail. décompose ton travail sans commandes superfluescomme liste et aire amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
packagg Posté(e) le 5 août 2009 Auteur Posté(e) le 5 août 2009 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
(gile) Posté(e) le 5 août 2009 Posté(e) le 5 août 2009 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
packagg Posté(e) le 6 août 2009 Auteur Posté(e) le 6 août 2009 Super Je suis arrivé à faire marcher mon programme !!!! Franchement un grand merci à toi gile ;) Bonne journée !!! :D
packagg Posté(e) le 6 août 2009 Auteur Posté(e) le 6 août 2009 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 ?
didier Posté(e) le 6 août 2009 Posté(e) le 6 août 2009 coucou pour bien faire et respecter l'idéologie du siteje ne parle pas de l'idée au logis mets ton programme à disposition sur le sitetu rendras à ton tour service à quelqu'un et éventuellement on t'apportera une correction le cas échéant. amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
packagg Posté(e) le 6 août 2009 Auteur Posté(e) le 6 août 2009 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
(gile) Posté(e) le 6 août 2009 Posté(e) le 6 août 2009 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
didier Posté(e) le 11 août 2009 Posté(e) le 11 août 2009 coucou a priori Packagg n'a plus besoin de nousje n'ai pas de nouvelles de lui depuis qu'on lui a déposénos différentes aides et proposition d'exercice pour s'entraîner :mad: amicalement tout de même Éternel débutant... Mon site perso : Programmer dans AutoCAD
packagg Posté(e) le 23 août 2009 Auteur Posté(e) le 23 août 2009 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 !
(gile) Posté(e) le 23 août 2009 Posté(e) le 23 août 2009 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
packagg Posté(e) le 27 août 2009 Auteur Posté(e) le 27 août 2009 ha !!! Sympa ton tableaucela peut être utile merci gile :)
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