Aller au contenu

Modifier l'altimétrie d'une polyligne depuis attribut de blocs


Mfruncad

Messages recommandés

Bonjour, 

Je souhaite modifier l'altimétrie des sommets d'une polyligne à partir des attributs de blocs qui sont sur ces derniers.

Ces polylignes 3D représentent des réseaux avec une altimétrie "Altitude_GS" je souhaite que le nouveau Altitude_GS = Altitude_GS - DIAM/1000

Comme par exemple

image.png.c7c5580a8dc89eeee04b2075a94816d6.png

Ici il faudrait que Altitude_GS = 12.93 - 0.200 = 12.73

Et que ça change aussi l'élévation du sommet Z = 12.73

image.png.359e6d2580669f89306194dd1bce46e3.png

Est-ce qu'il y'aurait un LISP capable de faire ça ? 

L'attribut DIAM n'est pas sur tous les blocs, mais il faudrait que dès qu'il en trouve un il l'applique sur toute la polyligne.

Merci !

(Je vous mets le fichier sur le quel je voudrais faire ça)

IC_Base_import.dwg

Lien vers le commentaire
Partager sur d’autres sites

Coucou @Mfruncad,
Personnellement j'ai un soucis avec la définition :

Altitude_GS = Altitude_GS - DIAM/1000

Car si l'on reprends ton exemple, tu comptes modifier la valeur de ton attribut Altitude_GS à partir de sa propre valeur. Autrement dit, si on lance le programme une première fois, on a au début :

Altitude_GS = 12.93

Puis une fois le programme exécuté :

Altitude_GS = 12.93 - 0.200 = 12.73

Si maintenant je relance le programme une nouvelle fois :

Altitude_GS = 12.73 - 0.200 = 12.53

