Aller au contenu

polyligne dynamique


FRAXA

Messages recommandés

Bonjour à tous!

Est-il possible de créer un polyligne avec plusieurs poignées déplacables mais qui garde au final, une longueur constante.

Le but est de simuler le déplacement d'une lance à incendie dans un atelier.

Merci d'avance pour vos réponses.

HPZ400 Workstation

Intel Xeon W3550 3.07 GHz

6 Go ram

QUADRO FX 1800

Lien vers le commentaire
Partager sur d’autres sites

Pour étirer en même temps plusieurs points d'une polyligne, il faut utiliser MAJ en cliquant dans les poignées. Après, l'étirement est groupé.

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

 

Bonjour Tramber et MERCI :)

 

Et encore un truc que je connaissais pas avec AutoCAD !!! :o

 

Merci pour le SHIFT et sélection de multiples vertex pour étirer la polyligne !

 

Cela existe depuis quand (si tu te souviens) ?

 

Le Decapode "ignare"

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Très intèressant Tramber et encore merci pour cette astuce, mais je cherche autre chose.

Comme je le disais sur mon précédent post, le but c'est de similuer le déplacement d'une lance à incendie dans un atelier.

Ce que je voudrais c'est une polyligne avec 6 poignées. La première fixe, mais les 5 autres mobiles et une longueur totale toujours égale à 20m.

HPZ400 Workstation

Intel Xeon W3550 3.07 GHz

6 Go ram

QUADRO FX 1800

Lien vers le commentaire
Partager sur d’autres sites

Cela existe depuis quand (si tu te souviens) ?

 

Depuis que je le sais au moins, pas mal de temps ! Je l'ai appris soit dans CADxp soit dans un bouquin de Serge (Camiré). Il y a même une fonctionnalité de division (relire l'aide car je ne me souviens plus exactement).

 

Fraxa, ta lance sera réalisable avec les blocs dynamiques à partir de la V2006.

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

Fraxa, ta lance sera réalisable avec les blocs dynamiques à partir de la V2006

Je m'en doutais, vivement que je passe à une version supérieure.

En tout cas ce post m'aura au moins permis d'apprendre une nouvelle fonctionnalité.

Merci Tramber

HPZ400 Workstation

Intel Xeon W3550 3.07 GHz

6 Go ram

QUADRO FX 1800

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

J'ai essayé de faire quelque chose en LISP, en l'état, ça ne fonctionne qu'en 2d (plan XY du SCU parallèle au SCG) et avec des polylignes sans arcs.

 

L'utilisateur sélectionne la polyligne puis sélectionne un sommet pour l'étirer.

Une ligne élastique rouge simule en dynamique la nouvelle polyligne de même longueur.

Quand l'utilisateur clique un point, la polylignes modifiée.

Il peut sélectionner un nouveau sommet pour l'étirer tant que la commande est active (faire Entrée, Espace ou clic droit pour sortir de la commande).

 

