Aller au contenu

Trans, SCU, SCO, SCG et dxf en 3D


Messages recommandés

Posté(e)

Comme j'ai pu lire çà et là, je ne suis pas le seul à avoir quelques difficultés avec les "traductions" de coordonnées dans les codes dxf pour les entités construites (ou à construire) dans des SCU non parallèles au SCG.

 

Je propose donc de rassembler dans ce fil les trouvailles et astuces de chacun.

 

Dans les exemples suivants nom_ent est un nom d'entité lst_ent la liste entget de cette entité et pt un point récupéré dans le SCU courant avec (getpoint).

 

1 UCSZDIR

Tout d'abord, ce qui semble être la "pierre angulaire" de nombreuses traduction : la direction d'extrusion du SCU courant.

C'est le code dxf 210 des entitité de ce SCU.

Suivant l'utilisation, on peut le définir dans une variable ou dans une fonction :

 

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

ou

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

(dans les exemples suivants ucszdir est défini dans une variable)

 

Dans la constitution d'une liste entmake :

 

(cons 210 ucszdir)

 

 

2 Entités dont les points sont définis dans le SCG (ligne, ellipse, spline...)

Dans ce cas, pas de problème particulier.

 

2.1 Traduction du point de départ de l'entité dans le SCU :

 

(trans (cdr (assoc 10 lst_ent)) 0 1)

ou

(trans (cdr (assoc 10 lst_ent)) nom_ent 1)

 

2.2 Définition du point de départ pour une liste pour (entmake) ou (entmod)

 

(cons 10 (trans pt 1 0))

 

3 Entités dont les points sont définis dans le SCO (lwpolyline, arc, cercle, blocs...)

(pour les lwpolylignes CF réponse N° 8)

 

3.1 Traduction du point de départ de l'entité dans le SCU :

 

(trans (cdr (assoc 10 lst_ent)) ucszdir 1)

ou

(trans (cdr (assoc 10 lst_ent)) (cdr (assoc 210 (entget nom_ent))) 1)

ou

(trans (cdr (assoc 10 lst_ent)) nom_ent 1)

 

3.2 Définition du point de départ pour une liste pour (entmake) ou (entmod)

 

(cons 10 (trans pt 1 ucszdir))

 

