chris_mtp Posté(e) le 20 décembre 2008 Posté(e) le 20 décembre 2008 Bonjour à tous, J'ai une polyligne 2D qui est en fait un axe en plan que je dois décaler de 30m de chaque côté puis couper les polylignes ainsi crées en chaque sommet.Attention, les polylignes découpés doivent rester des polylignes et ne doivent pas être des lignes d'ou l'impossibilité de décomposer les polylignes décalés. Le problème est que ma polyligne comporte 85 côtés donc 86 sommets .Ca fait donc 172 points de coupure a selectionner. ca fait long. Je dois ensuite joindre par des polylignes les sommets des polylignes décalés (donc de gauche et de droite) pour composer en fait des bandes planimétriques. Si quelq'un pourrait m'aider.Merci par avance. Chris_mtp
(gile) Posté(e) le 20 décembre 2008 Posté(e) le 20 décembre 2008 Salut, Je ne suis pas sûr d'avoir compris la demande.S'il s'agit de décalage de polyligne 3d, je te renvoie à ce sujet. S'il s'agit de décalage d'une polyligne 2d (le seul cohérent à mon avis), j'ai essayé de faire quelque chose qui fonctionne quelque soit le plan de construction de la polyligne et qui conserve les arcs. (defun c:test (/ acdoc pl0 odist space norm elv pl1 pl2 pts1 pts2 clsd ind blgs) (vl-load-com) (setq acdoc (vla-get-ActiveDocument (vlax-get-acad-object))) (while (not (and (setq pl0 (car (entsel "\nSélectionnez une polyligne: "))) (setq pl0 (vlax-ename->vla-object pl0)) (= (vla-get-ObjectName pl0) "AcDbPolyline") ) ) (princ "\nEntité non valide.") ) (initget 7) (setq odist (getdist "\nSpécifiez la distance de décalage: ")) (vla-StartUndoMark acdoc) (setq space (vla-ObjectIdToObject acdoc (vla-get-OwnerId pl0)) norm (vla-get-Normal pl0) elv (vla-get-Elevation pl0) pl1 (car (vlax-invoke pl0 'Offset odist)) pl2 (car (vlax-invoke pl0 'Offset (- odist))) pts1 (2d-coord->pt-lst (vlax-get pl1 'Coordinates)) pts2 (2d-coord->pt-lst (vlax-get pl2 'Coordinates)) ) (and (= (vla-get-Closed pl0) :vlax-true) (setq clsd T)) (vla-delete pl1) (vla-delete pl2) (mapcar '(lambda (x1 x2 / pl) (setq pl (vlax-invoke space 'addLightWeightPolyline (append x1 x2) ) ) (vla-put-Normal pl norm) (vla-put-Elevation pl elv) ) pts1 pts2 ) (if clsd (setq pts1 (append pts1 (list (car pts1))) pts2 (append pts2 (list (car pts2))) ) ) (repeat (setq ind (1- (length pts1))) (setq blgs (cons (vla-getBulge pl0 (setq ind (1- ind))) blgs)) ) (mapcar '(lambda (l1 l2) (mapcar '(lambda (x1 x2 b / pl) (setq pl (vlax-invoke space 'addLightWeightPolyline (append x1 x2) ) ) (vla-put-Normal pl norm) (vla-put-Elevation pl elv) (vla-setBulge pl 0 b) ) l1 l2 blgs ) ) (list pts1 pts2) (list (cdr pts1) (cdr pts2)) ) (vla-EndUndoMark acdoc) (princ) ) ;;; 2d-coord->pt-lst Convertit une liste de coordonnées 2D en liste de points 2D ;;; (2d-coord->pt-lst '(1.0 2.0 3.0 4.0)) -> ((1.0 2.0) (3.0 4.0)) (defun 2d-coord->pt-lst (lst) (if lst (cons (list (car lst) (cadr lst)) (2d-coord->pt-lst (cddr lst)) ) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
chris_mtp Posté(e) le 20 décembre 2008 Auteur Posté(e) le 20 décembre 2008 Merci Gile pour ce lisp. Désolé de m'avoir mal exprimé dans mon sujet.Ton lisp décale parfaitement de chaque côté la polyligne 2D sélectionné.Il m'affiche à la fin ceci ; erreur: no function definition: 2D-COORD->PT-LSTMais après je voudrais ensuite joindre les sommets de la polyligne de gauche et de droite. En fait, tracer une nouvelle polyligne entre le premier sommet de la polyligne décalé à gauche et le premier sommet de la polyligne décalé à droite, puis tracer une nouvelle polyligne entre le second sommet de la polyligne décalé à gauche et le second sommet de la polyligne décalé à droite ainsi de suite jusqu'au dernier sommet pour crée à la fin des bandes planimétriques de mon axe en plan. J'arrive pas à insérer l'image qui pourrait mieux t'expliquer ce que je cherche.Attend je reviens
chris_mtp Posté(e) le 20 décembre 2008 Auteur Posté(e) le 20 décembre 2008 Merci quand ^même pour ton aide.
(gile) Posté(e) le 20 décembre 2008 Posté(e) le 20 décembre 2008 Je pense que le LISP fait bien ce que tu veux, j'avais juste oublié de joindre la routine 2D-COORD->PT-LST. Le LISP crée une polyligne par segment des polyllignes décalées (c'est ce que tu demandes dans ton premier message). Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
chris_mtp Posté(e) le 20 décembre 2008 Auteur Posté(e) le 20 décembre 2008 Ok c pour çà qu'il m'afficher l'erreur erreur: no function definition: 2D-COORD->PT-LST Merci quand même.John
chris_mtp Posté(e) le 20 décembre 2008 Auteur Posté(e) le 20 décembre 2008 Merci Gile.Ca marche nickel mais juste un petit truc supp.Tu me dit si c'est possible et pas trop long sinon tu laisses tomber. Serait il possible pour chaque bande de créer un contour sous forme de polyligne fermés directement ? De manière à sélectionner d'un coup la bande planimétrique et non les quatres côtés de celle cipour pouvoir les intégrer plus facilement dessous le profil en long. Sinon c pas grave.Merci quand même pour aide. John
(gile) Posté(e) le 20 décembre 2008 Posté(e) le 20 décembre 2008 Un truc comme ça ? (defun c:test (/ acdoc pl0 odist space norm elv pl1 pl2 pts0 pts1 pts2 clsd ind blgs) (vl-load-com) (setq acdoc (vla-get-ActiveDocument (vlax-get-acad-object))) (while (not (and (setq pl0 (car (entsel "\nSélectionnez une polyligne: "))) (setq pl0 (vlax-ename->vla-object pl0)) (= (vla-get-ObjectName pl0) "AcDbPolyline") ) ) (princ "\nEntité non valide.") ) (initget 7) (setq odist (getdist "\nSpécifiez la distance de décalage: ")) (vla-StartUndoMark acdoc) (setq space (vla-ObjectIdToObject acdoc (vla-get-OwnerId pl0)) norm (vla-get-Normal pl0) elv (vla-get-Elevation pl0) pl1 (car (vlax-invoke pl0 'Offset odist)) pl2 (car (vlax-invoke pl0 'Offset (- odist))) pts0 (2d-coord->pt-lst (vlax-get pl0 'Coordinates)) pts1 (2d-coord->pt-lst (vlax-get pl1 'Coordinates)) pts2 (2d-coord->pt-lst (vlax-get pl2 'Coordinates)) ) (vla-delete pl1) (vla-delete pl2) (repeat (setq ind (1- (length pts1))) (setq blgs (cons (vla-getBulge pl0 (setq ind (1- ind))) blgs)) ) (foreach l (list pts1 pts2) (mapcar '(lambda (x0 y0 x1 y1 b / pl) (setq pl (vlax-invoke space 'addLightWeightPolyline (append x0 y0 y1 x1) ) ) (vla-put-Closed pl :vlax-true) (vla-put-Normal pl norm) (vla-put-Elevation pl elv) (vla-setBulge pl 0 b) (vla-setBulge pl 2 (- b)) ) pts0 (cdr pts0) l (cdr l) blgs ) ) (vla-EndUndoMark acdoc) (princ) ) ;;; 2d-coord->pt-lst Convertit une liste de coordonnées 2D en liste de points 2D ;;; (2d-coord->pt-lst '(1.0 2.0 3.0 4.0)) -> ((1.0 2.0) (3.0 4.0)) (defun 2d-coord->pt-lst (lst) (if lst (cons (list (car lst) (cadr lst)) (2d-coord->pt-lst (cddr lst)) ) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
chris_mtp Posté(e) le 20 décembre 2008 Auteur Posté(e) le 20 décembre 2008 Presque ca sauf que au lieu de créer deux polylignes fermées par segment de l'axe en plan, une seule polyligne qui comprend le segment décalé de gauche, le segment décalé à droite ainsi que les deux polylignes qui joint les deux extrémités. Merci par avance.John
(gile) Posté(e) le 21 décembre 2008 Posté(e) le 21 décembre 2008 On va finir par se comprendre... (defun c:test (/ acdoc pl0 odist space norm elv pl1 pl2 pts1 pts2 clsd ind blgs) (vl-load-com) (setq acdoc (vla-get-ActiveDocument (vlax-get-acad-object))) (while (not (and (setq pl0 (car (entsel "\nSélectionnez une polyligne: "))) (setq pl0 (vlax-ename->vla-object pl0)) (= (vla-get-ObjectName pl0) "AcDbPolyline") ) ) (princ "\nEntité non valide.") ) (initget 7) (setq odist (getdist "\nSpécifiez la distance de décalage: ")) (vla-StartUndoMark acdoc) (setq space (vla-ObjectIdToObject acdoc (vla-get-OwnerId pl0)) norm (vla-get-Normal pl0) elv (vla-get-Elevation pl0) pl1 (car (vlax-invoke pl0 'Offset odist)) pl2 (car (vlax-invoke pl0 'Offset (- odist))) pts1 (2d-coord->pt-lst (vlax-get pl1 'Coordinates)) pts2 (2d-coord->pt-lst (vlax-get pl2 'Coordinates)) ) (vla-delete pl1) (vla-delete pl2) (if (= (vla-get-Closed pl0) :vlax-true) (foreach l '(pts1 pts2) (set l (append (eval l) (list (car (eval l))))) ) ) (repeat (setq ind (1- (length pts1))) (setq blgs (cons (vla-getBulge pl0 (setq ind (1- ind))) blgs)) ) (mapcar '(lambda (x1 y1 x2 y2 b / pl) (setq pl (vlax-invoke space 'addLightWeightPolyline (append x1 y1 y2 x2) ) ) (vla-put-Closed pl :vlax-true) (vla-put-Normal pl norm) (vla-put-Elevation pl elv) (vla-setBulge pl 0 b) (vla-setBulge pl 2 (- b)) ) pts1 (cdr pts1) pts2 (cdr pts2) blgs ) (vla-EndUndoMark acdoc) (princ) ) ;;; 2d-coord->pt-lst Convertit une liste de coordonnées 2D en liste de points 2D ;;; (2d-coord->pt-lst '(1.0 2.0 3.0 4.0)) -> ((1.0 2.0) (3.0 4.0)) (defun 2d-coord->pt-lst (lst) (if lst (cons (list (car lst) (cadr lst)) (2d-coord->pt-lst (cddr lst)) ) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
chris_mtp Posté(e) le 21 décembre 2008 Auteur Posté(e) le 21 décembre 2008 Ca marche nickelOn pourrait aller encore plus loin mais après ce n'est qu"un souci de présentation du genre faire pivoter les bandes planimétriques selon l'axe en plan avec un angle de 100 gr et les aligner succesivement avec une longueur prédéfini en ajustant auparavant les bords de coupe pour n'avoir q'une partie du plan d'état des lieux qui corresponde à une partie du profil Mias c déjà bien En fait, ce lisp répond aussi aux deux sujets que j'avais posté sur les bissectrices qui sont donc maintenant résolu. Merci pour ton aide et encore congratulations.Bonne fêtes à tout le monde. John.
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