Aller au contenu

Elever une perpendiculaire


Messages recommandés

Posté(e)

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

Posté(e)

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

Posté(e)

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

Posté(e)

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

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é