(defun c:const (/     erreur plst2grvecs	  osmo	pl    pt    par	  p-1	p+1   old
	plst  len   nb	  gr	p0    new   dif	  ind	e-len pti
	endpt grlst
       )
 (vl-load-com)

 (defun erreur	(msg)
   (if	(/= msg "Fonction annulée")
     (princ (strcat "Erreur: " msg))
   )
   (redraw)
   (vla-EndUndoMark
     (vla-get-ActiveDocument (vlax-get-acad-object))
   )
   (setvar "OSMODE" osmo)
   (setq *error* m:err
  m:err	nil
   )
   (princ)
 )

 (defun plst2grvecs (plst / n veclst)
   (repeat (setq n (1- (length plst)))
     (setq veclst (cons 1
		 (cons (trans (nth (1- n) plst) 0 1)
		       (cons (trans (nth n plst) 0 1) veclst)
		 )
	   )
    n	   (1- n)
     )
   )
   (grvecs veclst)
 )

 (setq	m:err	*error*
*error*	erreur
osmo	(getvar "OSMODE")
 )
 (setvar "OSMODE" 1)
 (while (not
   (and
     (setq pl (car (entsel "\nSélectionnez une polyligne ouverte: ")))
     (setq pl (vlax-ename->vla-object pl))
     (= (vla-get-ObjectName pl) "AcDbPolyline")
     (= (vla-get-Closed pl) :vlax-false)
   )
 )
 )
 (while (setq pt (getpoint "\nSpécifiez un sommet à déplacer: "))
   (if	(and
  (setq pt (trans pt 1 0))
  (setq par (vlax-curve-getParamAtPoint pl pt))
  (setq par (atoi (rtos par)))
)
     (progn
(vla-StartUndoMark
  (vla-get-ActiveDocument (vlax-get-acad-object))
)
(setq plst (split-list (vlax-get pl 'Coordinates) 2)
      len  (vla-get-Length pl)
      nb   (length plst)
)
(cond
  ((= par 0)
   (setq p+1 (vlax-curve-getPointAtParam pl 1)
	 old (vlax-curve-getDistAtParam pl 1)
   )
   (while (and (setq gr (grread T 12 0)) (/= (car gr) 3))
     (redraw)
     (setq p0	 (trans (cadr gr) 1 0)
	   endpt (polar p+1 (angle p+1 p0) old)
	   grlst (append (list (list (car endpt) (cadr endpt)))
			 (sublst plst 2 nil)
		 )
     )
     (plst2grvecs grlst)
   )
  )
  ((= par (1- nb))
   (setq p-1 (vlax-curve-getPointAtParam pl (1- par))
	 old (-	len
		(vlax-curve-getDistAtPoint pl p-1)
	     )
   )
   (while (and (setq gr (grread T 12 0)) (/= (car gr) 3))
     (redraw)
     (setq p0	 (trans (cadr gr) 1 0)
	   endpt (polar p-1 (angle p-1 p0) old)
	   grlst (append (sublst plst 1 par)
			 (list (list (car endpt) (cadr endpt)))
		 )
     )
     (plst2grvecs grlst)
   )
  )
  (T
   (setq p-1 (vlax-curve-getPointAtParam pl (1- par))
	 p+1 (vlax-curve-getPointAtParam pl (1+ par))
	 old (-	(vlax-curve-getDistAtPoint pl p+1)
		(vlax-curve-getDistAtPoint pl p-1)
	     )
   )
   (while (and (setq gr (grread T 12 0)) (/= (car gr) 3))
     (redraw)
     (setq p0  (trans (cadr gr) 1 0)
	   new (min (+ (distance p-1 p0) (distance p0 p+1))
		    (- len
		       (vlax-curve-getDistAtParam pl (1- par))
		    )
	       )
	   dif (- old new)
	   ind (- (length plst) 2)
     )
     (if (	       (progn
	 (while	(					   (vlax-curve-getDistAtParam pl ind)
				)
		    )
		    (abs dif)
		)
	   (setq ind (1- ind))
	 )
	 (setq pti (nth ind plst))
	 (cond
	   ((		    (setq endpt	(polar p-1 (angle p-1 p0) new)
		  grlst	(append	(sublst plst 1 par)
				(list (list (car endpt) (cadr endpt)))
			)
	    )
	   )
	   ((= ind par)
	    (setq endpt	(polar p0
			       (angle p0 p+1)
			       (- new (distance p-1 p0))
			)
		  grlst	(append	(sublst plst 1 par)
				(list (list (car p0) (cadr p0)))
				(list (list (car endpt) (cadr endpt)))
			)
	    )
	   )
	   ((		    (setq endpt	(polar pti
			       (angle pti (nth (1+ ind) plst))
			       (+ e-len dif)
			)
		  grlst	(append	(sublst plst 1 par)
				(list (list (car p0) (cadr p0)))
				(sublst plst (+ 2 par) (- ind par))
				(list (list (car endpt) (cadr endpt)))
			)
	    )
	   )
	 )
       )
       (progn
	 (setq pti (nth ind plst))
	 (if (= par (- nb 2))
	   (setq endpt (polar p0
			      (angle p0 p+1)
			      (- old (distance p-1 p0))
		       )
		 grlst (append (sublst plst 1 par)
			       (list (list (car p0) (cadr p0)))
			       (list (list (car endpt) (cadr endpt)))
		       )
	   )
	   (setq endpt (polar pti
			      (angle pti (last plst))
			      (+ (distance pti (last plst)) dif)
		       )
		 grlst (append (sublst plst 1 par)
			       (list (list (car p0) (cadr p0)))
			       (sublst plst (+ 2 par) (- ind par))
			       (list (list (car endpt) (cadr endpt)))
		       )
	   )
	 )
       )
     )
     (plst2grvecs grlst)
   )
  )
)
(redraw)
(vlax-put pl 'coordinates (apply 'append grlst))
(vla-EndUndoMark
  (vla-get-ActiveDocument (vlax-get-acad-object))
)
     )
     (princ "\nLe point spécifié n'est pas sur la polyligne.")
   )
 )
 (setvar "OSMODE" osmo)
 (setq	*error*	m:err
m:err nil
 )
 (princ)
)

;;; SUBLST Retourne une sous-liste
;;; Premier élément : 1
;;; (sublst '(1 2 3 4 5 6) 3 2) -> (3 4)
;;; (sublst '(1 2 3 4 5 6) 3 -1) -> (3 4 5 6)
;;; (sublst '(1 2 3 4 5 6) 3 12) -> (3 4 5 6)
;;; (sublst '(1 2 3 4 5 6) 3 nil) -> (3 4 5 6)

(defun sublst (lst start leng / rslt)
 (or (      (setq leng (- (length lst) (1- start)))
 )
 (repeat leng
   (setq rslt	(cons (nth (1- start) lst) rslt)
  start	(1+ start)
   )
 )
 (reverse rslt)
)

;; SPLIT-LIST Retourne une liste de sous-listes
;; Arguments
;; - lst : la liste à fractionner
;; - num : un entier, le nombre d'éléments des sous listes
;; Exemples :
;; (split-list '(1 2 3 4 5 6 7 8) 2) -> ((1 2) (3 4) (5 6) (7 8))
;; (split-list '(1 2 3 4 5 6 7 8) 3) -> ((1 2 3) (4 5 6) (7 8))

(defun split-list (lst n)
 (if lst
   (cons (sublst lst 1 n)
  (split-list (sublst lst (1+ n) nil) n)
   )
 )
) 

[Edité le 8/8/2007 par (gile)][Edité le 9/8/2007 par (gile)]

 

[Edité le 9/8/2007 par (gile)]

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Gile !

J'ai un message d'erreur qui apparait après avoir sélectionner le sommet: " Erreur: no function definition: SPLIT-LIST".

Ton LISP fonctionne sous 2005?

HPZ400 Workstation

Intel Xeon W3550 3.07 GHz

6 Go ram

QUADRO FX 1800

Lien vers le commentaire
Partager sur d’autres sites

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é