Aller au contenu

(210 0.0 0.0 1.0)


Messages recommandés

Posté(e)

Bonjour à tous,

 

Est-il possible de remettre tous les assoc 210 avec les valeurs ci-dessus sans que, bien sur,

l'entité ne se déplace (dans son propre SCU ou dans un autre).

 

Pour ceux qui ne savait pas quoi faire ... :-)

 

Merci

L56

Posté(e)

Salut,

 

Les entités qui ont un code DXF 210 (lwpolyligne, textes, mtextes, arcs, cercles, ellipses, réferences de bloc...) sont des entités qui ont un Système de Coordonnée Objet (SCO) - voir ce sujet- et les coordonnées de ces objets (sommet centre point d'insertion...) sont définies dans ce système de coordonnées.

 

La valeur du code 210 est le vecteur unitaire de l'axe Z de ce SCO (on dit aussi sa "normale").

 

Si ce vecteur est différent de (0.0 0.0 1.0) ou (0.0 0.0 -1.0), le plan XY du SCO (donc de l'objet) n'est pas parallèle au plan XY du SCG, donc forcer la normale de ces objets les fera obligatoirement se déplacer.

 

Si ce vecteur est (0.0 0.0 -1.0), le forcer à (0.0 0.0 1.1) revient à effectuer un mirroir sur l'axe des Y. Il faut donc multiplier par -1 toutes les coordonnées X de l'entité (sauf pour les Mtextes dont l'axe du mirroir est la parallèle à l'axe des X qui passe par le point d'insertion et les ellipses).

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

Posté(e)

Merci (gile),

 

Je comprends que le changement du code 210 déplace l'entité, mais si en même temps que ce changement , je change les codes 10 / 11 ... (12 et 13 pour des 3DFACEs ou autres..), l'entité devrait rester à sa place.

 

Ce que je n'arrive pas à déterminer c'est la manierre de convertir les coordonnées des codes 10,11 ... à partir des valeurs du code 210.

 

Je pense que ce dois être possible. Il suffit de trouver la formule.

Ou peut-être de passer par des matrices (mais la, je n'y connais rien).

 

a+

L56

Posté(e)

Comme dit plus haut, et uniquement pour passer d'une normale (0.0 0.0 -1.0) à une normale (0.0 0.0 1.0) revient à faire un mirroir dont l'axe de symétrie est l'axe des Y (sauf les ellipses et mtextes dont les centres et points d'insertion son définis dans le SCG).

 

Pour les autres entités -cercle, arc, solide, trace, texte, attribut, définition d'attribut, référence de bloc ou externe, polyligne 2D, lwpolyligne, hachures, image cotes (mais sûrement pas les faces 3d qui peuvent ne pas être planes)-, on pourrait utiliser les matrices mais ça n'est pas nécessaire.

S'il s'agit jute de coordonnées à traduire d'un système à un autre, la fonction trans suffit bien (elle fait sûrement ses calculs à l'aide de matrices).

Donc (trans pt '(0.0 0.0 -1.0) '(0.0 0.0 1.0)) transforme les coordonnées définies dans le SCO dont l'axe Z est (0.0 0.0 -1.0) en coordonnées dans le sco dont l'axe Z est (0.0 0.0 -1.0) à savoir le SCG.

Cette opération, comme dit plus haut, revient à multiplier la coordonnée X du point par -1.

 

(trans '(10.0 20.0 0.0) '(0.0 0.0 -1.0) '(0.0 0.0 1.0)) retourne (-10.0 20.0 0.0).

 

Nota : dans le cas d'une polyligne avec des arcs il faudrait aussi inverser le signe des courbures (bulge).

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

Posté(e)

Ok, avec trans, cela fontionne.

mais j'ai un probleme de précision.

 

Avec la commande LISTE (et luprec à 8) j'ai:

ARC Calque: "0"

Espace: Espace objet

Maintien = 1cdcb

centre point, [surligneur] X=210101.78306176 Y=509959.43895478 Z=0.00740386[/surligneur]

rayon 0.20000000

Direction d'extrusion relative au SCU:

X=0.04900426 Y=-0.09638865 Z=0.99413672

longueur 0.62831853

angle total 180

 

Et avec ENTGET, j'ai

((-1 . ) (0 . "ARC") (330 .

d'entité: 7eacf2d8>) (5 . "1CDCB") (100 . "AcDbEntity") (67 . 0) (410 .

"Model") (8 . "0") (100 . "AcDbCircle") (10 418399.0 357259.0 -38858.4)

(40 . 0.2) (210 0.0490043 -0.0963886 0.994137) (100 . "AcDbArc") (50 . 2.79217)

(51 . 5.93376))

 

Comment se fait-il que je n'ai pas plus de décimales dans la liste ci-dessus ?

 

(trans (cdr (assoc 10 a)) '(0.0490043 -0.0963886 0.994137)'(0.0 0.0 1.0))

[surligneur] (210101.0 509960.0 -0.0119145)[/surligneur]

Posté(e)

Attention de ne pas confondre ce qui est affiché et la précision réelle de calcul.

 

par exemple :

 

(setq num 123456789.12345678) retourne 1.23457e+008 ce qui ne veut pas dire qu'AutoCAD a arrondi à 123456700.0

 

(rtos num 2 8) retourne "123456789.1234568"

 

mais si c'est l'utilisateur qui entre un nombre arrondi (recopié)

 

(setq num2 123456789.1234) retourne aussi 1.23457e+008

(rtos num2 2 8) retournera "123456789.1234000"

 

D'où l'intérêt de stocker les valeurs numériques dans des variables où elles conservent (même si ça n'apparaît pas à l'affichage) la précision de calcul d'AutoCAD.

 

Pour ton arc, par exemple :

 

(setq arc (car (entsel)))

(setq elst (entget arc))

(setq cen (cdr (assoc 10 elst))

(setq nor (cdr (assoc 210 elst)))

 

puis :

 

(trans cen nor 0)

 

l'argument 0 pour la fonction trans correspond au SCG donc au vecteur (0.0 0.0 1.0)

 

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

Posté(e)

Je suis un ane !!!

 

J'ai fais un copier-coller des valeurs du 210 plutot que de faire un (cdr ...

 

Merci pour tout !

 

a+

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é