(gile) Posté(e) le 11 décembre 2005 Posté(e) le 11 décembre 2005 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 UCSZDIRTout 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
Tramber Posté(e) le 11 décembre 2005 Posté(e) le 11 décembre 2005 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 ./__\. (.°=°.)
(gile) Posté(e) le 11 décembre 2005 Auteur Posté(e) le 11 décembre 2005 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
(gile) Posté(e) le 11 décembre 2005 Auteur Posté(e) le 11 décembre 2005 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
Patrick_35 Posté(e) le 12 décembre 2005 Posté(e) le 12 décembre 2005 Merci (gile)Je suis comme Tramber, c'est le genre de page à conserver comme lien @9 Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bonuscad Posté(e) le 13 décembre 2005 Posté(e) le 13 décembre 2005 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
(gile) Posté(e) le 13 décembre 2005 Auteur Posté(e) le 13 décembre 2005 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
(gile) Posté(e) le 27 janvier 2006 Auteur Posté(e) le 27 janvier 2006 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
(gile) Posté(e) le 3 février 2006 Auteur Posté(e) le 3 février 2006 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
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