Aller au contenu

soucis sur code entre deux lisp


Messages recommandés

Posté(e)

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

(setq

clq (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 0

nb_pl 0

lo_l 0.0

lo_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!

Posté(e)

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!

Posté(e)

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

Posté(e)

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!

Posté(e)

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.......... Calque1

Nombre de lignes....... 0

Longueur de ligne...... 0.0000

Nombre de polylignes... 1

Longueur de polyligne.. 8577.2305

Longueur totale........ 8577.2305

 

Enregistrer dans un fichier ? [Oui/Non] :

 

Commande:

Commande: ZONE1

 

Pick any object on the required layer

Choix des objets: 1 trouvé(s)

 

Choix des objets:

 

Would you like to measure Length/ : l

_.AREA

Spécifiez le premier coin ou [Objet/Addition/Soustraction]: _E

Choix des objets:

Aire = 2291313.3845, Longueur = 8577.2305

 

Commande:

Total Length for layer Calque1 = 8577.23 in 1 polylines

 

Commande:

ZONE1

Pick any object on the required layer

Choix des objets: 1 trouvé(s)

 

Choix des objets:

 

Would you like to measure Length/ :

_.AREA

Spécifiez le premier coin ou [Objet/Addition/Soustraction]: _E

Choix des objets:

Aire = 2291313.3845, Longueur = 8577.2305

 

Commande:

Total Area for layer Calque1 = 2291313.38 in 1 polylines

1 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

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é