Aller au contenu

Longueur Ligne+Polyligne (2D ou 3D)


Bred

Messages recommandés

Salut,

pour répondre à x-all ici, un petit lisp qui retourne la longueur des lignes + polyligne (2D ou 3D) sélectionné :

 

(taper lg-li-pol pour lancer la commande)

- Nota : enlever les espaces (-4 . "[surligneur]< OR[/surligneur]") (-4 . "[surligneur]OR >[/surligneur]")

 

(defun c:lg-li-pol (/ LG SEL X)  
(setq lg 0
     sel nil)
(while (not sel)
(setq sel (ssget (list '(-4 . "< OR") '(0 . "*POLYLINE") '(0 . "LINE") '(-4 . "OR  >"))))
 )
(repeat (setq x (sslength sel))
 (setq lg (+ lg (vla-get-Length (vlax-ename->vla-object (ssname sel (setq x (1- x)))))))
 )
(alert (strcat "Longueur :" (rtos lg) " ."))
(princ)
)

 

Edit : Ajout de la possibilitée de sélectionner les polyligne dites "3D".

 

[Edité le 2/5/2007 par Bred]

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Lien vers le commentaire
Partager sur d’autres sites

merci beaucoup !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! lippssppssss

 

tu me tire une fière chandelle du pied...!!

d'autant que je suis en train de métré un vieux plan vrd ou le dessinateur à pratiquement tout mis dans le calque éléc, murs compris !!!

 

bref super cool ça marche extrat !!!!!!!!!!!

MERCI !!

 

 

 

Lien vers le commentaire
Partager sur d’autres sites

j'essaye de bricoler la même chose pour cumuler des surfaces de polygone fermé, mais je dois avouer que je ne comprend rien de rien à ton lisp...

 

que veux bien dire la ligne

(setq sel (ssget (list '(-4 . "< OR") '(0 . "*POLYLINE") '(0 . "LINE") '(-4 . "OR >"))))

 

j'ai un gif avec un singe qui se gratte confusément la tête qui serai approprié pour donner un aperçu de mon air dubitatif...

 

et qu'es ce qui cloche dans

(setq suff (+ surf (vla-get-area (vlax-ename->vla-object (ssname sel (setq x (1- x)))))))

 

bref, je cherche, mais si tu as un peu de temps à me consacrer, tu vas encore m'en faire gagner beaucoup...

 

merci

 

 

 

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