Et ainsi de suite... En clair, comment savoir si le programme a déjà été exécuté sur les blocs en question si tu redéfinis la valeur d'un attribut à partir de sa propre valeur ? Le programme ne fera qu'enterrer tes réseaux à chaque nouvelle exécution, entraînant des erreurs certaines (enfin c'est juste mon point de vue, peut-être ai-je mal saisie ta demande...).

Ensuite, pourquoi l'attribut DIAM n'est pas sur tous les blocs présents sur la polyligne ? Est-ce un choix de ta part ou la flemme d'harmoniser la valeur sur l'ensemble des blocs ?

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

Hello @lecrabe,

Le but c'est de traiter tous les points altitudes de la polyligne et de retirer DIAM à chaque sommet de la polyligne. Mais l'attribut DIAM n'est pas dans tous les blocs. Il suffit d'en trouver un par polyligne et de le soustraire à toute la polyligne concernée. Merci et n'hésite pas si tu as d'autres questions ! 

Lien vers le commentaire
Partager sur d’autres sites

@Luna , 

Effectivement pour Altitude_GS, mais ça me paraissait plus simple. Sinon il faudrait créer un nouvelle attribut « Altitude_Fe » qui serait Altitude_Fe = Altitude_GS - DIAM.

Pour le DIAM c’est une des données que je reçois qui ne sont pas toujours complète. Mais on pourrait penser à une boucle qui lit chaque point, par exemple 

Pt_5 

      Altitude_GS = 12.00

      DIAM(pt_5) = 200 (si DIAM(pt_5) = null alors DIAM(pt_5) = DIAM(pt_4)) 

      Altitude_Fe = 12.00 - 200/1000 = 11,80

(Normalement chaque extrémité de polyligne à un DIAM)

 

Et affecter la nouvelle valeur d’élévation (Altitude_Fe) au sommet de la polyligne correspondant.

Et si possible, que largeur global de la polyligne soit égale à DIAM/1000

 

Merci encore !

 

 

Lien vers le commentaire
Partager sur d’autres sites

Coucou,
Je n'aurais pas le temps de m'en occuper rapidement, mais je vais voir ce qu'il est possible de faire. En effet, rajouter un attribut Altitude_Fe me semble être la meilleure solution (car aucune perte d'information et/ou risque d'erreur !), mais dans ce cas, il faudrait que tu t'occupes de mettre à jour tes blocs pour le prendre en compte (envoi d'un .dwg corrigé ?).

Pour la largeur globale, c'est impossible car tes réseaux sont des polylignes 3D or cette propriété n'existe que pour des polylignes 2D.

Bisous,
Luna

  • Like 1
Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Je te propose un code qui va modifier tes attributs concernés et placer un MTEXT avec le diamètre du tuyau au milieu de la polyligne 3D.

Je ne modifie pas la polyligne3D mais lui ajoute une XDATA qui lui attribue le diamètre du tuyau en mm en tant que réel.

A toi de faire ce que tu veux de cette donnée XData (modifier ta polyligne, ou exporter la donnée ou encore autre chose)

Sur ton dessin cela à l'air de fonctionner, mais le traitement  peut être long (forcément, tu as énormément de blocs dans ton dessin et de polylignes3D)

Pour info sur ma machine cela dure environ 4mn avec le processeur qui s’emballe à 20%), mais si tu es patient cela fait le job: Autocad n'es pas planté mais il bosse...

A la fin toutes tes polylignes3D concernées sont sélectionnées, tu peux donc les changer de couleur, de calque ou autre propriétés pour mieux les repérer.

Cela va t-il t'avancer?

(defun l-coor2l-pt (obj lst / )
  (if lst
    (cons
      (list
        (car lst)
        (cadr lst)
        (caddr lst)
      )
      (l-coor2l-pt obj (cdddr lst))
    )
  )
)
(defun make_mtext (pt rot txt lay / )
  (setq nw_obj
    (vla-addMtext Space
      (vlax-3d-point pt)
      0.0
      txt
    )
  )
  (mapcar
    '(lambda (pr val)
      (vlax-put nw_obj pr val)
    )
    (list 'AttachmentPoint 'Height 'DrawingDirection 'StyleName 'Layer 'Rotation 'BackgroundFill)
    (list 5 0.3 5 "Réseaux_Arial" lay rot -1)
  )
)
(defun c:test ( / js dfzz AcDoc Space n ss ent obj_vla l_coor l_diam atts dlt_z)
  (while
    (null
      (setq js
        (ssget "_X"
          (list
            '(0 . "POLYLINE")
            '(-4 . "&") '(70 . 8)
            (cons 67 (if (eq (getvar "CVPORT") 1) 1 0))
            (cons 410 (if (eq (getvar "CVPORT") 1) (getvar "CTAB") "Model"))
          )
        )
      )
    )
  )
  (if (not dfzz) (setvar "USERR1" 1E-02))
  (initget 4)
  (if (not (setq dfzz (getdist (strcat "\nRayon de recherche? <" (rtos (getvar "USERR1") 2 2) "> : "))))
    (setq dfzz (getvar "USERR1"))
    (setvar "USERR1" dfzz)
  )
  (if (null (tblsearch "appid" "RESEAU_TUYAUX"))
    (regapp "RESEAU_TUYAUX")
  )
  (setq
    AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))
    Space
    (if (= 1 (getvar "CVPORT"))
      (vla-get-PaperSpace AcDoc)
      (vla-get-ModelSpace AcDoc)
    )
  )
  (repeat (setq n (sslength js))
    (setq
      ss (ssadd)
      ent (ssname js (setq n (1- n)))
      obj_vla (vlax-ename->vla-object ent)
      l_coor (l-coor2l-pt obj_vla (vlax-get obj_vla 'Coordinates))
      l_diam nil
    )
    (mapcar
      '(lambda (x)
        (cond
          (
            (ssget "_X"
              (list
                '(0 . "INSERT") '(2 . "IC_11_*") '(66 . 1)
                (cons 67 (if (eq (getvar "CVPORT") 1) 1 0))
                (cons 410 (if (eq (getvar "CVPORT") 1) (getvar "CTAB") "Model"))
                '(-4 . "<AND")
                  '(-4 . ">=,>=")
                  (cons 10 (mapcar '- (list (car x) (cadr x)) (list dfzz dfzz)))
                  '(-4 . "<=,<=")
                  (cons 10 (mapcar '+ (list (car x) (cadr x)) (list dfzz dfzz)))
                '(-4 . "AND>")
              )
            )
            (setq
              ss
              (vla-get-activeselectionset
                (vla-get-activedocument
                  (vlax-get-acad-object)
                )
              )
            )
            (vlax-for blk ss
              (setq atts (vlax-invoke blk 'getattributes))
              (foreach att atts
                (if (and (eq (vla-get-tagstring att) "DIAM") (/= (vla-get-textstring att) ""))
                  (setq l_diam (vla-get-textstring att))
                )
              )
            )
            (cond
              (l_diam
                (setq dlt_z (read (substr l_diam 4)))
                (vlax-for blk ss
                  (setq atts (vlax-invoke blk 'getattributes))
                  (foreach att atts
                    (if (eq (vla-get-tagstring att) "Altitude_GS")
                      (vla-put-textstring att (rtos (- (read (vla-get-textstring att)) (* 1E-3 dlt_z)) 2 2))
                    )
                  )
                )
                (entmod
                  (append
                    (entget ent)
                    (list
                      (list -3
                        (list
                          "RESEAU_TUYAUX"
                          (cons 1002 "{")
                          (cons 1000 "DIAM")
                          (cons 1040 dlt_z)
                          (cons 1002 "}")
                        )
                      )
                    )
                  )
                )
                (make_mtext
                  (vlax-curve-getPointAtParam obj_vla (* 0.5 (vlax-curve-getEndParam obj_vla)))
                  (angle '(0. 0. 0.) (vlax-curve-getfirstderiv obj_vla (* 0.5 (vlax-curve-getEndParam obj_vla))))
                  l_diam
                  (vla-get-layer obj_vla)
                )
              )
            )
          )
        )
      )
      l_coor
    )
  )
  (sssetfirst nil
    (ssget "_X"
      (list
        '(0 . "POLYLINE")
        '(-4 . "&") '(70 . 8)
        (cons 67 (if (eq (getvar "CVPORT") 1) 1 0))
        (cons 410 (if (eq (getvar "CVPORT") 1) (getvar "CTAB") "Model"))
        '(-3 ("RESEAU_TUYAUX"))
      )
    )
  )
  (prin1)
)

NB:

Fait un _AUDIT de ton dessin avant car tu as beaucoup d'erreur sur tes POLY3D (option corriger les erreurs)

  • Like 2

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

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • 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é