Joffoon Posté(e) le 21 mai 2007 Posté(e) le 21 mai 2007 Bonjour à toutes et à tous, Je viens vers vous car j'ai un soucis entre deux Lisp qui ont la meme fonction, celle-ci est de donner la longueur totale des polylignes d'un calque précis.. Les deux Lisp me donnent un résultat différent :casstet: , pourquoi??? Si quelqu'un avait un moment pour s'attarder dessus, Le premier : ; Length/Area of Polyline by Layer; David Bethel May 2004 from an original idea by David Watson; This command will give a total area or length for all polylines on a specified layer.;(defun c:zone1 ( / ss la rv i tv op en) (while (not ss) (princ "\nPick any object on the required layer") (setq ss (ssget))) (initget "Length Area") (setq rv (getkword "\nWould you like to measure Length/ : ")) (and (not rv) (setq rv "Area")) (setq la (cdr (assoc 8 (entget (ssname ss 0)))) ss (ssget "X" (list (cons 0 "*POLYLINE") (cons 8 la))) i (sslength ss) tv 0 op 0) (while (not (minusp (setq i (1- i)))) (setq en (ssname ss i)) (command "_.AREA" "_E" en) (cond ((= rv "Length") (setq tv (+ tv (getvar "PERIMETER")))) (T (setq tv (+ tv (getvar "AREA"))) (if (/= (logand (cdr (assoc 70 (entget en))) 1) 1) (setq op (1+ op)))))) (princ (strcat "\nTotal " rv " for layer " la " = " (rtos tv 2 2) " in " (itoa (sslength ss)) " polylines\n" (if (/= rv "Length") (strcat (itoa op) " with open polylines") ""))) (prin1)) Le second : qui est de "master" (gile) ;;; C:ZONE Calcule la longueur des lignes et lwpolylignes du calque spécifié ;;; Retourne la valeur du code dxf (defun val_dxf (code ent)(cdr (assoc code (entget ent)))) ;;; LONGOBJT Retourne la longueur ou le périmètre d'un objet (ename) (defun LONGOBJT (ent)(vl-load-com)(vla-get-length (vlax-ename->vla-object ent))) ;;; Fonction principale (defun c:zone (/ clq js cnt tot nb_l nb_pl lo_l lo_pl)(if(setqclq (entsel "\nSélectionnez un objet sur le calque ou < Nom >: "))(setq clq (val_dxf 8 (car clq)))(setq clq (getstring "\nNom du calque: ")))(if (tblsearch "LAYER" clq)(progn(setq js (ssget "_X" (list '(0 . "LINE,LWPOLYLINE") (cons 8 clq)))nb_l 0nb_pl 0lo_l 0.0lo_pl 0.0)(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))))((= (val_dxf 0 ent) "LWPOLYLINE")(setq nb_pl (1+ nb_pl)lo_pl (+ lo_pl (LONGOBJT ent))))))(setq descr (strcat"\nNom de calque..........\t"clq"\nNombre de lignes.......\t"(itoa nb_l)"\nLongueur de ligne......\t"(rtos lo_l)"\nNombre de polylignes...\t"(itoa nb_pl)"\nLongueur de polyligne..\t"(rtos lo_pl)"\nLongueur totale........\t"(rtos (+ lo_l lo_pl))"\n"))(textscr)(princ descr)(initget "Oui Non")(if (= (getkword"\nEnregistrer dans un fichier ? [Oui/Non] < Non >: ")"Oui" Merci de votre attention.. Joff Le ridicule ne tue pas, il te rend plus fort!
Joffoon Posté(e) le 21 mai 2007 Auteur Posté(e) le 21 mai 2007 Je viens de trouver la soluce (je pense que c'est cela) : En fait il y a l'un des deux lisp qui prend en compte que l'espace Objet, et l'autre, qui prend en compte l'espace Objet et Papier.. Car j'avais tracé une polyligne du calque concerné dans l'espace Papier pour une légende.. ;) Désolé pour le dérangement.. :cool: A+, Joff Le ridicule ne tue pas, il te rend plus fort!
(gile) Posté(e) le 21 mai 2007 Posté(e) le 21 mai 2007 Salut, Je ne pense pas que ce soit ça. Dans Zone1, si à l'invite "Would you like to measure Length/ : ", tu fais Entrée, le LISP calcule les aires des polylignes (c'est l'option par défaut). Il faut entrer L puis Entrée pour avoir les longueurs. Il faudrait remplacer cette invite par : "\nWould you like to measure [Area/Length] : " Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Joffoon Posté(e) le 21 mai 2007 Auteur Posté(e) le 21 mai 2007 Salut, justement, à chaque fois je tape "L" pour Length, puis entrée.. Donc ce n'est pas le probleme de prise en compte de l'espace Papier et Objet qui font la différence? Je ne comprend pas d'ou peut venir le probleme alors?? Peut tu m'éclairer? Joff Le ridicule ne tue pas, il te rend plus fort!
(gile) Posté(e) le 21 mai 2007 Posté(e) le 21 mai 2007 Extrait de la fenêtre de texte d'AutoCAD après avoir exécuté LONG_LINE puis ZONE1 une première fois option Length une deuxième fois option par défaut (Area) ZONE1 utilise la commande _.AREA et récupère les valeurs des variables système PERIMETER (pour la longueur) et AREA (pour l'aire). Ceci apparaît clairement dans la fenêtre de texte. Commande: LONG_LINE Sélectionnez un objet sur le calque ou :Nom de calque.......... Calque1Nombre de lignes....... 0Longueur de ligne...... 0.0000Nombre de polylignes... 1Longueur de polyligne.. 8577.2305Longueur totale........ 8577.2305 Enregistrer dans un fichier ? [Oui/Non] : Commande:Commande: ZONE1 Pick any object on the required layerChoix des objets: 1 trouvé(s) Choix des objets: Would you like to measure Length/ : l_.AREASpécifiez le premier coin ou [Objet/Addition/Soustraction]: _EChoix des objets:Aire = 2291313.3845, Longueur = 8577.2305 Commande:Total Length for layer Calque1 = 8577.23 in 1 polylines Commande:ZONE1Pick any object on the required layerChoix des objets: 1 trouvé(s) Choix des objets: Would you like to measure Length/ :_.AREASpécifiez le premier coin ou [Objet/Addition/Soustraction]: _EChoix des objets:Aire = 2291313.3845, Longueur = 8577.2305 Commande:Total Area for layer Calque1 = 2291313.38 in 1 polylines1 with open polylines PS : Le code que tu donnes pour LONG_LINE (renommé ZONE) est incomplet. On peut trouver le LISP en téléchargement sur cette page. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Joffoon Posté(e) le 22 mai 2007 Auteur Posté(e) le 22 mai 2007 Salut, Merci pour tes eclaircissement (gile), bonne journée à tous Joff Le ridicule ne tue pas, il te rend plus fort!
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