Aller au contenu

Messages recommandés

Posté(e)

Suite à un échange avec BonusCAD (ici) j'ai essayé de creuser un peu la question des SCO.

 

Plusieurs entités 2D ont leurs coordonnées définies dans le SCO (Système de Coordonnées de l'Objet) telles que cercle, arc, solide, trace, texte, attribut, définition d'attribut, forme, insertion, polyligne 2D, sommet 2D, polyligne étroite, hachures, image.

 

Le SCO ne correspond pas forcément au SCU courant lors de la création de l'objet.

 

Ce système de coordonnées est calculé dans AutoCAD de manière "arbitraire mais homogène" à partir de la direction d'extrusion de l'objet (code DXF 210) ou vecteur normal du plan XY du système de coordonnées. Pour ce calcul, AutoCAD utilise "l'algorithme d'axe arbitraire" :

 

L'algorithme d'axe arbitraire est utilisé en interne par AutoCAD pour mettre en oeuvre une génération arbitraire mais homogène de systèmes de coordonnées d'objets pour toutes les entités qui utilisent des coordonnées d'objets.

 

A partir d'un vecteur de longueur unitaire utilisé comme axe Z d'un système de coordonnées, l'algorithme d'axe arbitraire génère un axe X correspondant pour ce système de coordonnées. L'axe Y suit par application de la règle de la main droite.

Citation extraite de l'aide aux développeurs >> Référence DXF >> Concepts DXF avancés.

 

Voici donc une petite routine, inspirée de celle donnée par Bonuscad dans le sujet cité plus haut.

L'argument est un vecteur dont le vecteur unitaire sera l'axe Z du système de coordonnées calculé.

La routine retourne une liste contenant les coordonnées des axes X, Y et Z.

Cette liste pourra être utiliser pour l'élaboration de matrices.

 

;;; SCO Retourne la liste des coordonnées des vecteurs X Y et Z
;;; définis à partir d'un vecteur "zdir" par l'algorithme d'axe arbitraire
(defun sco (zdir / xdir)
 (or (= 1.0 (distance '(0 0 0) zdir))
     (setq zdir (vunit zdir))
 )
 (if (and (	   (      )
   (setq xdir (vunit (v^v '(0 1 0) zdir)))
   (setq xdir (vunit (v^v '(0 0 1) zdir)))
 )
 (list xdir (vunit (v^v zdir xdir)) zdir)
)

;; V^V
;; Retourne le produit vectoriel (vecteur) de deux vecteurs
;;
;; Arguments : deux vecteurs

(defun v^v (v1 v2)
 (list	(- (* (cadr v1) (caddr v2)) (* (caddr v1) (cadr v2)))
(- (* (caddr v1) (car v2)) (* (car v1) (caddr v2)))
(- (* (car v1) (cadr v2)) (* (cadr v1) (car v2)))
 )
)

;; VUNIT
;; Retourne le vecteur unitaire d'un vecteur
;;
;; Argument : un vecteur

(defun vunit (v)
 ((lambda (l)
    (if (/= 0 l)
      (mapcar (function (lambda (x) (/ x l))) v)
    )
  )
   (distance '(0 0 0) v)
 )
) 

 

NOTA : cette routine utilise des routines de calculs vectoriels extraites de ce sujet que j'ai remis à jour à cette occasion.[Edité le 8/10/2006 par (gile)][Edité le 11/10/2006 par (gile)]

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

Posté(e)

Regardons un peu plus avant,

 

Soit un vecteur unitaire zdir, si on calcule le SCO de ce vecteur avec la fonction sco, le résultat, une liste de 3 éléments ayant chacun 3 éléments est une matrice de dimension 3 X 3.

 

(setq mat (sco zdir))

 

Si maintenant on applique cette matrice à un vecteur vec quelconque, avec la fonction mxv ci-dessous, le résultat sera un vecteur qui est la transformation de vec par la matrice, le même qu'on obtient avec la fonction AutoLISP trans.

 

;; Applique une matrice de transformation à un vecteur by Vladimir Nesterovsky
(defun mxv (m v)
 (mapcar '(lambda (row) (vxv row v)) m)
)

 

(setq vec '(10 20 30)) par exemple

(mxv mat vec) retourne le même résultat que (trans vec 0 zdir)

 

Inversement, si on transpose la matrice avec la fonction trp :

 

;; transpose une matrice Doug Wilson
(defun trp (m)
 (apply 'mapcar (cons 'list m))
)

 

(mxv (trp mat) vec) retourne le même résultat que (trans vec zdir 0)

 

Le propos n'est pas ici de trouver un autre moyen pour faire ce que fait très bien la fonction trans, mais de comprendre comment elle fonctionne (et par là de comprendre un petit peu mieux comment fonctionne AutoCAD).

 

Je pense que le calcul utilisé par trans est similaire à celui fait ci-dessus, le calcul matriciel (et vectoriel) étant un moyen de ramener à des opérations sur les nombres les fonctions linéaires (déplacement, rotations ...).

 

Edit/ajout : Inversement, on peut utiliser la fonction trans pour obtenir le même résultat qu'avec la fonction SCO :

 

(mapcar '(lambda (v) (trans v zdir 0)) '((1 0 0) (0 1 0) (0 0 1)))

 

[Edité le 29/3/2007 par (gile)]

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

Posté(e)

Petites précisions en image sur le SCO (j'aurais peut-être du commencer par ça)

 

Soit un bloc inséré dans un SCU 3D (non parallèle au SCG) dont le plan XY est le plan (P). Le bloc est inséré en 0,0,0 avec une rotation nulle.

 

http://img47.imageshack.us/img47/1379/sco2qb3.png

 

AutoCAD calcule le SCO du bloc à partir de sa direction d'extrusion (axe Z du SCU) à l'aide de l'algorithme d'axe arbitraire.

 

- L'origine du SCO est confondue avec celle du SCG.

 

- La rotation (code DXF 50) est l'angle que fait l'objet (bloc, texte ...) avec la parallèle à l'axe X du SCO.

 

- La coordonnée Z du point d'insertion (code DXF 10 des blocs, cercles, textes ,...) ou l'élévation (code DXF 38 des polylignes) est la distance sur l'axe Z du SCO entre l'origine et l'intersection avec le plan de l'objet.

 

En rouge, le SCO, en blanc l'icône du SCG.

http://img116.imageshack.us/img116/2463/sco1tq4.png

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

Posté(e)

Merci, Maître des réacteurs :red:

 

Je pense être encore loin de tout maîtriser, mais, comme beaucoup, je découvre, j'apprends, je partage...

 

Sur ce coup là, je dois à Ingoenius d'avoir posé une sacrée question et à Bonuscad d'avoir, dans le même sujet, donné une super piste.

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

Posté(e)

Salut (gile)

merci de tes explications.

 

Juste un point qui m'echape (que je ne doit pas comprendre) :

 

- La rotation (code DXF 50) est l'angle que fait l'objet (bloc, texte ...) avec la parallèle à l'axe X du SCO.

 

...ceci ne te donne qu' une rotation.... en 3D il te faut bien 2 angles, non ?

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

...ceci ne te donne qu' une rotation.... en 3D il te faut bien 2 angles, non ?

 

La rotation dont je parle là correspond à celle retournée par l'expression (cdr (assoc 50 (entget ent))) ou (vla-get-Rotation obj) sur un bloc ou un texte par exemple.

 

Elle est donnée par rapport à l'axe X du SCO, dans le plan XY de l'objet dont la normale ou direction d'extrusion (axe Z du SCO) est retournée par (cdr (assoc 210 (entget ent))) ou (vlax-get obj 'Normal).

 

Ces deux données, avec le calcul du SCO par "l'algorithme d'axe arbitraire", décrivent de manière non-équivoque l'orientation du bloc dans l'espace.

 

Cette orientation peut être décrite en terme de rotations successives sur les axes X, Y et Z du SCG (c'était la demande de ingoenius).

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

Posté(e)

mmmmmmh....

Donc c'est la "direction d'Extrusion" qui te donnes "l'angle Z".... beaucoup de choses se révele à moi....

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Donc c'est la "direction d'Extrusion" qui te donnes "l'angle Z"

 

La direction d'extrusion ou vecteur normal du plan XY, c'est les coordonnées du vecteur de norme (longueur) 1 perpendiculaire au plan XY : le vecteur directeur de l'axe Z.

 

Exemple : 0,0,1 pour le SCG et tous les systèmes de coordonnées (SCU, SCO) dont le plan XY est parallèle au plan XY du SCG.

 

http://img45.imageshack.us/img45/5272/normale2to1.png

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

Posté(e)

... Et bien ça ne peut pas être plus clair !

 

Merci (gile) !

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

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é