l56 Posté(e) le 2 octobre 2007 Posté(e) le 2 octobre 2007 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 ... :-) MerciL56
(gile) Posté(e) le 2 octobre 2007 Posté(e) le 2 octobre 2007 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
l56 Posté(e) le 3 octobre 2007 Auteur Posté(e) le 3 octobre 2007 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
(gile) Posté(e) le 3 octobre 2007 Posté(e) le 3 octobre 2007 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
l56 Posté(e) le 3 octobre 2007 Auteur Posté(e) le 3 octobre 2007 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.20000000Direction 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]
(gile) Posté(e) le 3 octobre 2007 Posté(e) le 3 octobre 2007 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
l56 Posté(e) le 3 octobre 2007 Auteur Posté(e) le 3 octobre 2007 Je suis un ane !!! J'ai fais un copier-coller des valeurs du 210 plutot que de faire un (cdr ... Merci pour tout ! a+
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant