Aller au contenu

LISP pour récupérer dans un texte la surface d'une polyligne


brunomu

Messages recommandés

  • Réponses 55
  • Créé
  • Dernière réponse

Meilleurs contributeurs dans ce sujet

Meilleurs contributeurs dans ce sujet

On 09/05/2021 at 20:13, bonuscad said:

J'ai donc amélioré le lisp proposé dans ce fil.

Il permet dorénavant de choisir son unité de départ supposé du dessin, de faire une conversion du résultat dans une autre unité et de choisir la précision du résultat.

Par exemple on a réalisé un dessin en mm mais on souhaite avoir le résultat de la surface en cm² (sans changer l'unité de départ) avec une précision de 6 chiffres après la virgule.

Ces paramètres restent valables tant qu'on reste dans la boucle du choix d'un objet fermé, si on relance la procédure il faudra redéfinir les options.

Je suis resté dans le système métrique uniquement.


(vl-load-com)
(defun c:surf_curve-closed ( / AcDoc Space unite u_source u_target factor prec js nw_obj ename ent_text dxf_ent key)
  (setq
    AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))
    Space
    (if (= 1 (getvar "CVPORT"))
      (vla-get-PaperSpace AcDoc)
      (vla-get-ModelSpace AcDoc)
    )
  )
  (initget "KM M CM MM")
  (setq unite (getkword "\nChoisir l'unité source utilisé dans le dessin [KM/M/CM/MM] <M>: "))
  (if (not unite) (setq unite "M"))
  (setq u_source
    (cond
      ((eq unite "KM") "sq_km")
      ((eq unite "M") "sq_m")
      ((eq unite "CM") "sq_cm")
      ((eq unite "MM") "sq_mm")
    )
  )
  (initget "KM M CM MM")
  (setq unite (getkword "\nChoisir l'unité cible à utiliser pour le résultat [KM/M/CM/MM] <M>: "))
  (if (not unite) (setq unite "M"))
  (setq u_target
    (cond
      ((eq unite "KM") "sq_km")
      ((eq unite "M") "sq_m")
      ((eq unite "CM") "sq_cm")
      ((eq unite "MM") "sq_mm")
    )
  )
  (setq factor (cvunit 1 u_source u_target))
  (initget "0 1 2 3 4 5 6 7 8")
  (setq prec (getkword "\nPrécision du résultat [0/1/2/3/4/5/6/7/8] <2>: "))
  (if (not prec) (setq prec "2"))
  (princ "\nSélectionnez un objet fermé")
  (while
    (setq js
      (ssget "_+.:E:S"
        '(
          (-4 . "<OR")
            (-4 . "<AND")
              (0 . "*POLYLINE")
              (-4 . "<AND")
                (-4 . "<NOT") (-4 . "&") (70 . 120) (-4 . "NOT>")
                (-4 . "&") (70 . 1)
              (-4 . "AND>")
            (-4 . "AND>")
            (0 . "CIRCLE")
            (-4 . "<AND")
              (0 . "SPLINE")
              (-4 . "&") (70 . 1)
            (-4 . "AND>")
            (-4 . "<AND")
              (0 . "ELLIPSE")
              (41 . 0.0)
              (42 . 6.283185307179586)
            (-4 . "AND>")
          (-4 . "OR>")
        )
      )
    )
    (if (zerop (getvar "USERR1")) (setvar "USERR1" (/ (getvar "VIEWSIZE") 75.0)))
    (setq nw_obj
      (vla-addMtext Space
        (vlax-3d-point (trans (getvar "VIEWCTR") 1 0))
        0.0
        (strcat "S="(rtos (* factor (vlax-get-property (setq ename (vlax-ename->vla-object (ssname js 0))) "Area")) 2 (atoi prec)) (strcase unite T) "²")
      )
    )
    (mapcar
      '(lambda (pr val)
        (vlax-put nw_obj pr val)
      )
      (list 'AttachmentPoint 'Height 'DrawingDirection 'StyleName 'Layer 'Rotation 'BackgroundFill 'Color)
      (list 1 (getvar "USERR1") 5 (getvar "TEXTSTYLE") (getvar "CLAYER") 0.0 -1 250)
    )
    (setq
      ent_text (entlast)
      dxf_ent (entget ent_text)
      dxf_ent (subst (cons 90 1) (assoc 90 dxf_ent) dxf_ent)
      dxf_ent (subst (cons 63 255) (assoc 63 dxf_ent) dxf_ent)
    )
    (entmod dxf_ent)
    (while (and (setq key (grread T 4 0)) (/= (car key) 3))
      (cond
        ((eq (car key) 5)
          (setq dxf_ent (subst (cons 10 (trans (cadr key) 1 0)) (assoc 10 dxf_ent) dxf_ent))
          (entmod dxf_ent)
        )
      )
    )
    (vlax-put
      (vlax-ename->vla-object (entlast))
      'TextString
      (strcat
        "{\\fArial|b0|i0|c0|p34;"
        "%<\\AcObjProp.16.2 Object(%<\\_ObjId "
        (itoa (vla-get-ObjectID ename))
        ">%).Area \\f \"%lu2%pr"
        prec
        "%ps[S=,"
        (strcase unite T)
        "²]\%ct8["
        (rtos factor 2 12)
        "]\">%"
      )
    )
  )
  (prin1)
)

