ykmail05 Posté(e) le 21 mars 2008 Posté(e) le 21 mars 2008 Bonjour tout le monde ,je voulait savoir si il existait un moyen pour créer la bissectrice entre 2 polylignes courbes sélectionnée.
bonuscad Posté(e) le 21 mars 2008 Posté(e) le 21 mars 2008 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
(gile) Posté(e) le 21 mars 2008 Posté(e) le 21 mars 2008 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
bonuscad Posté(e) le 21 mars 2008 Posté(e) le 21 mars 2008 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
(gile) Posté(e) le 22 mars 2008 Posté(e) le 22 mars 2008 Merci pour le retour Bonuscad, J'ai corrigé le code et apporté les améliorations suggérées. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
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