bonuscad Posté(e) le 13 juin 2006 Posté(e) le 13 juin 2006 Bien qu'AutoDesk ait amélioré la fonction perpendiculaire a partir de (2004/2005?), cette fonction ne répond toujours pas à des besoins de base. Leur solution est certe très jolie (on se balade en dynamique de façon perpendiculaire) mais fixer un point de départ n'est pas si simple sans accrobaties. J'ai donc essayé de faire une fonction (le plus fiable possible) pour élever ces perpendiculaires.Je l'ai testé sur 2000-2002 et 2004. Voilà si ça peut vous aider dans vos contructions géométrique (elle fonctionne sur des ellipses, ce qui n'est pas le cas du mode standard) Conseil: pour les arrondis sélectionnez avec l'accroche objet désiré si vous voulez partir d'un point précis sur l'arc (defun elperr (ch) (cond ((or (eq ch "Function cancelled") (eq ch "Fonction annulée")) nil) ((or (eq ch "quit / exit abort") (eq ch "quitter / sortir abandon")) nil) ((or (eq ch "console break") (eq ch "Interruption de la console")) nil) (T (princ ch)) ) (setvar "cmdecho" 1) (setvar "osmode" old_osmd) (setvar "orthomode" old_orth) (setvar "snapang" old_snp) (setq *error* olderr) (princ) ) (defun elevperp ( / old_osmd old_snp ols_orth olderr ent dxf_210 obj_vlax pt_start param_pt dir_tg p_from) (vl-load-com) (setq old_osmd (getvar "osmode") old_snp (getvar "snapang") old_orth (getvar "orthomode")) (setvar "osmode" 0) (setvar "cmdecho" 0) (setq olderr *error* *error* elperr) (while (or (while (null (setq ent (entsel "\nElever une perpendiculaire à: ")))) (or (not (member (cdr (assoc 0 (entget (car ent)))) '("LINE" "POLYLINE" "LWPOLYLINE" "SPLINE" "XLINE" "RAY" "ARC" "CIRCLE" "ELLIPSE") ) ) (if (and (eq (cdr (assoc 0 (entget (car ent)))) "POLYLINE") (assoc 70 (entget (car ent)))) (not (zerop (boole 1 (cdr (assoc 70 (entget (car ent)))) 120))) ) ) (and (assoc 210 (entget (car ent))) (not (equal (trans '(0 0 1) 1 0 T) (cdr (assoc 210 (entget (car ent)))) 1E-12))) ) (if (not (null ent)) (if (and (assoc 210 (entget (car ent))) (not (equal (trans '(0 0 1) 1 0 T) (cdr (assoc 210 (entget (car ent)))) 1E-12))) (princ "L'objet n'est pas parallèle au SCU.") (princ "1 a été filtré.") ) ) ) (cond (ent (setq obj_vlax (vlax-ename->vla-object (car ent))) (setq dxf_210 (cdr (assoc 210 (entget (car ent))))) (if (null dxf_210) (setq dxf_210 '(0.0 0.0 1.0))) (setq pt_start (vlax-curve-getClosestPointToProjection obj_vlax (trans (cadr ent) 1 0) dxf_210 T)) (if (null (setq param_pt (vlax-curve-getParamAtPoint obj_vlax pt_start))) (setq param_pt (vlax-curve-getParamAtPoint obj_vlax (list (car pt_start) (cadr pt_start) (caddr (cdr (assoc 10 (entget (car ent)))))))) ) (cond (param_pt (setq dir_tg (trans (vlax-curve-getFirstDeriv obj_vlax param_pt) 0 1 T)) (if (not (zerop (cadr dir_tg))) (setq dir_tg (- (/ pi 2) (atan (/ (car dir_tg) (cadr dir_tg))))) (setq dir_tg (/ pi 2)) ) (setvar "snapang" dir_tg) (setvar "orthomode" 1) (setvar "osmode" old_osmd) (if (null (setq p_from (getpoint "\nDu point : "))) (setq p_from (trans pt_start 0 1)) ) (setvar "osmode" 0) (initget 9) (setq p_to (getpoint p_from "\nJusqu'au point : ")) (command "_.line" p_from p_to "") ) (T (princ "\nImpossible de déterminer le point sur l'objet")) ) ) ) (setvar "osmode" old_osmd) (setvar "orthomode" old_orth) (setvar "snapang" old_snp) (setvar "cmdecho" 1) (setq *error* olderr) (prin1) ) (defun c:elp () (elevperp) ) (defun c:elevperp () (elevperp) ) (princ "\nElevperp charge tapez ELEVPERP ou ELP pour l'execution") (prin1) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
(gile) Posté(e) le 14 juin 2006 Posté(e) le 14 juin 2006 Salut, J'ai essayé mais il semble qu'il y ait un problème avec les cercles et les ellipses http://img104.imageshack.us/img104/1486/perp17ib.png Je pense que c'est parceque la tangente est calculée au point de séléction de l'entité : (setq pt_start (vlax-curve-getClosestPointToProjection obj_vlax (trans (cadr ent) 1 0) dxf_210 T ) ) et pas par rapport au point de départ. ou alors j'ai encore rien compris :P PS : quand on force la valeur de ORTHOMODE il peut être bien d'enregistrer avant la valeur de AUTOSNAP pour la restaurer après la restauration de celle d'orthomode (pour ceux qui, comme moi, travaillent avec le repérage polaire). PPS : Je crois bien qu'encore une fois j'ai compris de travers. Il s'agissait d' "Elever une perpendiculaire au point :", le point étant sur l'objet, non ? [Edité le 14/6/2006 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
bonuscad Posté(e) le 14 juin 2006 Auteur Posté(e) le 14 juin 2006 Conseil: pour les arrondis sélectionnez avec l'accroche objet désiré si vous voulez partir d'un point précis sur l'arc En effet c'est la direction de la tangente qui est calculé au point de sélection, d'où l'importance de bien fixé son point de sélection par un accroche forcé. Pour autosnap, je ne savais pas qu'orthomode avait une influence :( Je suis pas un adepte de ce mode car je n'arrive que très rarement à satisfaire mon besoin avec ce mode, il y a toujours quelque chose qui fout en l'air ma manip de tracking. Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
(gile) Posté(e) le 14 juin 2006 Posté(e) le 14 juin 2006 Pour autosnap, je ne savais pas qu'orthomode avait une influence Si le repérage polaire est actif (code binaire 8 d'autosnap) le mode ortho est inactif et vice-versa. Sinon, Bonuscad à fait une super routine pour voir les variables systèmes qui ont changé après une action, stavar, je crois ... ;) 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