Aller au contenu

interpolation d\'une polyligne


joell

Messages recommandés

Bonjour,

 

J'ai cherché un peut partout sur le forum sans rien trouver a ce sujet.

Je cherche une petite routine me permettant, sur une polyligne de marquer (à l'image de diviser ou mesurer) un point à un Z donné sur la polyligne (X Y etant en plan et Z en altitude).

 

exemple une polyligne début (500,500,400) fin (600,500,410) .

je veux noter sur cette polyligne le point a Z 409.00 (ou mieux encore tout les entiers)

 

j'espère avoir été assez claire et vous remercie par avance.

 

Joël

 

 

[Edité le 21/11/2007 par joell]

Lien vers le commentaire
Partager sur d’autres sites

Bon, j'entame ce challenge ;)

 

Le code qui suit ne fonctionnera que sur une polyligne 3D.

Il vous sera demandé un interval en Z qui devra être répété pour placer les points en Z correspondants (exemple tout les 1 mètres, ou 25 mètre (centimètre,...)

 

(defun round_number (xr n / )
(* (fix (atof (rtos (* xr n) 2 0))) (/ 1.0 n))
)
(defun c:z_interval ( / js dxf_ent vla_obj n pt_lst z_value z_min z_max pt_int)
(vl-load-com)
(princ "\nSélectionnez une polyligne 3D.")
(while
	(null
		(setq js
			(ssget "_+.:E:S"
				(list
					'(0 . "POLYLINE")
					(cons 67 (if (eq (getvar "CVPORT") 1) 1 0))
					(cons 410 (if (eq (getvar "CVPORT") 1) (getvar "CTAB") "Model"))
					'(-4 . "[b]<[/b]NOT")
						'(-4 . "&")
						'(70 . 112)
					'(-4 . "NOT>")
				)
			)
		)
	)
	(princ "\nCe n'est pas une polyligne 3D!")
)
(setq
	dxf_ent (entget (ssname js 0))
	vla_obj (vlax-ename->vla-object (cdar dxf_ent))
	n -1
	pt_lst nil
)
(if (zerop (getvar "USERR1")) (setvar "USERR1" 1.0))
(initget 6)
(setq z_value (getreal (strcat "\nEntrez l'interval en Z [b]<[/b]" (rtos (getvar "USERR1")) ">: ")))
(if (not z_value) (setq z_value (abs (getvar "USERR1"))))
(setvar "USERR1" z_value)
(repeat (fix (vlax-curve-getEndParam vla_obj))
	(setq pt_lst (cons (vlax-curve-getPointAtParam vla_obj (setq n (1+ n))) pt_lst))
)
(if (zerop (boole 1 1 (cdr (assoc 70 dxf_ent))))
	(setq pt_lst (cons (vlax-curve-getEndPoint vla_obj) pt_lst))
	(setq pt_lst (cons (vlax-curve-getStartPoint vla_obj) pt_lst))
)
(while (cdr pt_lst)
	(setq
		z_min (round_number (min (caddar pt_lst) (car (cddadr pt_lst))) (/ 1 z_value))
		z_max (max (caddar pt_lst) (car (cddadr pt_lst)))
	)
	(while ([b]<[/b] z_min z_max)
		(setq pt_int
			(inters
				(car pt_lst)
				(cadr pt_lst)
				(list (caar pt_lst) (cadar pt_lst) z_min)
				(list (caadr pt_lst) (cadadr pt_lst) z_min)
				T
			)
		)
		(if pt_int
			(entmake
				(list
					(cons 0 "POINT")
					(cons 100 "AcDbPoint")
					(cons 10 pt_int)
					(list 210 0.0 0.0 1.0)
				)
			)
		)
		(setq z_min (+ z_min z_value))
	)
	(setq pt_lst (cdr pt_lst))
)
(prin1)
)

 

NB: Le calcul des Z et les points sont traités dans tous les cas dans le SCG. Le code a été testé rapidement.

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

bonjour,

Bon j'ai commencé mais je bloque sur une fonction j'ai trouvé la fonction Atan mais je ne trouve pas de fonction tangente.Comme fait on.

 

Autrement c'est du grand art bonuscad. En ce qui me concerne je vais le faire a mon niveau c'est a dire sur un ligne.

@plus

Lien vers le commentaire
Partager sur d’autres sites

Bon merci ca avance. J'avais complétement effacer ces relations.

Mais bon je suis un peu degouté j'ai vu que t'utilisé la fonction (inters) que je ne connaissais pas donc j'ai créé un fonction d'intersection. enfin bref ca permet d'évoluer

 

@plus

Lien vers le commentaire
Partager sur d’autres sites

es tu celui qui a fait bonuscad justement ?

 

C'est bien moi, un utilisateur ancien d'autocad, qui a horreur des taches répétitives, et qui fait tout pour l'éviter. :P

 

Donc je partage pour simplifier la vie des dessinateurs comme moi. Une solidarité dans le corps du métier en sorte. ;)

 

 

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

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é