Aller au contenu

Décaler une ellipse en ellipse.


bonuscad

Messages recommandés

Bien que cela ne soit pas possible, j'ai essayé d'être le plus approchant possible.

 

C'est à dire que vous retrouverez exactement la distance de décalage entre les 2 ellipses seulement aux quadrants de celles ci. Ailleurs la distance sera variable, c'est pour ça que l'option décaler "Par le point" n'est pas présente (insoluble pour ma part).

 

Cela vous permettra d'obtenir une autre ellipse et non pas une polyligne.

Il faut bien garder à l'esprit que c'est qu'une solution approximative pour conserver une entité ellipse.

Peut servir pour des ellipses servant à l'habillage esthétique. ou si la rigueur n'a pas d'importance.

 

Normalement le code fonctionne dans n'importe quel SCU et aussi avec des arcs d'ellipse.

 

(defun c:offset_ellipse ( / ent dxf_ent lg_axe dis_off new_11 new_40)
(while (not (setq ent (entsel "\nChoix de l'ellipse à décaler: "))))
(setq dxf_ent (entget (car ent)))
(cond
	((eq (cdr (assoc 0 dxf_ent)) "ELLIPSE")
		(setq
			lg_axe (distance '(0.0 0.0 0.0) (cdr (assoc 11 dxf_ent)))
		)
		(if (< (getvar "offsetdist") 0.0) (initget 7) (initget 6))
		(setq dis_off (getdist (strcat "\nDistance de décalage< " (rtos (getvar "offsetdist")) "> : ")))
		(if (not dis_off) (setq dis_off (getvar "offsetdist")) (setvar "offsetdist" dis_off))
		(initget "Interieur Exterieur _Intern Extern")
		(if (eq (getkword "\nDécalage [interieur/Exterieur]? < E >  : ") "Intern")
			(setq
				new_11 (mapcar '(lambda (x) (* (/ x lg_axe) (- lg_axe dis_off))) (cdr (assoc 11 dxf_ent)))
				new_40 (/ (- (* lg_axe (cdr (assoc 40 dxf_ent))) dis_off) (- lg_axe dis_off))
			)
			(setq
				new_11 (mapcar '(lambda (x) (* (/ x lg_axe) (+ lg_axe dis_off))) (cdr (assoc 11 dxf_ent)))
				new_40 (/ (+ (* lg_axe (cdr (assoc 40 dxf_ent))) dis_off) (+ lg_axe dis_off))
			)
		)
		(setq
					dxf_ent (subst (cons 11 new_11) (assoc 11 dxf_ent) dxf_ent)
				dxf_ent (subst (cons 40 new_40) (assoc 40 dxf_ent) dxf_ent)
		)
		(entmake (foreach n '(-1 330 5) (setq dxf_ent (vl-remove (assoc n dxf_ent) dxf_ent))))
	)
	(T
		(princ "\nObjet n'est pas une Ellipse!.")
	)
)
(princ)
)

 

[Edité le 18/1/2006 par bonuscad]

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

Je réponds un peu tardivement, mais ton LISP m'interréssait et des tests un peu poussés m'ont fait remarquer un dysfonctionnement ; dans les SCU très "biscornus" (pivotés sur les 3 axes), la distance de décalage (au niveau des quadrants) n'est pas respectée.

 

Je te propose une modification de ton LISP utilisant (trans ... qui semble fonctionner :

 

Nouvelle mouture, sans (trans... et avec redéfinition des paramètres (codes dxf 41 et 42)

 

(defun c:offset_ellipse
      (/ ent dxf_ent lg_axe dis_off new_11 new_40 new_41 new_42)
 (while (not (setq ent (entsel "\nChoix de l'ellipse à décaler: ")))
 )
 (setq dxf_ent (entget (car ent)))
 (cond
   ((eq (cdr (assoc 0 dxf_ent)) "ELLIPSE")
    (setq
      lg_axe (distance '(0.0 0.0 0.0) (cdr (assoc 11 dxf_ent)))
    )
    (if (       (initget 7)
      (initget 6)
    )
    (setq dis_off (getdist (strcat "\nDistance de décalage				    (rtos (getvar "offsetdist"))
			    "> : "
		    )
	   )
    )
    (if (not dis_off)
      (setq dis_off (getvar "offsetdist"))
      (setvar "offsetdist" dis_off)
    )
    (initget "Interieur Exterieur _Intern Extern")
    (if (eq (getkword "\nDécalage [interieur/Exterieur]?  : ")
     "Intern"
 )
      (setq
 new_11	(mapcar	'(lambda (x) (* (/ x lg_axe) (- lg_axe dis_off)))
		(cdr (assoc 11 dxf_ent))
	)
 new_40	(/ (- (* lg_axe (cdr (assoc 40 dxf_ent))) dis_off)
	   (- lg_axe dis_off)
	)
      )
      (setq
 new_11	(mapcar	'(lambda (x) (* (/ x lg_axe) (+ lg_axe dis_off)))
		(cdr (assoc 11 dxf_ent))
	)
 new_40	(/ (+ (* lg_axe (cdr (assoc 40 dxf_ent))) dis_off)
	   (+ lg_axe dis_off)
	)
      )
    )
    (cond
      ((equal (rem (cdr (assoc 41 dxf_ent)) (/ pi 2)) 0.0 1e-009)
(setq new_41 (cdr (assoc 41 dxf_ent)))
      )
      (T
(setq new_41 (atan (* (/ (sin (cdr (assoc 41 dxf_ent)))
			 (cos (cdr (assoc 41 dxf_ent)))
		      )
		      (/ (cdr (assoc 40 dxf_ent)) new_40)
		   )
	     )
)
(if minusp (cos (cdr (assoc 41 dxf_ent))))
  (setq new_41 (+ new_41 pi))
)
      )
    )
    (cond
      ((equal (rem (cdr (assoc 42 dxf_ent)) (/ pi 2)) 0.0 1e-009)
(setq new_42 (cdr (assoc 42 dxf_ent)))
      )
      (T
(setq new_42 (atan (* (/ (sin (cdr (assoc 42 dxf_ent)))
			 (cos (cdr (assoc 42 dxf_ent)))
		      )
		      (/ (cdr (assoc 40 dxf_ent)) new_40)
		   )
	     )
)
(if (minusp (cos (cdr (assoc 42 dxf_ent))))
  (setq new_42 (+ new_42 pi))
)
      )
    )
    (setq
      dxf_ent (subst (cons 11 new_11) (assoc 11 dxf_ent) dxf_ent)
      dxf_ent (subst (cons 40 new_40) (assoc 40 dxf_ent) dxf_ent)
      dxf_ent (subst (cons 41 new_41) (assoc 41 dxf_ent) dxf_ent)
      dxf_ent (subst (cons 42 new_42) (assoc 42 dxf_ent) dxf_ent)
    )
    (entmake
      (foreach	n '(-1 330 5)
 (setq dxf_ent (vl-remove (assoc n dxf_ent) dxf_ent))
      )
    )
   )
   (T
    (princ "\nObjet n'est pas une Ellipse!.")
   )
 )
 (princ)
) 

 

PS : on peut aussi remplacer :

(setq ucszdir (trans '(0 0 1) 1 0 T)) 

 

par :

(setq ucszdir (cdr (assoc 210 dxf_ent))) 

 

PPS : Il me semble qu'il reste un petit problème avec les arcs.

En conservant les codes dxf 41 et 42 on conserve les paramètres de départ et de fin de l'ellipse qui sont différents des angles spécifiés lors de la création de l'arc.

De mémoire, la tangente du paramètre serait égale à la tangente de l'angle multipliée par le rapport entre le petit et le grand axe (code 40).

J'essayerais de voir çà demain.[Edité le 17/1/2006 par (gile)]

 

PPPS : les PS précédents sont maintenant caduques.

 

PPPPS : j'ai simplifié les tests sur le signe des cosinus des paramètres

 

[Edité le 19/1/2006 par (gile)]

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

Lien vers le commentaire
Partager sur d’autres sites

Effectivement, il y a un problème! ;)

 

Dans des SCU le mien fonctionne (l'ellipse est crée, mais la valeur de décalage est fausse)

Par contre le tien ne fonctionne pas (l'ellipse n'est pas créer, incohérence pour entmode?)

 

Je vais essayer de trouver le Hic. :casstet:

 

Merci du retour!

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

Par contre le tien ne fonctionne pas

Bizarre... hier çà marchait chez moi.

Ici je ne peux pas essayer ils n'ont qu'une LT.

Je verrai çà ce soir...

 

Pour les histoires d'arcs, j'ai la mémoire qui flanche, c'est exactement l'inverse de ce que je disais :

La tangente de l'angle est égale à la tangente du paramètre multipliée par le rapport entre les deus axes (0.75 dans l'exemple ci dessous).

 

http://img61.imageshack.us/img61/6452/sanstitre9ia.jpg

 

[Edité le 18/1/2006 par (gile)]

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

Lien vers le commentaire
Partager sur d’autres sites

Voilà je pense avoir régler le problème soulevé par (gile).

 

Par contre son idée d'utiliser (trans) n'est pas approprié pour ce cas.

J'ai simplement fait des règles de 3 dans le scu simulé a l'origine au centre de l'ellipse et identique au SCG (le dxf 11 est défini comme cela).

 

En plus clair, depuis le SCG tu déplace l'origine au centre de l'ellipse, tu fais un ID du quadrant et tu obtiens la même valeur que le code DXF 11

Cette particularité n'a rien à voir avec le vecteur de direction représenté par le code DXF 210.

 

PS: je corrige le code dans le post original

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

Ton nouveau code marche bien et il est plus simpe que ce que j'avais fait. ;)

 

Çà ne m'explique pas pourquoi ce que j'avais fait ne marchait pas chez toi, j'ai pu le tester sur AutoCAD 2005 AutoCAD 2006 et même sur Intellidesk 2005 (en remplaçant vl-remove), çà fonctionne partout. :casstet:

 

D'autre part j'ai trouvé un moyen pour conserver les angles de départ et de fin sur un arc.

Je modifie mon code à partir de tes dernières découvertes et des miennes.

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

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é