Top, ton, lisp, Bonuscad content-29.gif

Y aurait-il moyen de pouvoir supprimer S= et de faire en sorte que le champ se mette dans le calque courant ?

 

 

Steven________________________________________

Pour le taf; Windows (et ses emmerdes) sinon pas d'AutoCAD.

Pour le perso Linux Mint et pas de problèmes. Mais pas d'AutoCAD.

En rêve; AutoCAD sous Linux.

Lien vers le commentaire
Partager sur d’autres sites

 

On 15/05/2021 at 13:55, Steven said:

Top, ton, lisp, Bonuscad content-29.gif

Y aurait-il moyen de pouvoir supprimer S= et de faire en sorte que le champ se mette dans le calque courant ?

Merci,

Pour enlever le S=, c'est assez simple

à la ligne 69 tu retires  "S="

et à la ligne 103 tu retires  S=  (en laissant bien le "[" et la "," avant et après)

Pour le calque courant, c'est déjà le cas ?!?

Mais peut être ce qui te perturbe est la couleur forcée du texte qui n'est pas "ducalque"

Si c'est cela, change simple à la ligne 77 le dernier nombre entier fourni 250 en 256 (pour "bylayer")

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

23 hours ago, bonuscad said:

 

Merci,

Pour enlever le S=, c'est assez simple

à la ligne 69 tu retires "S="

et à la ligne 103 tu retire S= (en laissant bien le "[" et la "," avant et après)

Pour le calque courant, c'est déjà le cas ?!?

Mais peut être ce qui te perturbe est la couleur forcée du texte qui n'est pas "ducalque"

Si c'est cela, change simple à la ligne 77 le dernier nombre entier fourni 250 en 256 (pour "bylayer")

Je ne dirais qu'une seule chose : uup.gif

Steven________________________________________

Pour le taf; Windows (et ses emmerdes) sinon pas d'AutoCAD.

Pour le perso Linux Mint et pas de problèmes. Mais pas d'AutoCAD.

En rêve; AutoCAD sous Linux.

Lien vers le commentaire
Partager sur d’autres sites

On 14/05/2021 at 19:31, Steven said:

Si tu préfères rester dans un univers Autocadien, j'avais fait une vidéo pour montrer un exemple de ce qu'on peut faire avec AutoCAD Architecure et le calcul de surfaces.

Peut-être que ça pourrait t'intéresser.

 

Effectivement, puissante cette version !

Malheureusement, actuellement en collectivité, j'ai peur que l'on ne puisse pas décoller de MAP3D de si tôt... Je vais voir avec le service info...😁
Je vais me contenter d'une reconnaissance par hachure pour le moment. Étape suivante trouver la mise en tableau sur autocad de toutes les données😅

 

@bonuscadTrès bizarre, j'ai un "Â" qui s'introduit => "S=139651.98m²"

Une idée de la raison ?

Lien vers le commentaire
Partager sur d’autres sites

Quote

@bonuscadTrès bizarre, j'ai un "Â" qui s'introduit => "S=139651.98m²"

Une idée de la raison ?

Certainement un problème de codage du fichier.

Dans ton éditeur en récupérant en copié-collé depuis un navigateur internet tu l'a certainement récupéré en UFT-8, il faudrait le basculer en ANSI.

Notepad3 permet de faire cela aisément ...

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

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é