Aller au contenu

polylignes et routine


Messages recommandés

Posté(e)

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...

Posté(e)

J'en ai une mais je sais pas si ça marche avec les polylignes 3D

Les 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)

)

Posté(e)

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...

Posté(e)

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

Posté(e)

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

Posté(e)

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...

Posté(e)

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

Posté(e)

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:

_3dpoly

X,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...

Posté(e)

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

Posté(e)

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.00000000

1018416.90029552,217661.85734674,1294.00000000

1018419.83798282,217660.88245208,1294.00000000

1018419.89921682,217660.86736907,1294.00000000

1018422.67777894,217660.41155730,1294.00000000

1018422.73697292,217660.40631996,1294.00000000

1018427.22924676,217660.34388384,1294.00000000

1018427.24245587,217660.34348193,1294.00000000

1018430.20133243,217660.20449843,1294.00000000

1018430.22999129,217660.20418020,1294.00000000

1018434.44781797,217660.30850700,1294.00000000

1018434.48883074,217660.30741675,1294.00000000

1018438.95369564,217659.95897272,1294.00000000

1018438.99133628,217659.95781329,1294.00000000

1018442.54007705,217660.01565426,1294.00000000

1018442.97293809,217658.99325853,1293.00000000

1018438.72191615,217658.92397108,1293.00000000

1018438.68427550,217658.92513051,1293.00000000

1018435.06288183,217659.20774892,1293.00000000

1018435.02186905,217659.20883917,1293.00000000

1018430.18591792,217659.08922322,1293.00000000

1018430.15725906,217659.08954145,1293.00000000

1018426.76527181,217659.24886891,1293.00000000

1018426.75206271,217659.24927082,1293.00000000

1018422.88529629,217659.30301329,1293.00000000

1018422.82610231,217659.30825062,1293.00000000

1018419.70547063,217659.82017752,1293.00000000

1018419.64423663,217659.83526053,1293.00000000

1018416.34728004,217660.92938152,1293.00000000

1018416.31921907,217660.93987588,1293.00000000

1018406.86137565,217664.88670894,1293.00000000

1018406.78606921,217664.90973543,1293.00000000

1018406.77790490,217664.91137468,1293.00000000

1018443.40579914,217657.97086281,1292.00000000

1018438.45249601,217657.89012886,1292.00000000

1018438.41485537,217657.89128830,1292.00000000

1018435.63693290,217658.10808108,1292.00000000

1018435.59592013,217658.10917133,1292.00000000

1018430.14184455,217657.97426624,1292.00000000

1018430.11318569,217657.97458448,1292.00000000

1018426.28808776,217658.15425588,1292.00000000

1018426.27487865,217658.15465779,1292.00000000

1018423.03361966,217658.19970661,1292.00000000

1018422.97442568,217658.20494395,1292.00000000

1018419.51172443,217658.77298596,1292.00000000

1018419.45049044,217658.78806897,1292.00000000

1018415.79426456,217660.00141630,1292.00000000

1018443.83866019,217656.94846708,1291.00000000

1018438.18307588,217656.85628665,1291.00000000

1018438.14543523,217656.85744608,1291.00000000

1018436.21098398,217657.00841325,1291.00000000

1018436.16997121,217657.00950350,1291.00000000

1018430.09777118,217656.85930927,1291.00000000

1018430.06911232,217656.85962750,1291.00000000

1018425.81090370,217657.05964286,1291.00000000

1018425.79769460,217657.06004477,1291.00000000

1018423.18194303,217657.09639994,1291.00000000

1018423.12274905,217657.10163727,1291.00000000

1018419.31797824,217657.72579440,1291.00000000

1018419.25674424,217657.74087741,1291.00000000

1018415.24124908,217659.07345108,1291.00000000

1018415.21318811,217659.08394544,1291.00000000

1018374.41679091,217706.91515332,1295.00000000

1018377.77328399,217701.05640481,1295.00000000

1018377.81688273,217700.99466744,1295.00000000

1018378.79735964,217699.85277337,1295.00000000

1018378.80035120,217699.84932924,1295.00000000

1018379.61771811,217698.91907727,1295.00000000

1018379.65703276,217698.86608846,1295.00000000

1018383.14973379,217693.24223545,1295.00000000

1018383.15160253,217693.23925576,1295.00000000

1018385.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...

Posté(e)

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

Posté(e)

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

Posté(e)

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...

Posté(e)

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...

  • 1 mois après...
Posté(e)

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...

Posté(e)

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

Posté(e)

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...

Posté(e)

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

Posté(e)

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...

  • 2 semaines après...
Posté(e)

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...

Posté(e)

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

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é