Aller au contenu

Decalage et coupure polyligne3d


Messages recommandés

Posté(e)

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

Posté(e)

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

Posté(e)

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

Mais 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

Posté(e)

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

Posté(e)

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 ci

pour pouvoir les intégrer plus facilement dessous le profil en long.

 

Sinon c pas grave.

Merci quand même pour aide.

 

John

Posté(e)

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

Posté(e)

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

Posté(e)

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

Posté(e)

Ca marche nickel

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

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é