ldidber Posté(e) le 29 octobre 2004 Posté(e) le 29 octobre 2004 J'ai dessiné un plan de réseaux sur AutoCad 2004 avec des fil d'eau dans un repère NGF. Ces niveaux sont de simples textes. Aujourd'hui le chantier me demande (à juste titre) de mettre ces fil d'eau non pas en NGF mais par rapport à un niveau donné. Par exemple, j'ai un fil d'eau avec 358.62NGF et je voudrais obtenir -0.60. Je pense que c'est faisable en Lisp mais je n'ai pas le temps de me pencher dessus et je suis sûr que quelqu'un peut me venir en aide ;)
Patrick_35 Posté(e) le 29 octobre 2004 Posté(e) le 29 octobre 2004 SalutC'est l'expérience qui rentre. ;) Ton niveau, tu le veux à la place de la cote NGF ou juste en dessous, au dessus, à sa droite ou encore à sa gauche ? :exclam: Encore une chose, tes niveaux, tu les sélectionnes un par un ou on automatise la sélection, dans ce cas, il faut quelque chose que distingue ton texte des autres (calque, style, hauteur et j'en passe) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
ldidber Posté(e) le 29 octobre 2004 Auteur Posté(e) le 29 octobre 2004 Salut Patrick En fait je pense garder mes niveaux NGF et rajouter les autres niveaux en dessous.Tous mes textes sont dans un calque bien défini. :Par exemple, Calque EP dans lequel j'ai mes textes niveau ainsi que les réseaux en eux-mêmes. MErci d'avance
Patrick_35 Posté(e) le 29 octobre 2004 Posté(e) le 29 octobre 2004 Tout chaud, tout frais(setq nivbase (getreal "\nNiveau de référence : ")) (setq sel (ssget "x" (list (cons 0 "TEXT") (cons 8 "0")))) ; sélectionne les textes sur le calque 0, à modifier en fonction des besoins (setq n 0) (while (ssname sel n) (setq obj (entget (ssname sel n))) (setq txt (vl-string-subst "" "NGF" (cdr (assoc 1 obj)))) (setq val_txt (rtos (- (atof txt) nivbase) 2)) (setq pos_y (- (caddr (assoc 11 obj)) (* (cdr (assoc 40 obj)) 1.5))) (setq ent (vl-remove (assoc -1 obj) obj)) (setq ent (vl-remove (assoc 330 ent) ent )) (setq ent (vl-remove (assoc 5 ent) ent )) (setq ent (subst (cons 11 (list (cadr (assoc 11 ent)) pos_y (cadddr (assoc 11 ent)))) (assoc 11 ent) ent)) (setq ent (subst (cons 1 val_txt) (assoc 1 ent) ent)) (entmake ent) (setq n (1+ n)) )@+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
didier Posté(e) le 29 octobre 2004 Posté(e) le 29 octobre 2004 hello,la réponse de Patrick_35 est très bonne,mais pour une efficacité maximale,je pense qu'il faudrait en profiter pour,créer un bloc avec trois attributs,un : l'altitude NGF du Fil d'Eau,deux : L'altitude NGF du point de référence localtrois : la différence entre ces deux points. Ainsi traité, le fichier deviendra "intelligent",car si on change le point de référence pour une raison ou une autre,il n'y a plus qu'à faire un petit lisp qui va re-coter Tous les Fil d'Eau.étonnant non ?et tonnant non ? Éternel débutant... Mon site perso : Programmer dans AutoCAD
ldidber Posté(e) le 29 octobre 2004 Auteur Posté(e) le 29 octobre 2004 Merci Patrick :D Le seul truc, c'est que ça réecrit le texte à la place de l'autre sans effacer le premier, c'est bien ça?
Patrick_35 Posté(e) le 2 novembre 2004 Posté(e) le 2 novembre 2004 Bonjour à vous deuxJe suis bien d'accord avec toi didier, rien ne vaut les attributs, mais bon, on fait avec ce que l'on a ;) Pour ldidber Je viens de voir qu'il y avait un oubli dans le lisp. Je n'ai pas tenu compte des justificationsNormalement, ton texte se positionne en dessous du texte d'origine.(setq nivbase (getreal "\nNiveau de référence : ")) (setq sel (ssget "x" (list (cons 0 "TEXT") (cons 8 "0")))) ; sélectionne les textes sur le calque 0, à modifier en fonction des besoins (setq n 0) (while (ssname sel n) (setq obj (entget (ssname sel n))) (setq txt (vl-string-subst "" "NGF" (cdr (assoc 1 obj)))) (setq val_txt (rtos (- (atof txt) nivbase) 2)) (if (and (/= (cadr (assoc 11 obj)) 0) (/= (caddr (assoc 11 obj)) 0)) (setq codedxf 11) (setq codedxf 10) ) (setq pos_y (- (caddr (assoc codedxf obj)) (* (cdr (assoc 40 obj)) 1.5))) (setq ent (vl-remove (assoc -1 obj) obj)) (setq ent (vl-remove (assoc 330 ent) ent )) (setq ent (vl-remove (assoc 5 ent) ent )) (setq ent (subst (cons codedxf (list (cadr (assoc codedxf ent)) pos_y (cadddr (assoc codedxf ent)))) (assoc codedxf ent) ent)) (setq ent (subst (cons 1 val_txt) (assoc 1 ent) ent)) (entmake ent) (setq n (1+ n)) ) ps : Tous les textes qui sont sélectionnés sont sur le calques 0 (code dxf 8) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
ldidber Posté(e) le 2 novembre 2004 Auteur Posté(e) le 2 novembre 2004 SUPER PATRIIIIIICK ;) ça fonctionne mieux :D Une question me taraude: dans le lisp, je vois un NGF entre guillemets, normalement ça devrait bien NGF non :exclam: mais je n'ai pas de texte NGF dans mon dessin après exécution du lisp
Patrick_35 Posté(e) le 2 novembre 2004 Posté(e) le 2 novembre 2004 Quand je récupère le texte, je ne sais pas ce qui est écrit dedans et d'après ta demande, tu indiquais un niveau de 358.62NGF et comme j'ai besoin d'une valeur numérique pour faire une soustraction, je dois virer le NGF afin de convertir le texte 358.62 en réel. Voilà pourquoi c’est là @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant