Bred Posté(e) le 23 avril 2020 Posté(e) le 23 avril 2020 Bonjour, Je créé un bloc grâce à (vla-add (vla-get-Blocks (vla-get-activedocument (vlax-get-acad-object)))... Je "travail" dedans ensuite par rapport à un point '(0 0 0) et 2 point p1 et p2 que j'ai pris soin de transformer en SCG avec (trans p1 1 0).... J'insert ensuite le bloc grâce à vla-insertblock Quand je suis en SCG, pas de problème.Par contre, si je suis en SCU, dans mon bloc inséré c'est le bordel.... Bosser dans un "vla-get-Blocks" ne se passe pas uniquement en SCG ? Merci d'avance Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
(gile) Posté(e) le 24 avril 2020 Posté(e) le 24 avril 2020 Salut, (setq bloc (vla-add (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object))) "bloc"))ajoute une définition de bloc à la table des bloc nommée "bloc". (vla-AddLine bloc (vlax-3d-point '(0 0 0)) (vlax-3d-point '(1 2 3)))ajoute une ligne dans la définition du bloc du point (0 0 0) au point (1 2 3). Ces points étant définis dans le système de coordonnées de la définition du bloc. Je ne comprends pas ce que viens faire le SCU là dedans. les SCU ne concerne que les espace courants. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 24 avril 2020 Posté(e) le 24 avril 2020 En bref, en programmation, on ne doit se préoccuper du SCU courant que dans les cas suivants :- l'acquisition de données (fonctions get*, entsel, etc.) qui renvoient toujours les points en coordonnées SCU ;- l'appel aux commandes (command, command-s, vl-cmdf, vla-SendComand) qui se réfèrent toujours au SCU courant. Avec les fonctions vla* ou entmake, on utilise toujours le SCG (ou son équivalent dans des définitions de bloc) ou le SCO pour les polylignes (LWPOLYLINE) ainsi que pour d'autres entités 2d en ce qui concerne entmake. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bred Posté(e) le 24 avril 2020 Auteur Posté(e) le 24 avril 2020 Je fais pas mal de rotation de bloc (vla-rotate3d), de bascule (vla-put-normale) dans mon lisp, à l'interieur du bloc "(vla-add (vla-get-Blocks" et de création de texte avec "(vla-AddMText Bloc..." et j'ai l'impression que ça prend en compte compte le SCU, car j'ai vraiment une différence à l'insertion avec vla-insertblock entre le SCG et le SCU. Dès que je trouve un moment, j’essaye de coder un exemple simple pour le mettre ici. Merci Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Bred Posté(e) le 24 avril 2020 Auteur Posté(e) le 24 avril 2020 Re, Alors voilà un principe qui, que l'on soit en SCG ou en SCU ne donne pas le même résultat alors que je pense ne travailler qu'en SCG... (defun c:eee ( / ANG BLOC_FINAL NOM-BLOC-FINAL P1 P1SCG P2 P2SCG TXT VECT-P1P2 VECT-Z CIRCLE PLAN-P1) (setq p1 (getpoint) p2 (getpoint p1) ang (angle p1 p2) p1scg (trans p1 1 0) vect-p1p2 (mapcar '- p2 p1) vect-Z '(0.0 0.0 1.0)) (setq plan-p1.p2.Z (list (- (* (cadr vect-p1p2) (caddr vect-Z)) (* (caddr vect-p1p2) (cadr vect-Z))) (- (* (caddr vect-p1p2) (car vect-Z)) (* (car vect-p1p2) (caddr vect-Z))) (- (* (car vect-p1p2) (cadr vect-Z)) (* (cadr vect-p1p2) (car vect-Z))) )) ;;; Crée Bloc-final dans collection (setq Nom-Bloc-final (strcat "Bloc-final" (itoa (fix (* (getvar "TDUSRTIMER") 10000000)))) Bloc_final (vla-add (vla-get-Blocks (vla-get-activedocument (vlax-get-acad-object))) (vlax-3d-point '(0 0 0)) Nom-Bloc-final)) ;;; Ecrit Texte dans Bloc-Final (setq txt (vla-AddMText Bloc_final (vlax-3d-point '(0 0 0)) 0.01 "<---- SENS P1 P2----->")) ;;; rotation txt vers p2 (vla-put-rotation txt ang) ;;; bascule txt sur le plan p1/p2/sens Z SCG (vla-put-normal txt (vlax-3d-point plan-p1.p2.Z)) ;;; cercle dans Bloc-Final (setq circle (vla-AddCircle Bloc_final (vlax-3d-point (polar '(0 0 0) ang (/ (distance p1 p2) 2))) (/ (distance p1 p2) 2))) ;;; bascule cercle sur le plan p1/p2/sens Z SCG (vla-put-normal circle (vlax-3d-point plan-p1.p2.Z)) (vla-insertblock (vla-get-ModelSpace (vla-get-activedocument (vlax-get-acad-object))) (vlax-3d-point p1scg) Nom-Bloc-final 1 1 1 0) ) Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
(gile) Posté(e) le 24 avril 2020 Posté(e) le 24 avril 2020 J'ai un peu regardé cette histoire. quelques petites corrections à ton code.- transformer les deux points (p1 et p2) en SCG avant de calculer la normale du plan vertical qui les contient- définir l'angle dans ce plan- faire la rotation du mtext après avoir changé sa normale- transformer le centre du cercle définit dans le SCO en SCG Sinon, j'ai dit une bêtise. vla-insertblock prend en compte la normale (axe Z) du scu courant, il faut donc forcer la normale du bloc inséré en (0 0 1) et transformer le point d'insertion. (defun c:eee (/ ANG BLOC_FINAL NOM-BLOC-FINAL P1 P1SCG P2 P2SCG TXT VECT-P1P2 VECT-Z CIRCLE PLAN-P1 ) (setq p1 (getpoint) p2 (getpoint p1) p1scg (trans p1 1 0) p2scg (trans p2 1 0) vect-p1p2 (mapcar '- p2scg p1scg) vect-Z '(0.0 0.0 1.0) ) (setq plan-p1.p2.Z (list (- (* (cadr vect-p1p2) (caddr vect-Z)) (* (caddr vect-p1p2) (cadr vect-Z))) (- (* (caddr vect-p1p2) (car vect-Z)) (* (car vect-p1p2) (caddr vect-Z))) (- (* (car vect-p1p2) (cadr vect-Z)) (* (cadr vect-p1p2) (car vect-Z))) ) ang (angle (trans p1scg 0 plan-p1.p2.Z) (trans p2scg 0 plan-p1.p2.Z)) ) ;; Crée Bloc-final dans collection (setq Nom-Bloc-final (strcat "Bloc-final" (itoa (fix (* (getvar "TDUSRTIMER") 10000000)))) Bloc_final (vla-add (vla-get-Blocks (vla-get-activedocument (vlax-get-acad-object))) (vlax-3d-point '(0 0 0)) Nom-Bloc-final ) ) ;; Ecrit Texte dans Bloc-Final (setq txt (vla-AddMText Bloc_final (vlax-3d-point '(0 0 0)) 0.0 "<---- SENS P1 P2----->")) ;; bascule txt sur le plan p1/p2/sens Z SCG (vla-put-normal txt (vlax-3d-point plan-p1.p2.Z)) ;; rotation txt vers p2 (vla-put-rotation txt ang) ;; cercle dans Bloc-Final (setq circle (vla-AddCircle Bloc_final (vlax-3d-point (mapcar '(lambda (x) (/ x 2.)) vect-p1p2)) ;;(vlax-3d-point (trans (polar '(0 0 0) ang (/ (distance p1 p2) 2)) plan-p1.p2.Z 0)) (/ (distance p1 p2) 2) ) ) ;; bascule cercle sur le plan p1/p2/sens Z SCG (vla-put-normal circle (vlax-3d-point plan-p1.p2.Z)) (vla-put-Normal (vla-insertblock (vla-get-ModelSpace (vla-get-activedocument (vlax-get-acad-object))) (vlax-3d-point (trans p1scg (trans '(0 0 1) 1 0 T) 0)) Nom-Bloc-final 1 1 1 0 ) (vlax-3d-point '(0 0 1)) ) ) Le faire avec entmake me semble plus simple et plus fiable.(defun c:aaa (/ ANG BLOC_FINAL NOM-BLOC-FINAL P1 P1SCG P2 P2SCG TXT VECT-P1P2 VECT-Z CIRCLE PLAN-P1 ) (setq p1 (getpoint) p2 (getpoint p1) p1scg (trans p1 1 0) p2scg (trans p2 1 0) vect-p1p2 (mapcar '- p2scg p1scg) vect-Z '(0.0 0.0 1.0) ) (setq plan-p1.p2.Z (list (- (* (cadr vect-p1p2) (caddr vect-Z)) (* (caddr vect-p1p2) (cadr vect-Z))) (- (* (caddr vect-p1p2) (car vect-Z)) (* (car vect-p1p2) (caddr vect-Z))) (- (* (car vect-p1p2) (cadr vect-Z)) (* (cadr vect-p1p2) (car vect-Z))) ) ang (angle (trans p1scg 0 plan-p1.p2.Z) (trans p2scg 0 plan-p1.p2.Z)) ) ;; Crée Bloc-final dans collection (setq Nom-Bloc-final (strcat "Bloc-final" (itoa (fix (* (getvar "TDUSRTIMER") 10000000))))) (entmake (list '(0 . "BLOCK") (cons 2 Nom-Bloc-final) '(70 . 0) '(10 0 0 0))) (entmake (list '(0 . "MTEXT") '(100 . "AcDbEntity") '(100 . "AcDbMText") '(10 0 0 0) '(1 . "<---- SENS P1 P2----->") (cons 210 plan-p1.p2.Z) (cons 50 ang) ) ) (entmake (list '(0 . "CIRCLE") (cons 10 (trans (mapcar '(lambda (x) (/ x 2.)) vect-p1p2) 0 plan-p1.p2.Z)) (cons 40 (/ (distance p1 p2) 2)) (cons 210 plan-p1.p2.Z) ) ) (entmake '((0 . "ENDBLK"))) (entmake (list '(0 . "INSERT") (cons 2 Nom-Bloc-final) (cons 10 p1scg))) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bred Posté(e) le 24 avril 2020 Auteur Posté(e) le 24 avril 2020 OK, je vais approfondir ça. MerciTes codes semblent fonctionner, mais pas pour le texte il me semble. Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
(gile) Posté(e) le 25 avril 2020 Posté(e) le 25 avril 2020 J'avais effectivement noté des problèmes avec la rotation du mtexte, puis après avoir redémarré AutoCAD ça ne se reproduisait plus.Je viens de refaire des essais et il semble bien qu'il y ait un bug avec l'objet MTEXT. Si on trace la rotation en faisant un pas à pas tout semble correct : (angtos (vla-get-Rotation txt)) renvoie la bonne valeur, mais une fois le bloc inséré, la rotation a changé (pas toujours) et si on ouvre la définition du bloc dans l'éditeur de bloc, on voit bien que la propriété rotation du mtexte a changé.J'ai essayé avec un texte simple à la place du texte multiligne et tout fonctionne comme attendu (comme quoi les dinosaures qui recommandaient d'utiliser des textes simples plutôt que des textes multiligne n'avaient pas tort). En conclusion, je dirais que les textes multilignes ne semble pas d'une robustesse à toute épreuve en 3D et que la fonction vla-InsertBlock n'a pas un fonctionnement cohérent suivant que le plan XY du SCU courant soit pas parallèle au plan XY du SCG ou pas. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
lecrabe Posté(e) le 25 avril 2020 Posté(e) le 25 avril 2020 Hello C le/les Dinosaure(s) qui parle(nt) (Lecrabe, Didier, Christian, etc) ... Vive les Textes simples ! Surtout quand en SIG/Cartographie/Cadastre ENORME, vous avez des dizaines / centaines de milliers ou millions de Textes !! LA SANTE (Stay Safe), Bye, le crabe "triste"Automne 2020, la retraite Autodesk Expert Elite Team
Bred Posté(e) le 25 avril 2020 Auteur Posté(e) le 25 avril 2020 OK, merci ! Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Bred Posté(e) le 27 avril 2020 Auteur Posté(e) le 27 avril 2020 ... bon, c'est vraiment trop tordu pour mon cas, afin d'avoir un truc propre j'insert des entités diverses (texte, bloc de biblio...) dans des blocs qu'ensuite j'insert dans un bloc final pour l'inserer dans AutoCAD...Et ces entitées je les oriente et bascule selon pas mal de paramètres... Solution : je bascule en SCG après la sélection des points... Merci pour votre temps. Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
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