sosun38 Posté(e) le 17 décembre 2007 Posté(e) le 17 décembre 2007 Bonjour, je suis nouveau membre et je ne sais pas du tout programmer.Mais j'aurrais besoins d'une routine. Voila mon problème, je travail sur des plans topo avec souvent un centaines de courbes de niveau (polyligne 2D et 3D).Mon soucis est: -de savoir si on peut par une routine faire un "mesurer" en une seule commande sur toutes les polylignes en même temps? -puis une fois le mesurer effectuer, savoir si par une routine on peut tracer des polyligne 3D avec les points obtenus séparément par altitude? Merci d'avance pour vos réponse... sosun38 à chacun son pas, qui rythme son avenir...
pascal19 Posté(e) le 17 décembre 2007 Posté(e) le 17 décembre 2007 J'en ai une mais je sais pas si ça marche avec les polylignes 3DLes PRO du LISP auront surement mieux: (defun C:lpol () (setvar "cmdecho" 0) (prompt "\nchoix des polylignes...") (setq gr (ssget)) (setq tot 0 cont 0) (repeat (sslength gr) (command "_AREA" "_o" (ssname gr cont)) (setq tot (+ tot (getvar "perimeter"))) (setq cont(+ 1 cont)) ) (princ "\nlongueur totale: ") (princ tot) (princ) )
sosun38 Posté(e) le 17 décembre 2007 Auteur Posté(e) le 17 décembre 2007 Merci pour ta réponse pascal19....Ta routine fonctionne très bien...mais me donne la longueur totale des polylignes. mon soucis c'est quand on fait un mesurer on a: """" Commande: _measure Choix de l'objet à mesurer: Spécifiez la longueur du segment ou [bloc]: """""ben moi je voudrais par exemple choisir X polylignes et spécifier une longueur de 5, c'est à dire qu'autocad m'insère des points tous les 5 m sur les X polylignes.Le but étant de faire cette opération sur toutes mes polylignes en même temps...si possible. J'espère être plus clair cette fois-ci.....désolé et merci encore pour ta réponse. Sosun38. à chacun son pas, qui rythme son avenir...
(gile) Posté(e) le 17 décembre 2007 Posté(e) le 17 décembre 2007 Salut, La deamnde est un peu plus claire. (defun c:mmes (/ ss di ent ec) (and (setq ss (ssget '((0 . "*POLYLINE")))) (setq di (getdist "\nSpécifiez la longueur du segment: ")) (setq n 0) (setq ec (getvar "CMDECHO")) (setvar "CMDECHO" 0) (while (setq ent (ssname ss n)) (command "_.measure" ent di) (setq n (1+ n)) ) (setvar "CMDECHO" ec) ) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
pascal19 Posté(e) le 17 décembre 2007 Posté(e) le 17 décembre 2007 j'étais pas trés loin quand même: (defun C:mespol ()(setvar "cmdecho" 0)(setq mesur1 (getreal "distance points"))(prompt "\nchoix des polylignes...")(setq gr (ssget))(setq tot 0 cont 0)(repeat (sslength gr)(command "mesurer" (ssname gr cont) mesur1)(setq cont(+ 1 cont)))) en esperant que ça marche mieux... mais je me suis fais grillé par gile
sosun38 Posté(e) le 17 décembre 2007 Auteur Posté(e) le 17 décembre 2007 Merci à pascal19 et à gile pour vos réponse..J'essaye tout ça demain au taff et je vous tiens au courant.Merci encore... Sinon pour ma deuxieme requete c'est faisable ou pas? " ....... savoir si par une routine on peut tracer des polyligne 3D avec une multidudes de points avec plusieurs altitudes dans un même dessin?C'est à dire que tous les points ayant la même altitudes seront au final sur la même polyligne (une polyligne par altitude) et tout ceci en une seule opération...." J'en demande bcp peut-être? Merci.Sosun38... à chacun son pas, qui rythme son avenir...
(gile) Posté(e) le 17 décembre 2007 Posté(e) le 17 décembre 2007 Sinon pour ma deuxieme requete c'est faisable ou pas? Oui c'est faisable.Sélectionner tous les points du dessin ou d'un calque déterminé : aucun souci.En fair des sous listes par altitude : très facile.Mais les joindre en une polyligne pose quand même une sérieuse question : dans quel ordre doivent ils être joints ? Sur quels critères trier les points ?Je vois mal comment obtenir une polyligne qui correspondrait à ce que tu espères sans intervention de l'utilisateur. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
sosun38 Posté(e) le 17 décembre 2007 Auteur Posté(e) le 17 décembre 2007 Salut gile.. voilà jusqu'a présent je faisait un mesurer sur une polyligne, ainsi j'obtenais un nombre de points à distance égale sur ma polyligne. Puis je rajoutais le premier sommet et le dernier sommet de ma polyligne. Enfin je fesais une fenetre de selection de tous ces points via le lisp "ptexport" ainsi j'obtenait les coordonnées en XYZ de tous mes points dans un fichier txt. Puis via le script suivant:_3dpolyX,Y,Z..une ligne par point..X,Y,Z Ainsi je retraçais ma polyligne à quelques point près identique à l'initial: tous mes sommet sont a distances egales, sauf le dernier sommet. En conclusion mon but étant de redessiner des polylignes existantes ( à sommets quelconques) en polylignes avec des sommets à interdistances égales et choisi par moi. Mais déjà avec vos réponse je pense bien avancer...je vous tiens au news des demain. Sur ce bonne soirée. Sosun38. à chacun son pas, qui rythme son avenir...
(gile) Posté(e) le 17 décembre 2007 Posté(e) le 17 décembre 2007 Je ne suis toujours pas très sur de comprendre, mais s'il s'agit de redessiner les polylignes sélectionnées avec des sommets equidistants, tu peux esayer ça : EDIT : code corrigé (vl-load-com) (defun c:test (/ di len nb plst) (vl-load-com) (or *acdoc* (setq *acdoc* (vla-get-Activedocument (vlax-get-acad-object))) ) (if (and (ssget '((0 . "*POLYLINE"))) (setq di (getdist "\nSpécifiez la longueur du segment: ")) ) (progn (vla-StartUndoMark *acdoc*) (vlax-for p (vla-get-ActiveSelectionSet *acdoc*) (setq len (vlax-curve-getDistAtParam p (vlax-curve-getEndParam p) ) nb (fix (/ len di)) plst (list (vlax-curve-getPointAtParam p (vlax-curve-getEndParam p) ) ) ) (repeat nb (setq plst (cons (vlax-curve-getPointAtDist p (* nb di)) plst) nb (1- nb) ) ) (setq plst (cons (vlax-curve-getStartPoint p) plst)) (vlax-invoke (vla-get-ModelSpace *acdoc*) 'add3dPoly (apply 'append plst) ) (vla-delete p) ) (vla-endUndoMark *acdoc*) ) ) (princ) ) [Edité le 18/12/2007 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
sosun38 Posté(e) le 18 décembre 2007 Auteur Posté(e) le 18 décembre 2007 Salut gile... Merci avant tout pour le lisp mesure qui fonctionne très bien c'est exactement ce que je voulais. Merci à toi aussi pascal19, le tiens aussi fonctionne. Sinon gile pour redessiner les polylignes sélectionnées avec des sommets equidistants quand je lance ton lisp test j'ai le message svt:erreur: no function definition: VLAX-GET-ACAD-OBJECT Sinon ne serait-il pas possible de faire une routine qui va chercher les coordonées dans un fichier txt du genre: X,Y,Z 1018416.87223455,217661.86784110,1294.000000001018416.90029552,217661.85734674,1294.000000001018419.83798282,217660.88245208,1294.000000001018419.89921682,217660.86736907,1294.000000001018422.67777894,217660.41155730,1294.000000001018422.73697292,217660.40631996,1294.000000001018427.22924676,217660.34388384,1294.000000001018427.24245587,217660.34348193,1294.000000001018430.20133243,217660.20449843,1294.000000001018430.22999129,217660.20418020,1294.000000001018434.44781797,217660.30850700,1294.000000001018434.48883074,217660.30741675,1294.000000001018438.95369564,217659.95897272,1294.000000001018438.99133628,217659.95781329,1294.000000001018442.54007705,217660.01565426,1294.000000001018442.97293809,217658.99325853,1293.000000001018438.72191615,217658.92397108,1293.000000001018438.68427550,217658.92513051,1293.000000001018435.06288183,217659.20774892,1293.000000001018435.02186905,217659.20883917,1293.000000001018430.18591792,217659.08922322,1293.000000001018430.15725906,217659.08954145,1293.000000001018426.76527181,217659.24886891,1293.000000001018426.75206271,217659.24927082,1293.000000001018422.88529629,217659.30301329,1293.000000001018422.82610231,217659.30825062,1293.000000001018419.70547063,217659.82017752,1293.000000001018419.64423663,217659.83526053,1293.000000001018416.34728004,217660.92938152,1293.000000001018416.31921907,217660.93987588,1293.000000001018406.86137565,217664.88670894,1293.000000001018406.78606921,217664.90973543,1293.000000001018406.77790490,217664.91137468,1293.000000001018443.40579914,217657.97086281,1292.000000001018438.45249601,217657.89012886,1292.000000001018438.41485537,217657.89128830,1292.000000001018435.63693290,217658.10808108,1292.000000001018435.59592013,217658.10917133,1292.000000001018430.14184455,217657.97426624,1292.000000001018430.11318569,217657.97458448,1292.000000001018426.28808776,217658.15425588,1292.000000001018426.27487865,217658.15465779,1292.000000001018423.03361966,217658.19970661,1292.000000001018422.97442568,217658.20494395,1292.000000001018419.51172443,217658.77298596,1292.000000001018419.45049044,217658.78806897,1292.000000001018415.79426456,217660.00141630,1292.000000001018443.83866019,217656.94846708,1291.000000001018438.18307588,217656.85628665,1291.000000001018438.14543523,217656.85744608,1291.000000001018436.21098398,217657.00841325,1291.000000001018436.16997121,217657.00950350,1291.000000001018430.09777118,217656.85930927,1291.000000001018430.06911232,217656.85962750,1291.000000001018425.81090370,217657.05964286,1291.000000001018425.79769460,217657.06004477,1291.000000001018423.18194303,217657.09639994,1291.000000001018423.12274905,217657.10163727,1291.000000001018419.31797824,217657.72579440,1291.000000001018419.25674424,217657.74087741,1291.000000001018415.24124908,217659.07345108,1291.000000001018415.21318811,217659.08394544,1291.000000001018374.41679091,217706.91515332,1295.000000001018377.77328399,217701.05640481,1295.000000001018377.81688273,217700.99466744,1295.000000001018378.79735964,217699.85277337,1295.000000001018378.80035120,217699.84932924,1295.000000001018379.61771811,217698.91907727,1295.000000001018379.65703276,217698.86608846,1295.000000001018383.14973379,217693.24223545,1295.000000001018383.15160253,217693.23925576,1295.000000001018385.75493322,217689.12853705,1295.00000000 Cette routine lirait ce fichier de la sorte:il trace une polyligne P1 en commançant par la ligne 1 en (X1,Y2,Za) comme sommet 1 puis il continu la polyligne P1 en prenant la ligne 2 en (X2,Y2,Za) pour le sommet 2 ainsi de suite pour chaque sommet et quand il arrive a une ligne n en (Xn,Yn,Zb) ou le Zb est different du Za alors il se dit que le dernier sommet de ma polyligne P1 est le point (Xn-1,Yn-1,Za) de la ligne n-1.Et alors il commence la polyligne P2 en prenant comme sommet 1 le point (Xn,Yn,Zb) de la ligne n.........jusqu'à ce qu'il rencontre un nouveau point avec un Zc different....et là il attaque la polyligne P3....ainsi de suite jusqu'à ce qu'il arrive a une ligne vide. Voilà...mon idée. Merci. sosun38 PS: je cherche de la doc pour me former au lips. à chacun son pas, qui rythme son avenir...
(gile) Posté(e) le 18 décembre 2007 Posté(e) le 18 décembre 2007 Sinon gile pour redessiner les polylignes sélectionnées avec des sommets equidistants quand je lance ton lisp test j'ai le message svt:erreur: no function definition: VLAX-GET-ACAD-OBJECT J'ai (encore) oublié le (vl-load-com) en début de LISP, je corrige le code, recharge le. Sinon ne serait-il pas possible de faire une routine qui va chercher les coordonées dans un fichier txt du genre: X,Y,Z Oui c'est possible, j'essaye de faire quelque chose... Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
sosun38 Posté(e) le 18 décembre 2007 Auteur Posté(e) le 18 décembre 2007 merci ça marche.Génial.en plus on peut selectionner plusieurs polylignes.Merci encore gile. à chacun son pas, qui rythme son avenir...
(gile) Posté(e) le 18 décembre 2007 Posté(e) le 18 décembre 2007 Voilà pour faire des poly3d (de même altitude (?!)) à partir d'un fichier de points. Le fichier doit être du type de ce que tu as donné : ne contenir que des points dans l'ordre dans lequel doivent être dessinée les polylignes. (defun c:file2poly (/ path file lst pl alt tmp) (vl-load-com) (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object))) ) (if (setq path (getfiled "Choisir le fichier" "" "txt" 0)) (progn (setq file (open path "r")) (while (setq line (read-line file)) (setq lst (cons (str2lst line ",") lst)) ) (close file) (while lst (setq alt (caddar lst) tmp (list (mapcar 'atof (car lst))) lst (cdr lst) ) (while (= (caddar lst) alt) (setq tmp (cons (mapcar 'atof (car lst)) tmp) lst (cdr lst) ) ) (vlax-invoke (vla-get-ModelSpace *acdoc*) 'add3dPoly (apply 'append tmp) ) ) ) ) (princ) ) ;; str2lst ;; Transforme un chaine avec séparateur en liste de chaines ;; ;; Arguments ;; str : la chaine à transformer en liste ;; sep : le séparateur ;; ;; Exemples ;; (str2lst "a b c" " ") -> ("a" "b" "c") ;; (str2lst "1,2,3" ",") -> ("1" "2" "3") ;; (mapcar 'read (str2lst "1,2,3" ",")) -> (1 2 3) (defun str2lst (str sep / pos) (if (setq pos (vl-string-search sep str)) (cons (substr str 1 pos) (str2lst (substr str (+ (strlen sep) pos 1)) sep) ) (list str) ) ) [Edité le 18/12/2007 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
sosun38 Posté(e) le 18 décembre 2007 Auteur Posté(e) le 18 décembre 2007 Salut gile,je viens de tester "file2poly".Une fois que je selectionne mon fichier .txt j'ai le message suivant:erreur: no function definition: STR2LST Merci encore. sosun38 à chacun son pas, qui rythme son avenir...
(gile) Posté(e) le 18 décembre 2007 Posté(e) le 18 décembre 2007 Désolé :calim: :calim: :calim: :calim: C'est encore un oubli, je joins la routine str2lst au code ci dessus Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
sosun38 Posté(e) le 19 décembre 2007 Auteur Posté(e) le 19 décembre 2007 Salut gile!C'est génial exactement ce que je voulais...IL me reste juste a me mettre a la programation.A ce sujet tu n'aurais pas un livre ou un tutorial à me conseiller? MERCI ENCORE C'EST SUPER........ sosun38 à chacun son pas, qui rythme son avenir...
sosun38 Posté(e) le 28 janvier 2008 Auteur Posté(e) le 28 janvier 2008 Salut Gile, Est-il possible de faire deux lisp dans le même principe de celui que tu m'avaits fait "file2poly"mais à la différnce que pour ces 2 lisp : _ l'un pour faire des poly3d (de même abscisse (X)) à partir d'un fichier de points. _ l'autre pour faire des poly3d (de même ordonnée (Y)) à partir d'un fichier de points. Merci bien d'avance. J'utilise beaucoup "file2poly" qui me simplifie beaucoup la vie. Voilà pour faire des poly3d (de même altitude (?!)) à partir d'un fichier de points. Le fichier doit être du type de ce que tu as donné : ne contenir que des points dans l'ordre dans lequel doivent être dessinée les polylignes. (defun c:file2poly (/ path file lst pl alt tmp) (vl-load-com) (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object))) ) (if (setq path (getfiled "Choisir le fichier" "" "txt" 0)) (progn (setq file (open path "r")) (while (setq line (read-line file)) (setq lst (cons (str2lst line ",") lst)) ) (close file) (while lst (setq alt (caddar lst) tmp (list (mapcar 'atof (car lst))) lst (cdr lst) ) (while (= (caddar lst) alt) (setq tmp (cons (mapcar 'atof (car lst)) tmp) lst (cdr lst) ) ) (vlax-invoke (vla-get-ModelSpace *acdoc*) 'add3dPoly (apply 'append tmp) ) ) ) ) (princ) ) ;; str2lst ;; Transforme un chaine avec séparateur en liste de chaines ;; ;; Arguments ;; str : la chaine à transformer en liste ;; sep : le séparateur ;; ;; Exemples ;; (str2lst "a b c" " ") -> ("a" "b" "c") ;; (str2lst "1,2,3" ",") -> ("1" "2" "3") ;; (mapcar 'read (str2lst "1,2,3" ",")) -> (1 2 3) (defun str2lst (str sep / pos) (if (setq pos (vl-string-search sep str)) (cons (substr str 1 pos) (str2lst (substr str (+ (strlen sep) pos 1)) sep) ) (list str) ) ) [Edité le 18/12/2007 par (gile)] à chacun son pas, qui rythme son avenir...
(gile) Posté(e) le 28 janvier 2008 Posté(e) le 28 janvier 2008 Salut, Voilà deux LISP : file2poly_x pour les polys de même abcisse et file2poly_y pour les polys de même ordonnée.NOTA, la routine str2lst doit être chargée (defun c:file2poly_x (/ path file lst pl alt tmp) (vl-load-com) (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object))) ) (if (setq path (getfiled "Choisir le fichier" "" "txt" 0)) (progn (setq file (open path "r")) (while (setq line (read-line file)) (setq lst (cons (str2lst line ",") lst)) ) (close file) (while lst (setq alt (caar lst) tmp (list (mapcar 'atof (car lst))) lst (cdr lst) ) (while (= (caar lst) alt) (setq tmp (cons (mapcar 'atof (car lst)) tmp) lst (cdr lst) ) ) (vlax-invoke (vla-get-ModelSpace *acdoc*) 'add3dPoly (apply 'append tmp) ) ) ) ) (princ) ) (defun c:file2poly_y (/ path file lst pl alt tmp) (vl-load-com) (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object))) ) (if (setq path (getfiled "Choisir le fichier" "" "txt" 0)) (progn (setq file (open path "r")) (while (setq line (read-line file)) (setq lst (cons (str2lst line ",") lst)) ) (close file) (while lst (setq alt (cadar lst) tmp (list (mapcar 'atof (car lst))) lst (cdr lst) ) (while (= (cadar lst) alt) (setq tmp (cons (mapcar 'atof (car lst)) tmp) lst (cdr lst) ) ) (vlax-invoke (vla-get-ModelSpace *acdoc*) 'add3dPoly (apply 'append tmp) ) ) ) ) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
sosun38 Posté(e) le 28 janvier 2008 Auteur Posté(e) le 28 janvier 2008 merci beaucoup.je test tout ça demain et je te tiens au news. sosun38 à chacun son pas, qui rythme son avenir...
sosun38 Posté(e) le 29 janvier 2008 Auteur Posté(e) le 29 janvier 2008 Merci gile.ça marche très bien....Merci encore. sosun38. PS: Ou peut-on trouver un lexique du vocabulaire utilisé dans la programation lisp. à chacun son pas, qui rythme son avenir...
(gile) Posté(e) le 29 janvier 2008 Posté(e) le 29 janvier 2008 Salut, Dans l'aide d'AutoCAD >> Ressources supplémentaires >> Aide aux développeurs >> AutoLISP Reference >> AutoLISP Functions, mais c'est en anglais.Les fonction vla-* sont à adapter depuis ActiveX and VBA Reference. Ou en français ici Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Arcasdk Posté(e) le 29 janvier 2008 Posté(e) le 29 janvier 2008 Bonjour, Sinon y a ce site qui n'est pas mal du tout: http://aidacad.com/fr/autolisp.htm Voila voila, bonne journée, bon lisp <IMG SRC=http://peronfrederic.free.fr/banniere.jpg></IMG> <a href=www.formu-lan.net>www.FormuLan.net</a>
sosun38 Posté(e) le 29 janvier 2008 Auteur Posté(e) le 29 janvier 2008 salut, merci Arcasdk.merci Gile, mais ton lien ne fonctionne pas: "page non trouvée, retour à l'accueil". Bonne soirée.Sosun38. à chacun son pas, qui rythme son avenir...
sosun38 Posté(e) le 6 février 2008 Auteur Posté(e) le 6 février 2008 Je ne suis toujours pas très sur de comprendre, mais s'il s'agit de redessiner les polylignes sélectionnées avec des sommets equidistants, tu peux esayer ça : EDIT : code corrigé (vl-load-com) (defun c:test (/ di len nb plst)[Edité le 18/12/2007 par (gile)] Salut Gile,[u]PROBLEME 1:[/u]je te sollicite pour ton lisp "test". Est-ce que tu peux le perfectionner: c'est-à-dire que si dans la sélection des polylignes il y en a pour lesquelles le dernier segment (distance entre le dernier et avant dernier sommet) est inférieure à la longueur du segment choisi (sommets equidistants), alors le dernier sommet est supprimé lors du redessinage des polylignes. [u]PROBLEME 2:[/u]Est-ce que par une lisp on peut mettre toutes les lignes, polylignes, polylignes 3d d'un dessin dans le même sens de parcours ? Merci. sosun38 [Edité le 7/2/2008 par sosun38] à chacun son pas, qui rythme son avenir...
(gile) Posté(e) le 6 février 2008 Posté(e) le 6 février 2008 Salut, Problème 1 : EDIT: version corrigée (defun c:test (/ di len nb plst) (vl-load-com) (or *acdoc* (setq *acdoc* (vla-get-Activedocument (vlax-get-acad-object))) ) (if (and (ssget '((0 . "*POLYLINE"))) (setq di (getdist "\nSpécifiez la longueur du segment: ")) ) (progn (vla-StartUndoMark *acdoc*) (vlax-for p (vla-get-ActiveSelectionSet *acdoc*) (setq len (vlax-curve-getDistAtParam p (vlax-curve-getEndParam p) ) nb (fix (/ len di)) plst nil ) (repeat nb (setq plst (cons (vlax-curve-getPointAtDist p (* nb di)) plst) nb (1- nb) ) ) (setq plst (cons (vlax-curve-getStartPoint p) plst)) (vlax-invoke (vla-get-ModelSpace *acdoc*) 'add3dPoly (apply 'append plst) ) (vla-delete p) ) (vla-endUndoMark *acdoc*) ) ) (princ) ) Problème 2 :En ce qui concerne le "sens de parcour" on ne peut le déterminer "en aveugle" (sans intervention de l'utilisateur) que pour des polylignes fermées.Tu trouveras un LISP ici qui met toutes les polyligne (poly 2d et lwpolylignes) dans le sens trigonométrique. Pour les polylignes ouvertes, tu trouvreras ici un LISP (R_Pline) qui inverse le sens de la polyligne sélectionnée. [Edité le 12/2/2008 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
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