Aller au contenu

Lisp pour Polyligne 3D


Max73

Messages recommandés

Bonjour,

existerait t il une lisp pour avoir la longueur d une polyligne 2d ou 3d,

et avec le nombre de sommet qu elle contient aussi sans compter les deux extrémité,

et enfin la diference en Z pour une polyligne 3d. 

il y a la Lisp de gille totalperim mais elle me convient pas tout a fait

Lien vers le commentaire
Partager sur d’autres sites

Bonjour @Max73

OUI, ça existe.

Je dépose un fichier lsp qui devrait faire le job, mais comme la question manque de précision quant à ce qui est attendu par l'utilisateur, il faudra le retravailler.
Faut-il sortir les coordonnées dans un fichier ? dans une liste pour être utilisée par un autre lisp ?
Que signifie : sans compter (et non conter) les deux extrémités ?

Amicalement

Poly3D-Liste-Sommets-01.LSP

Lien vers le commentaire
Partager sur d’autres sites

Bonjour @Luna

Je te remercie pour la question, car j'ai oublié de la poser.
Avec le temps (depuis 2002) on commence à se lasser des questions incomplètes et évasives (en restant dans l'euphémisme).
Nous faisons des efforts, mais c'est bien souvent à sens unique.

Souhaitons que @Max73nous détaille plus avant son souhait pour qu'on puisse l'aider efficacement.

Amicalement
 

Lien vers le commentaire
Partager sur d’autres sites

bonjour, Désole pour les question évasives (malheureusement je suis un peut le pro pour ca c'est très claire dans ma tête mais moins sur le papier) et sa je le sais, donc merci encore et  n hésité pas a posé des question pour que j essaie d être plus claire.

 image.thumb.png.c05c2636cbab6db2ef61127adb514494.png

Enfaite je travail sur des isométries avec des polyligne 3d, et je voudrait en un clic sur une polyligne écrire sur l iso la longueur de la polyligne, et le nombre de sommet quel contient sans les deux extrémité, et aussi avoir le différence d altimétrie entre les deux extrémités.

image.png.4c827581b1bf63ae83d270c4601398b2.png

voici le texte que je devrait pose sur la polyligne, Attention mes plan sont tracer en millimètre mais il me faut le résultat en mètre.

et le text devrais ce trouve sur le mem calque que la polyligne aussi.

Bon pas sur que sa soit plus clair mais n hésité pas.

Merci.

Lien vers le commentaire
Partager sur d’autres sites

Coucou,

La différence d'altimétrie entre quelques extrémités ? Celles que l'on ignore ou bien celles que l'on conserve ? Pour la longueur, même question : faut-il la longueur totale (en comptant les extrémités que l'on ignore) ou bien la longueur corrigée (sans prendre en compte les extrémités que l'on ignore)
Donc le résultat attendu c'est un MTEXT présenté comme suit ?

Citation

Lg. = ... m
Nb. = ... u ; (égal à n-2 avec n le nombre total de sommets)
Dz. = ±... m

Où faut-il placer le MTEXT ? L'utilisateur le place manuellement ou bien il doit se placer à un endroit en particulier par rapport à la polyligne ? Faut-il que les informations soient sous forme de champ dynamique (tout va dépendre des réponses par rapport aux premières question) ?

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

la différence d altimétrie doit ce faire entre les deux extrémité que l'on ignore.

la longueur et la longueur totale.

le résultat en Mtext me va très bien.

c'est l utilisateur que le place et si possible le Mtext ne peut se déplacé que sur la polyligne.

champ dynamique serait pas mal car si il y a une modification les info changerons aussi.

Lien vers le commentaire
Partager sur d’autres sites

Coucou @Max73,

Essaye de voir si cela te convient ou pas (j'ai essayé de faire au mieux selon la demande, sans surplus ^^") :

;--- Author  : Luna
;--- Date    : 14/08/2022
;--- Version : 1.0.0
; Création d'un objet MText détaillant la longueur totale d'une polyligne 3D (champ dynamique), du nombre total de sommets (sauf extrémités) ainsi que
; la différence d'altitude (Z) entre les deux extrémités ignorées (Zdébut - Zfin). Le MText est rattaché à la polyligne 3D via (grread) pour suivre la
; courbe. La rotation du texte est alignée à l'axe X du SCU courant et les valeurs spécifiées dans le MText sont exprimées en mètres, quelque soit la
; valeur de "INSUNITS". Le MText est inséré sur le calque de la polyligne 3D (mais les propriétés de couleurs, transparence, etc... correspondent aux
; valeurs courantes pour les nouveaux objets).

(defun c:Poly3D_Max73 (/ get-poly-info cvunits set-MTEXT move-MTEXT name info layer htxt str text)
  (defun get-poly-info (ent / ob vs ve ps pe ID fa lg pt Dz)
    (if
      (and
        (setq ob (vlax-ename->vla-object ent))
        (setq vs (vlax-curve-getStartPoint ent))
        (setq ve (vlax-curve-getEndPoint ent))
        (setq ps (vlax-curve-getStartParam ent))
        (setq pe (vlax-curve-getEndParam ent))
        (setq ID (vla-get-ObjectID ob))
        (setq fa (getvar "INSUNITS"))
        (setq lg (strcat "%<\\AcObjProp.16.2 Object(%<\\_ObjId " (itoa ID) ">%).Length \\f \"%lu2%pr1%ct8[" (rtos (cvunits 1 fa 6)) "]%th32\">%"))
        (setq pt (1+ (fix pe)))
        (setq Dz (- (last ve) (last vs)))
      )
      (list lg pt (cvunits Dz fa 6))
    )
  )

  (defun cvunits (value from-unit to-unit / f)
    (defun f (u)
      (if (= (type u) 'INT)
        (cond
          ((= u 1) "inch")
          ((= u 2) "foot")
          ((= u 3) "mile")
          ((= u 4) "millimeter")
          ((= u 5) "centimeter")
          ((= u 6) "meter")
          ((= u 7) "kilometer")
          ((= u 8) "microinch")
          ((= u 9) "millipouce")
          ((= u 10) "yard")
          ((= u 11) "Angstrom")
          ((= u 12) "nanometer")
          ((= u 13) "micron")
          ((= u 14) "decimeter")
          ((= u 15) "dekameter")
          ((= u 16) "hectometer")
          ((= u 17) "gigameter")
          ((= u 18) "astronomical_unit")
          ((= u 19) "light_year")
          ((= u 20) "parsec")
          ((= u 21) "survey_foot")
        )
        u
      )
    )
    (cvunit value (f from-unit) (f to-unit))
  )

  (defun set-MTEXT (pt wd str ht rt ly / ms ob)
    (and
      (setq ms (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object))))
      (setq pt (vlax-3D-point pt))
      (setq ob (vla-AddMText ms pt wd str))
      (null (vlax-put ob 'Height ht))
      (null (vlax-put ob 'Rotation rt))
      (null (vlax-put ob 'Layer ly))
    )
    ob
  )

  (defun move-MTEXT (msg curve mtext / gr pt)
    (princ msg)
    (while (and (setq gr (grread T)) (= 5 (car gr)))
      (setq pt (trans (cadr gr) 1 0))
      (setq pt (vlax-curve-getClosestPointTo curve pt))
      (vla-move mtext (vla-get-InsertionPoint mtext) (vlax-3D-point pt))
    )
    mtext
  )

  (and
    (setq name (entsel "\nSélectionner une polyligne 3D : "))
    (setq name (car name))
    (= "POLYLINE" (cdr (assoc 0 (entget name))))
    (setq info (get-poly-info name))
    (setq layer (cdr (assoc 8 (entget name))))
    (null (initget 6))
    (or
      (setq htxt (getreal (strcat "\nSpécifier la hauteur de texte <" (rtos (getvar "TEXTSIZE")) ">: ")))
      (setq htxt (getvar "TEXTSIZE"))
    )
    (setq str
      (strcat
        "Lg = " (car info) "m"
        "\n"
        "So = " (itoa (- (cadr info) 2)) "u"
        "\n"
        "Al = " (rtos (caddr info) 2 1) "m"
      )
    )
    (setq text (set-MTEXT '(0.0 0.0 0.0) (* htxt 10) str htxt 0.0 layer))
    (move-MTEXT "\nSélectionner un point d'insertion : " name text)
  )
  (princ)
)

Normalement cela devrait suivre les infos que tu m'as donné 😉
Sur ce, bonne nuit !

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,@Luna

Un très grand merci c'est tout a fait ce qu' il le faut 😍.

après il aurait deux trois ajustement pour parfaire le truc mais qui ne sont pas vraiment important.

il faut mette la hauteur du texte a 100mm de haut tout de suite, et avoir 2 chiffre après la virgule pour la longueur.

Si cela et possible bien sur 😉

Si non encore merci, Bisous.

Lien vers le commentaire
Partager sur d’autres sites

Hello

Et toujours en theorie :

        (setq lg (strcat "%<\\AcObjProp.16.2 Object(%<\\_ObjId " (itoa ID) ">%).Length \\f \"%lu2%pr1%ct8[" (rtos (cvunits 1 fa 6)) "]%th32\">%"))

Tu mets a la place :

        (setq lg (strcat "%<\\AcObjProp.16.2 Object(%<\\_ObjId " (itoa ID) ">%).Length \\f \"%lu2%pr2%ct8[" (rtos (cvunits 1 fa 6)) "]%th32\">%"))

pr2 a la place de pr1

La Sante, Bye, lecrabe

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Coucou,

La théorie de @lecrabe est correcte  😜  !

Comme j'ai dit, je n'ai fait que suivre les infos que tu m'as données, à savoir 1 chiffre après la virgule et non 2 (d'après ta capture d'écran du texte souhaité)...
Pour la hauteur de texte, j'ai préféré poser la question, mais en mettant  TEXTSIZE  (variable système) comme valeur par défaut.

Donc si tu veux que ton texte fasse 100mm de haut (et que tu bosses en mm), il te suffit de modifier toi-même la valeur de TEXTSIZE à 100 et tu l'auras comme valeur par défaut !

Je ne voulais tout simplement pas modifier la valeur de TEXTSIZE via le programme car cela correspond à ta méthode de travail donc je préfère éviter de la changer pour toi 😉

Bisous, Luna

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é