4 Traductions des angles (départ et fin d'un arc de cercle, rotation d'un bloc ou d'un texte...)

 

4.1 Angle 0.0 du SCU courant

 

(angle '(0 0) (trans (getvar "UCSXDIR") 0 ucszdir))

 

4.2 Angle acquis avec (getangle)

 

(+ (getangle "\nSpécifiez l'angle: ")
  (angle '(0 0) (trans (getvar "UCSXDIR") 0 ucszdir))
)

[Edité le 12/12/2005 par (gile)][Edité le 25/12/2005 par (gile)]

 

[Edité le 3/2/2006 par (gile)]

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

Posté(e)

Super ! Je reviendrai sur cette page.

 

Tu nous fait le même avec Vla-put-normal ?!

 

Pour les angles, on se prend souvent la tête pour trouver l'angle relatif entre un segment et un autre.

C'est un peu dans le sujet, D. Vaquand propose d'utiliser TRANS et j'ai trouvé ca très malin.

Le fichier , vient de cette page.

 

 

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e)

Salut Tramber, et merci :red:

 

Pour Vla-put-normal :

(vla-put-Normal
   objt
   (vlax-3d-point ucszdir)
 )

avec ucszdir comme défini ci-dessus, tout simplement.

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

Posté(e)

Tant que j'y suis, je livre aussi mes découvertes sur la codification dxf des ellipses et arcs elliptiques.

Le centre (code 10) est défini dans le SCG, l'extrémité du grand axe (code 11) aussi, mais par rapport au centre !

Le rapport entre les axes (code 40) doit être inférieur à zéro.

Le départ et la fin d'un arcs (codes 41 et 42) ne sont pas simplement des angles mais des "paramètres" répondant à l'équation vectorielle :

p(u) = c + a* cos(u) + b* sin(u)

où c représente le centre de l'ellipse; a et b représentent respectivement le grand axe et le petit axe.

 

Pour l'exemple, soient cen et ext deux points définis dans le SCU, respectivement le centre et l'extrémité du premier axe, et dist le rapport avec l'autre axe.

 

Soit, aussi la variable ucszdir définie comme ci-dessus.

 

Comme dist doit être inférieur à zéro, un test et, si nécessaire, une redéfinition de l'extrémité s'imposent :

(if (	   (setq ext  (polar cen
		     (+ (/ pi 2) (angle cen ext))
		     (* dist (distance cen ext))
	      )
	 dist (/ 1 dist)
   )
 )

Traduction des points dans le SCG :

(foreach pt '(cen ext)
   (set pt (trans (eval pt) 1 0))
 )

Redéfinition de ext, qui doit être défini par rapport au centre de l'ellipse :

(setq ext (mapcar '- ext cen))

Création de l'ellipse avec entmake :

(entmake (list '(0 . "ELLIPSE")
	  '(100 . "AcDbEntity")
	  '(100 . "AcDbEllipse")
	  (cons 10 cen)
	  (cons 11 ext)
	  (cons 40 dist)
	  (cons 41 0.0)
	  (cons 42 (* 2 pi))
	  (cons 210 ucszdir)
    )
  )

 

Pour un arc elliptique, il faudra transformer les angles ang1 et ang2 acquis avec (getangle) en "paramètres" de l'ellipse :

(foreach ang	'(ang1 ang2)
    (set ang
  (+ (eval ang)
     (angle '(0 0) (trans (getvar "UCSXDIR") 0 ucszdir))
     (- (angle '(0 0) (trans ext 0 ucszdir)))
  )
    )
    (set ang (atan (sin (eval ang)) (* (cos (eval ang)) dist)))
  )

Et ensuite :

(entmake (list '(0 . "ELLIPSE")
	  '(100 . "AcDbEntity")
	  '(100 . "AcDbEllipse")
	  (cons 10 cen)
	  (cons 11 ext)
	  (cons 40 dist)
	  (cons 41 ang1)
	  (cons 42 ang2)
	  (cons 210 (extr_dir))
    )
  )

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

Posté(e)

A par répéter merci (gile)....

 

Ton post est entièrement copié, je le conserve précieusement car il me rendra certainement service.

 

Quand les points obscurs sont débroussaillés, cela devient tellement plus simple.... ;)

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

Posté(e)

Je suis très touché par tous ces remerciements, surtout venant de vous qui m'avez tellement appris de choses.

 

Comme dit au début, j'espère que chacun ajoutera à ce post ses trouvailles et astuces au gré des difficultés rencontrées dans ce domaine.

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

  • 1 mois après...
Posté(e)

J'ai posté ici un LISP en "pur Visual" qui ne présente pas grand intérêt en soi (il produit la même action que la commande "Arc, départ, fin, rayon") mais il illustre une façon d'utiliser trans (vla-TranslateCoordinates) et ucszdir (Normal) pour trouver les angles de départ et de fin d'arcs de cercles à partir de points définis dans le SCG quelque soit le SCU courant.

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

Posté(e)

Précision :

 

Les codes donnés dans le premier messages ne sont pas tout à fait exacts en ce qui concerne la traduction dans le SCG des sommets d'une lwpolyligne, ils ne prennent pas en compte l'élévation de l'objet.

 

Soit nom_ent le nom d'entité d'une lwpolyligne et lst_ent celui de sa liste entget, pour chaque sommet (code dxf 10) de la polyligne les coordonnées dans le SCG s'obtiennent par :

 

(trans (list (car (cdr (assoc 10 lst_ent)))
     (cadr (cdr (assoc 10 lst_ent)))
     (cdr (assoc 38 lst_ent))
      )
      nom_ent
      0
) 

 

La liste des sommets de la polyligne dans le SCG :

 

(mapcar
 '(lambda (pt)
    (trans (list (car pt) (cadr pt) (cdr (assoc 38 lst_ent)))
    nom_ent
    0
    )
  )
 (mapcar
   'cdr
   (vl-remove-if-not
     '(lambda (x) (= (car x) 10))
     list_ent
   )
 )
) 

 

[Edité le 3/2/2006 par (gile)]

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é