Aller au contenu

bissectrice entre 2 courbes


Messages recommandés

Posté(e)

Bonjour,

 

Tu peux essayer ce qui suit.

Les points de sélection sont important, c'est eux qui déterminent le point de tangente de la courbe.

 

(defun c:bisect2obj ( / ent1 obj_curv pt_sel1 param deriv alpha1 ent2 pt_sel2 alpha2 alpha pt old_snpa old_orth)
(vl-load-com)
(while (not (setq ent1 (entsel "\nSélectionner premier objet: "))))
(setq obj_curv (vlax-ename->vla-object (car ent1)))
(cond
	((member
		(vlax-get-property obj_curv 'ObjectName)
		'("AcDbLine" "AcDbXline" "AcDbPolyline" "AcDb2dPolyline" "AcDbSpline" "AcDbEllipse" "AcDbArc" "AcDbCircle")
	 )
		(setq
			pt_sel1 (vlax-curve-getClosestPointTo obj_curv (trans (cadr ent1) 1 0))
			param (vlax-curve-getparamatpoint obj_curv pt_sel1)
			deriv (vlax-curve-getfirstderiv obj_curv param)
			alpha1 (atan (cadr deriv) (car deriv))
		)
		(while (not (setq ent2 (entsel "\nSélectionner second objet: "))))
		(setq obj_curv (vlax-ename->vla-object (car ent2)))
		(cond
			((member
				(vlax-get-property obj_curv 'ObjectName)
				'("AcDbLine" "AcDbXline" "AcDbPolyline" "AcDb2dPolyline" "AcDbSpline" "AcDbEllipse" "AcDbArc" "AcDbCircle")
	 		)
				(setq
					pt_sel2 (vlax-curve-getClosestPointTo obj_curv (trans (cadr ent2) 1 0))
					param (vlax-curve-getparamatpoint obj_curv pt_sel2)
					deriv (vlax-curve-getfirstderiv obj_curv param)
					alpha2 (atan (cadr deriv) (car deriv))
					alpha (* (+ alpha1 alpha2) 0.5)
					pt (inters pt_sel1 (polar pt_sel1 alpha1 100) pt_sel2 (polar pt_sel2 alpha2 100) nil)
					old_snpa (getvar "SNAPANG")
					old_orth (getvar "ORTHOMODE")
				)
				(setvar "SNAPANG" alpha)
				(setvar "ORTHOMODE" 1)
				(grdraw (trans pt 0 1) (trans pt_sel1 0 1) 3)
				(grdraw (trans pt 0 1) (trans pt_sel2 0 1) 3)
				(initget 33)
				(setq pt_end (getpoint (trans pt 0 1) "\nEnd of bisecting line: "))
				(command "_.LINE" "_none" (trans pt 0 1) "_none" pt_end "")
				(redraw)
				(setvar "SNAPANG" old_snpa)
				(setvar "ORTHOMODE" old_orth)
			)
			(T (princ "\nObjet invalide!"))
		)
	)
	(T (princ "\nObjet invalide!"))
)
(prin1)
)

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

Posté(e)

Salut,

 

la bissectrice entre 2 polylignes courbes
:exclam: :P :casstet:

 

Petit rappel de géométrie:

La bissectrice d'un secteur angulaire est la demi-droite passant par le sommet de l'angle qui partage le secteur en 2 angles de même mesure.

 

Deux courbes (ou une courbe te une droite) ne définissant pas un secteur angulaire, la demande permet toutes les interprétations possibles.

 

La réponse de Bonuscad illustre bien cette confusion en créant des "bissectrices" différentes suivant le choix des points sur les courbes ;)

 

J'en propose une autre qui permet de dessiner la bissectrice de l'angle entre les tangentes aux courbes à leur intersection.

Si les courbes ont plusieurs intersections, on peut les parcourir en faisant Entré (Suivant).

 

EDIT : code corrigé

 

;; CURVE-BISSECT (gile) 22/03/08
;; Crée une ligne sur une bissectrice de l'angle des tangentes aux courbes au point d'intersection

(defun c:curve-bissect (/	 fltr	  curv1	   curv2    ints     orthomode
		autosnap snapang  osmode   start    ang	     end
	       )
 (vl-load-com)

 (or *acdoc*
     (setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object)))
 )
 (setq	space (if (= 1 (getvar "cvport"))
	(vla-get-paperSpace *acdoc*)
	(vla-get-ModelSpace *acdoc*)
      )
 )
 (setq	fltr '((-4 . "[b]	       (0 . "ARC,CIRCLE,ELLIPSE,LINE,LWPOLYLINE")
       (-4 . "[b]	       (0 . "POLYLINE")
       (-4 . "[b]	       (-4 . "&")
       (70 . 120)
       (-4 . "NOT>")
       (-4 . "AND>")
       (-4 . "[b]	       (0 . "SPLINE")
       (-4 . "&")
       (70 . 8)
       (-4 . "AND>")
       (-4 . "OR>")
      )
 )

 (if (and
(princ "\nSélectionnez la première courbe.")
(setq curv1 (ssget "_:S:E" fltr))
(princ "\nSélectionnez la seconde courbe.")
(setq curv2 (ssget "_:S:E" fltr))
(not (equal (setq curv1 (ssname curv1 0))
	    (setq curv2 (ssname curv2 0))
     )
)
     )
   (if	(setq ints (3d-coord->pt-lst
	     (vlax-invoke
	       (vlax-ename->vla-object curv1)
	       'IntersectWith
	       (vlax-ename->vla-object curv2)
	       acExtendNone
	     )
	   )
)
     (progn
(vla-StartUndoMark *acdoc*)
(while ints
  (setq	start (car ints)
	ang   (- (/ (+ (angle '(0 0 0)
			   (vlax-curve-getFirstDeriv
			     curv1
			     (vlax-curve-getParamAtPoint curv1 start)
			   )
		    )
		    (angle '(0 0 0)
			   (vlax-curve-getFirstDeriv
			     curv2
			     (vlax-curve-getParamAtPoint curv2 start)
			   )
		    )
		 )
		 2.0
	      )
		 (angle '(0 0 0) (getvar "ucsxdir"))
		 )
  )
  (setq	orthomode (getvar "orthomode")
	autosnap  (getvar "autosnap")
	snapang	  (getvar "snapang")
	osmode	  (getvar "osmode")
  )
  (setvar "orthomode" 1)
  (setvar "snapang" ang)
  (setvar "osmode" 0)
  (initget "Suivant")
  (setq	end (vl-catch-all-apply
	      'getpoint
	      (list (trans start 0 1)
		    (strcat
		      "\nSpécifiez l'extrémité de la ligne"
		      (if (				" ou [b]: "
			": "
		      )
		    )
	      )
	    )
  )
  (cond
    ((and (cdr ints) (or (null end) (= end "Suivant")))
     (setq ints (cdr ints))
    )
    ((listp end)
     (vla-addLine
       space
       (vlax-3d-point start)
       (vlax-3d-point (trans end 1 0))
     )
     (setq ints (cdr ints))
    )
    (T (setq ints nil))
  )
  (setvar "orthomode" orthomode)
  (setvar "snapang" snapang)
  (setvar "autosnap" autosnap)
  (setvar "osmode" osmode)
  (vla-EndUndoMark *acdoc*)
)
     )
     (princ "\nPas d'intersection entre les courbes.")
   )
   (princ "\nEntité non valide.")
 )
 (princ)
)


;;; 3d-coord->pt-lst Convertit une liste de coordonnées 3D en liste de points
;;; (3d-coord->pt-lst '(1.0 2.0 3.0 4.0 5.0 6.0)) -> ((1.0 2.0 3.0) (4.0 5.0 6.0))

(defun 3d-coord->pt-lst	(lst)
 (if lst
   (cons (list (car lst) (cadr lst) (caddr lst))
  (3d-coord->pt-lst (cdddr lst))
   )
 )
) 

 

[Edité le 22/3/2008 par (gile)]

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

Posté(e)

Je pense, après réflexion et quelques tests, que ton code correspond mieux à la demande...

 

J'ai réussi à le faire fonctionner malgré un "<AND" qui a sauté et la fonction absente

(defun 3d-coord->pt-lst (lst)

(cond

((atom lst) lst)

(

(cons

(list (car lst) (cadr lst) (caddr lst))

(3d-coord->pt-lst (cdddr lst))

)

)

)

)

 

Juste pour peaufiner, un (initget) pour (getpoint) serait souhaitable ET un contrôle de OSMODE lors de l'acquisition de ce même point.

 

Voilà une fonction de construction qui se révèlera utile.

:present: Adopté!

Bravo! ;)

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

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é