(setq sel (ssget (list '(-4 . ""))))

 

crée un jeu de sélection avec un filtre, ne pouront être sélectionnéses que les lignes et polylignes.

 

Si tu veux filtrer les polylignes fermées :

 

(setq sel (ssget '((0 . "LWPOLYLINE") (-4 . "&") (70 . 1))))

 

et qu'es ce qui cloche dans

(setq su[surligneur]f[/surligneur]f (+ su[surligneur]r[/surligneur]f (vla-get-area (vlax-ename->vla-object (ssname sel (setq x (1- x)))))))

 

[Edité le 3/5/2007 par (gile)]

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

Lien vers le commentaire
Partager sur d’autres sites

bon, ben c pas gagné pour un 1er lisp...

 

avec les éclaircissement de (gile), j'arrive à ça...

mais ça marche pas mieux...

 

  voir plus bas la maj 

 

le message quand je charge c'est:

; erreur: no function definition: SSAREA

 

ben voui.. ça pouvais pas etre aussi simple.... grrr

ou peut on trouver une liste des comandes lisp?

vu que _area marche pas mieux ???

 

 

 

[Edité le 11/8/2011 par x_all]

Lien vers le commentaire
Partager sur d’autres sites

Ça, il fallait pas le changer ;-)

sslength n'a rien à voir avec la longueur ou la surface des objets sélectionnés, c'est la fonction qui retourne la "longueur" (le nombre d'éléments) du jeu de sélection.

 

Pour modifier (ou faire) des LISP je te conseille l'éditeur Visual LISP (commande VLIDE ou VLISP).

 

Les différents symbole y apparaissent en couleurs différentes selon leur type, les fonctions prédéfinies en bleu, les chaines de caractères en fuschia, les parenthèses en rouge les entiers en vert foncé les réels en vert plus clair, tout le reste en noir.

 

http://img503.imageshack.us/img503/1227/editeur1gd4.png

 

En cliquant sur "Formater la fenêtre" le code va s'inscrire avec des retraits de ligne correspondant au nombre de parenthèses ouvertes non apariées.

Le ssarea n'est pas en bleu, il ne s'agit pas d'une fonction prédéfinie.

 

http://img234.imageshack.us/img234/8900/editeur2fw9.png

 

Après l'avoir remplacé par sslength, on peut charger directement le code dans le dessin courant en cliquanr sur "Charger la fenêtre d'édition active".

 

http://img352.imageshack.us/img352/7159/editeur3ef4.png

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

Lien vers le commentaire
Partager sur d’autres sites

^^

 

c vrai que c plus clair comme ça...

et du reste en sachant ce que retourne sslength, ça me parait plus logique..

 

mais j'ai bien des lacune en algorytme, et la syntaxe un peu étrange du lisp est pas la pour m'eclaircir les idées...

 

(setq sf (+ sf (vla-get-area (vlax-ename->vla-object (ssname sel (setq x (1- x)))))))

 

?????????

 

bon ok, c la que la variable sf va s'incrémenter avec les valeur succéssive de la surface des poly... mais...

 

si j'ai bien tout compris, il faut partir du centre... donc (setq x (1- x)

si au "1er tour" x vaut 3, au second x=-2 ???

 

en plus, (repeat (setq x (ssarea sel))

mais alors on fixe la valeur de x aprés le repeat???

décidément, le lisp a une logique bien etrange... je peu repotasser le forum des débutant avant d'espérer rebidouiller qq chose

 

pfffff

ça marche mais je capte tjs pas comment

 

n'empèche merci beaucoup...

Lien vers le commentaire
Partager sur d’autres sites

mais alors on fixe la valeur de x aprés le repeat???

 

Le lisp fonctionne avec les parenthèses, l'exécution se faisant par profondeur d'imbrication.

 

(a (b (c (d)))) ici par exemple d sera évaluer en premier, puis c , puis b et enfin a.

 

Une fois qu'on a compris, ça va beaucoup mieux ;)

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

Lien vers le commentaire
Partager sur d’autres sites

C'est vrai que ce LISP est écrit d'une manière concise qui n'est pas pour me déplaire mais qui peut être plus difficile à comprendre.

 

en plus, (repeat (setq x (ssarea sel))

mais alors on fixe la valeur de x aprés le repeat???

 

Non, le lisp avec ses parenthèses fonctionne un peu comme l'écriture mathématique est évalué en premier ce qui se trouce à l'intérieur des parenthéses les plus imbriquées et le lésultat est retourné à cet endroit. Dans cet exemple, (sslength sel) est évalué, son résultat est retourné comme argument du (setq x ...) qui lui est retourné comme argument de (repeat ...).

 

Le jeu de sélection est parcourru "à l'envers" de la dernière entité à la première.

 

D'une manière plus "lisible" le code aurait pu être écrit :

 

(defun c:sf-pol	(/ sf sel x ent sf_ent)

 ;; création du jeu de sélection
 (while (not sel)
   (setq sel (ssget '((0 . "LWPOLYLINE") (-4 . "&") (70 . 1))))
 )

 ;; mise à 0 de la surface totale
 (setq	sf  0)

 ;; mise à 0 du compteur
 (setq x 0)

 ;; repeter autant de fois qu'il y a d'entités dans le jeu de sélection
 (repeat (sslength sel)
   ;; transformation de la xième entité en vl-object
   (setq ent (vlax-ename->vla-object (ssname sel x)))
   ;; surface de l'entité
   (setq sf_ent (vla-get-area ent))
   ;; ajout à la surface totale
   (setq sf (+ sf sf_ent))
   ;; passe à l'entité suivante
   (setq x (1+ x))
 )

 ;; affichage du résultat
 (alert (strcat "surface :" (rtos sf) " ."))
 (princ)
) 

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

Lien vers le commentaire
Partager sur d’autres sites

Salut,

en fait c'est normal que tu ais un peu de mal, car le code est écrits en grande partie en "visual Lisp", est c'est un niveau un peu plus ardu que l'"autolisp", base du lisp sur Autocad.

 

mais grâce à l'éditeur que t'as montré (gile), tu peux visualise ce que ce passe plus facilement, et donc tester, corriger, appeler l'aide, etc ...

 

J'utilise beaucoup le "charger la selection" (à côter de "charger la fenêtre d'édition active") dans l'éditeur, pour voir comment réagis mes codes petit à petit...

Ainsi, les valeurs des variables peuvent être directement vus dans la "console"

 

(ex: tu surlignes

(while (not sel)

(setq sel (ssget '((0 . "LWPOLYLINE") (-4 . "&") (70 . 1))))

)

et tu "charge la selection",

si tu surlignes maintenant que "sel", tu auras une selection das la varable sel (sous la forme "< Selection set: 64c9 >")

puis après si tu surligne et charge que "(sslength sel)", tu auras en retour un nombre te donnant donc le nombre d'objet dans sel.

etc ......)

 

utilises souvent l'aide, même si elle peut te paraitre au premier abord confuse, on s'y habitue à force ....

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Lien vers le commentaire
Partager sur d’autres sites

en fait c'est normal que tu ais un peu de mal

 

:cool:

je commencais a avoir des doutes..

 

non, sans rire.... vous etes a 1000 lieux de ce que je pourrai espérer faire un jour...

n'empèche que vous explications me donne des pistes pour me dépatouillé un peu, mais avec le temps dont je dispose pour me consacrer à la programmation (pas des masses) c'est pas gagné

 

mais je vous remercie de vos lumières...

Lien vers le commentaire
Partager sur d’autres sites

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é