Mfruncad Posté(e) le 8 avril Posté(e) le 8 avril 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 : 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 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 Citer
lecrabe Posté(e) le 8 avril Posté(e) le 8 avril Hello ET si N Blocs sur la MEME Polyligne 3D, on ne traite l Altitude en Attribut que depuis le 1er Bloc trouve et on ignore les autres !? Bye, lecrabe Citer Autodesk Expert Elite Team
Luna Posté(e) le 8 avril Posté(e) le 8 avril 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 Citer
Mfruncad Posté(e) le 8 avril Auteur Posté(e) le 8 avril 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 ! Citer
Mfruncad Posté(e) le 9 avril Auteur Posté(e) le 9 avril @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 ! Citer
Luna Posté(e) le 11 avril Posté(e) le 11 avril 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 1 Citer
bonuscad Posté(e) le 11 avril Posté(e) le 11 avril 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) 2 Citer Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Mfruncad Posté(e) le 16 avril Auteur Posté(e) le 16 avril Bonjour @bonuscad, Merci beaucoup, ça fonctionne à merveille, sur mon PC ça s'est fait quasiment instantanément ! Encore Merci ! Citer
Messages recommandés