Bred Posté(e) le 24 mai 2006 Posté(e) le 24 mai 2006 Bonjours J'insert plusieurs blocs en lisp, je les mets tous sur un calque temporaire afin de pouvoir tous selectionner afin de créér un bloc avec l'ensemble des blocs selectionné avec (setq sel (ssget "_X" ((8 . "Calque_Tempo")))) (command "_-block" "NomB" pt sel "" "_-INSERT" "NomB" pt "1" "1" 0) Le souci étant "visuel" : J'ai, à l'affichage un "clignotement" de mon ensemble selectionner, vu qu'Autocad efface puis insert le bloc créé... et c'est pas trés jolie... Je n'arive pas à trouver une solution... peut-être avec entmake ou avec des commandes vla, mais j'ai beau chercher, je n'y arrive pas... merci de votre aide Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Patrick_35 Posté(e) le 24 mai 2006 Posté(e) le 24 mai 2006 Salut Pour créer le bloc(entmake (list (cons 0 "block") (cons 2 "MOn_BLOC") (cons 70 64) (cons 10 '(0.0 0.0 0.0)))) (entmake (list (cons 0 "insert") (cons 2 "Bloc1") (cons 10 '(0.0 0.0 0.0)))) (entmake (list (cons 0 "insert") (cons 2 "Bloc2") (cons 10 '(0.0 0.0 0.0)))) (entmake '((0 . "endblk")))Il ne reste plus qu'à l'insérer @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 24 mai 2006 Posté(e) le 24 mai 2006 Salut, Pour créér un bloc en VisualLISP, il n'est pas nécessaire d'insérer les entité qui le constituent dans un calque. On insère les entités (ou blocs imbriqués) directement dans la définition du bloc : On crée une définition de bloc (vide) dans la collection de blocs du dessin : (setq Bloc (vla-add (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object))) (vlax-3d-point '(0 0 0)) "Nom_du_Bloc" ) ) Pour y mettre des entités on utilise vla-add*, pour un bloc imbriqué : (vla-InsertBlock Bloc (vlax-3d-point ins) "Nom_du_bloc_imbriqué" ech_X ech_Y ech_Z rot ) ins est le point d'insertion dans le SCO du bloc parent ech_X, echY, echZ, les échelles en X, Y et Z rot la rotation Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 24 mai 2006 Posté(e) le 24 mai 2006 Ah ah ! C'est moi qui fait les réponse en vlisp à la place de Patrick_35 ;) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 24 mai 2006 Posté(e) le 24 mai 2006 Oh, je ne suis pas le roi du vlisp, mais je prends le plus simple, et puis si tu peux m'en apprendre, je suis preneur ;) Ce que tu fais, c'est créer un bloc avec les entités des autres blocs, mais pas de les imbriquer les un aux autres :P @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 24 mai 2006 Posté(e) le 24 mai 2006 Ce que tu fais, c'est créer un bloc avec les entités des autres blocs, mais pas de les imbriquer les un aux autres Si j'insère bloc_1 dans la définition de bloc_0 (comme dit plus haut) et que j'insère bloc_0 dans le dessin, quand je décompose bloc_0 je retrouve bloc_1 et pas les entités qui le constituent. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 24 mai 2006 Posté(e) le 24 mai 2006 Je crée les définitions Bloc_0, Bloc_1 et Bloc_2 dans la collection. Je mets deux cercles concentrique dans Bloc_1 et deux lignes dans Bloc_2. J'insère Bloc_1 et Bloc_2 dans Bloc_0. (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)) Bloc (vla-add (vla-get-Blocks AcDoc) (vlax-3d-point '(0 0 0)) "Bloc" ) Bloc_1 (vla-add (vla-get-Blocks AcDoc) (vlax-3d-point '(0 0 0)) "Bloc_1" ) Bloc_2 (vla-add (vla-get-Blocks AcDoc) (vlax-3d-point '(0 0 0)) "Bloc_2" ) ) (vla-addcircle Bloc_1 (vlax-3d-point '(0 0 0)) 10 ) (vla-addcircle Bloc_1 (vlax-3d-point '(0 0 0)) 5 ) (vla-addline Bloc_2 (vlax-3d-point '(-10 -10 0)) (vlax-3d-point '(10 10 0)) ) (vla-addline Bloc_2 (vlax-3d-point '(-10 10 0)) (vlax-3d-point '(10 -10 0)) ) (vla-InsertBlock Bloc (vlax-3d-point '(0 0 0)) "Bloc_1" 1.0 1.0 1.0 0.0 ) (vla-InsertBlock Bloc (vlax-3d-point '(0 0 0)) "Bloc_2" 1.0 1.0 1.0 0.0 ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 24 mai 2006 Posté(e) le 24 mai 2006 Comme ça, ce n'est pas idiot. J'avais plutôt pensé, après la création du nouveau bloc, à utiliser vla-minsertblockL'élève est en train de dépasser le maître ;) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 24 mai 2006 Posté(e) le 24 mai 2006 L'élève est en train de dépasser le maître Y'a encore du boulot ! Bonne nuit. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bred Posté(e) le 24 mai 2006 Auteur Posté(e) le 24 mai 2006 Oulà! Oulà! Oulà! ...N'allez pas trop vite, là !!! (j'ai laché le forum quelques heures et je ne contrôle plus mon post moi!!! :P )...Après avoir décortiqué un petit peu vos propositions, j'ai un doute sur la faisabilité, dans mon cas... donc je vais être un peu plus précis... 1 - J'insère en lisp une multitude de bloc imbriqués que j'explose à chaque insertion afin de retrouvé les blocs unitaires constituant le bloc imbriqué... (pour une raison expliqué plus loin (3)) et ces blocs sont mis dans un calque temporaire grâce à une boucle de : (setq a (vla-insertblock (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))) (vlax-3d-point pt) chem 1 1 1 (angle '(0 0 0) (trans (getvar "UCSXDIR") 0 (trans '(0 0 1) 1 0 T))))) (foreach b (vlax-safearray->list(vlax-variant-value (vla-explode a))) (vla-rotate b (vlax-3d-point pt)(/ (* pi Rot) 180)) (vla-put-layer b calq)) (vla-delete a) 2 - je fais une selection de ces blocs (la quantité des blocs peut varié de 10 à ... x000...???) dans le calque temporaire ... (setq sel (ssget "_X" ((8 . "Calque_Tempo")))) 3 - Je transforme cette mutitude de bloc unitaire en un seul bloc grâce à (command "_-block" "NomB" pt sel "" "_-INSERT" "NomB" pt "1" "1" 0) ... afin de retrouvé tous les blocs unitaire si on doit faire une décomposition ... donc je me demandais si je ne pouvais pas transformer la selection sel (qui est sous forme "Selection set: xxx") en bloc autremnent que par "_-block".... Je n'ai pas l'impression que vos propositions soient possibles dans mon cas... non ? merci en tout cas... Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
(gile) Posté(e) le 25 mai 2006 Posté(e) le 25 mai 2006 Excuse pour les digressions (qui n'en son pas en fait, on est bien dans le sujet). N'allez pas trop vite, là !!! C'est toi qui veut aller vite, tu viens juste de faire fonctionner un LISP avec command, que tu veux déjà faire la même chose avec entmake et/ou vla-..., je suis impressionné par une telle motivation. Je proposais une façon plus directe, qui évite de passer par un calque temporaire et un jeu de sélection. Plutôt que d'insérer les blocs dans un calque temporaire de l'espace objet (ModelSpace), les insérer directement dans le bloc "NomB". Message modifié : pour un fonctionnement en 3D, il faut être dans le SCG pour insérer les différents blocs dans "NomB". 1) - On affecte à la variable AcDoc le document actif- On effecte aux variables scu et scg le SCU courant et le SCG- On ajoute "NomB" à la collection : (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))) (if (= (getvar "ucsname") "") (setq scu (vla-add (vla-get-UserCoordinateSystems AcDoc) (vlax-3d-point (trans '(0 0 0) 1 0)) (vlax-3d-point (trans '(1 0 0) 1 0)) (vlax-3d-point (trans '(0 1 0) 1 0)) "SCU_courant" ) ) (setq scu (vla-item (vla-get-UserCoordinateSystems AcDoc) (getvar "ucsname") ) ) ) (setq scg (vla-add (vla-get-UserCoordinateSystems AcDoc) (vlax-3d-point '(0 0 0)) (vlax-3d-point '(1 0 0)) (vlax-3d-point '(0 1 0)) "SCG" ) ) (setq Bloc (vla-add (vla-get-Blocks AcDoc) (vlax-3d-point '(0 0 0)) "NomB" ) ) 2) - On passe en SCG- On insère, explose, rotationne ... directement dans le Bloc- On restaure le SCU NOTA : le point d'insertion et l'angle de rotaton sont spécifiés dans le SCO du bloc "NomB", il n'est plus nécessaire de faire (angle '(0 0 0) (trans (getvar "UCSXDIR") 0 (trans '(0 0 1) 1 0 T))) (vla-put-ActiveUcs AcDoc scg) (setq a (vla-insertblock Bloc (vlax-3d-point pt) chem 1 1 1 0 ) ) (foreach b (vlax-safearray->list (vlax-variant-value (vla-explode a))) (vla-rotate b (vlax-3d-point '(0 0 0)) (/ (* pi Rot) 180)) ) (vla-delete a) (vla-put-ActiveUcs AcDoc scu) 3) Pour insérer le bloc "NomB" dans l'espace objet (là on tient compte du SCU): (vla-insertblock (vla-get-ModelSpace AcDoc) (vlax-3d-point (trans '(0 0 0) 1 0)) "NomB" 1 1 1 (angle '(0 0 0) (trans (getvar "UCSXDIR") 0 (trans '(0 0 1) 1 0 T))) ) [Edité le 25/5/2006 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bred Posté(e) le 25 mai 2006 Auteur Posté(e) le 25 mai 2006 Ouaouh ... !!!Alors là je suis HEU-REUX ...Ton lisp, qui plus est avec commentaires, est vraiment fabuleux....Je ne pensais pas que l'on pouvais faire de tel chose... et c'est pourtant évident.... merci. Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
(gile) Posté(e) le 25 mai 2006 Posté(e) le 25 mai 2006 Il y a quand même un petit "inconvenient" : le lisp ajoute un (ou deux si le scu courant n'était pas nommé) SCU à la collection de SCU nommés. On peut supprimer scg avec un (vla-delete scg) à la fin du LISP, mais je n'ai pas trouvé le moyen de supprimer scu s'il a été ajouté à la collection, c'est le scu actif (pas de scu précédent en vlisp ?) PS : il y avait une erreur dans le code (vla-put-ActiveUcs AcDoc scg) à la place de (vla-put-ActiveUcs AcDoc scu) -un copier/coller pas corrigé- c'est réparé. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bred Posté(e) le 29 mai 2006 Auteur Posté(e) le 29 mai 2006 Heu... merci de ne pas m'en vouloir, mais je cherche, je cherche, et je ne comprend pas :Pourquoi s'embéter autant à passer du SCU au SCG etc ???J'ai fait queque test avec ton lisp, et quelque chose m'échape... j'ai enlever tout ton passage de mise en variable du SCU et SCG pour voir : Donc ceci sert à créer un bloc (NomB) et à en "empiler" dans la variable Bloc... et donc vu que l'on se sert des "vla", cela se crée dans le SCG (c'est ça non ?)... (defun Creat_Bloc_Imb (NomB pt_Base chem Rot / Bloc a b) (setq Bloc (vla-add (vla-get-Blocks (vla-get-activedocument (vlax-get-acad-object))) (vlax-3d-point '(0 0 0)) NomB)) ;Création bloc imbriqué /Pt_Base (setq a (vla-insertblock Bloc (vlax-3d-point pt_Base) chem 1 1 1 0)) (foreach b (vlax-safearray->list(vlax-variant-value (vla-explode a))) (vla-rotate b (vlax-3d-point pt_Base)(/ (* pi Rot) 180))) (vla-delete a) ) Puis ceci sert à inserer le bloc NomB... et donc on utilise "(angle '(0 0 0) (trans (getvar "UCSXDIR") 0 (trans '(0 0 1) 1 0 T)))" pour l'inserer dans le SCU... (defun Ins_Bloc_Imb (NomB pt) (vla-insertblock (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))) (vlax-3d-point (trans pt 1 0)) NomB 1 1 1 (angle '(0 0 0) (trans (getvar "UCSXDIR") 0 (trans '(0 0 1) 1 0 T)))) ) Eh ben, je croyais avoir compris.... mais ça ne marche (presque) pas, et bien sûr tu vas me dire que c'est parceque je n'utilise pas le lisp de passage SCU/SCG que tu t'es embété à m'écrire...Enfin quoi... ça marche presque en fait.... si je laisse mon Z tranquille, pas de problème, mon bloc imbriqué s'insert bien dans le SCU (avec X et Y parallele ou non au SCG)... par contre, dès que je change l'orientation du Z (non parrallèle au SCG), là rien ne vas plus... (le bloc imbriqué est faux, donc c'est dû à une erreur de point d'insertion DANS la variable Bloc... que je croyais en SCG moi...) Je ne comprend vraiment pas pourquoi... Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
(gile) Posté(e) le 29 mai 2006 Posté(e) le 29 mai 2006 Salut, La programmation en 3D (SCU non parallèles au SCG) présente des difficultés devant lesquelles même les meilleurs butent. Il faut comprendre la notion de Normale du plan du SCU ou du SCO de certaines entités (ou direction d'extrusion). C'est la propriété Normal en vlisp, ou le code DXF 210 d'une entité, ou encore ce que l'on obtient par (trans '(0 0 1) 1 0 T) pour un SCU (voir ce sujet). et donc vu que l'on se sert des "vla", cela se crée dans le SCG (c'est ça non ?)... C'est un peu plus complexe, avec (vla-InsertBlock ...), si le point d'insertion doit être donné dans le SCG, le bloc est inséré suivant la normale du SCU courant, c'est pourquoi je proposais la méthode consistant à passer en SCG pour l'insertion de blocs dans une définition de bloc (définie, elle, dans le SCG) puis de restaurer le SCU précédent. La méthode n'est pas très élégante, comme je le dis plus haut, mais elle a le mérite de fonctionner. Mais cette discussion m'a donné une idée, de celles dont on se dit "Bon sang, mais c'est bien sûr ! Que n'y avais-je pensé plus tôt !" :modifier ladite propriété Normal des blocs insérés pour éviter le changement de SCU :D (setq a (vla-insertblock Bloc (vlax-3d-point pt) chem 1 1 1 0 ) ) [b](vla-put-Normal a (vlax-3d-point '(0 0 1)))[/b] (foreach b (vlax-safearray->list (vlax-variant-value (vla-explode a))) (vla-rotate b (vlax-3d-point '(0 0 0)) (/ (* pi Rot) 180)) ) (vla-delete a) Je te laisse le soin de tester plus en profondeur cette nouvelle méthode et te remercie grandement d'avoir permis à ma lanterne de s'éclairer. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bred Posté(e) le 30 mai 2006 Auteur Posté(e) le 30 mai 2006 ...te remercie grandement d'avoir permis à ma lanterne de s'éclairer. Ben de rien .... t'as raison de me remercier pour ça, j'ai presque l'impression de t'avoir aidé !!! (rire) :P Serieusement : j'ai testé ta solution et ça ne fonctionne pas complétement pour moi...Je pense comprendre grâce à tes explication la manière dont d'insert un bloc grâce à vla-insertblock, et donc il y a quelque chose qui m'echape... je n'arrive pas à "re-calculer" mon point d'insertion (j'essaye tous les "trans" possible mais rien n'y fait...) Cequi ne fonctionne pas chez moi c'est le "calcul" du point d'insertion. J'insert un même bloc plusieurs fois à changeant ces coordonnée à chaque fois : (setq w 1) (repeat (/ h 2) (Creat_Bloc_Imb NomB ptB NomBloc Rot) (setq ptB (list (+ (car ptB) (* w 2.50)) (+ (cadr ptB) (* w 1.50)) (+ (caddr ptB) 2.00)) Rot (+ Rot (* w 180)) w (* w -1) )) (defun Creat_Bloc_Imb (NomB pt_Base chem Rot / Bloc a b) (setq Bloc (vla-add (vla-get-Blocks (vla-get-activedocument (vlax-get-acad-object))) (vlax-3d-point '(0 0 0)) NomB)) (setq a (vla-insertblock Bloc (vlax-3d-point pt_Base) chem 1 1 1 (/ (* pi Rot) 180))) (vla-put-Normal a (vlax-3d-point '(0 0 1))) (vlax-safearray->list(vlax-variant-value (vla-explode a))) (vla-delete a) ) Le sens du bloc en Z est maintenant correct (grâce au "(vla-put-Normal a (vlax-3d-point '(0 0 1)))", mais le point d'insertion c'est de "l'art" ... j'ai beau cherché avec le "trans", je n'y arrive pas ... merci [Edité le 30/5/2006 par Bred] Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
(gile) Posté(e) le 30 mai 2006 Posté(e) le 30 mai 2006 j'ai presque l'impression de t'avoir aidé !!! Ben, oui ! J'apprends en même temps que toi, même si j'ai encore une petite longueur d'avance. Ta remarque est intéressante, je n'avais pas eu le temps de faire des tests approfondis. (vla-put-Normal ... ) semble déplacer le point d'insertion à l'intérieur du bloc "parent". J'ai trouvé une parade (pas très élégante, mais qui semble fonctionner) : insérer le bloc en (0 0 0) faire (vla-put-Normal ... ) puis déplacer le bloc du (0 0 0) à ptB. Sinon, deux petites remarques de "style" (ce ne sont pas des problèmes de fonctionnement) : En incluant la création du bloc "parent" dans Creat_Bloc_Imb, tu l'inclues aussi dans le (repeat ... ), il est possible de créer le bloc "parent" vide avant et de ne répéter que l'insertion/explosion des blocs. Si tu ne récupères pas la liste des entités après explosion, il n'est plus nécessaire de faire :(vlax-safearray->list(vlax-variant-value (vla-explode a))) En tenant compte des remarques ci-dessus, Creat_Bloc_Imb (l'argument Bloc est rajouté puisque défini ailleurs) : (defun Creat_Bloc_Imb (Bloc NomB pt_Base chem Rot / a b) (setq a (vla-insertblock Bloc (vlax-3d-point '(0 0 0)) chem 1 1 1 (/ (* pi Rot) 180) ) ) (vla-put-Normal a (vlax-3d-point '(0 0 1))) (vla-move a (vlax-3d-point '(0 0 0)) (vlax-3d-point ptB)) (vla-explode a) (vla-delete a) ) Pourcréer le bloc vide et le "remplir" : (setq Bloc (vla-add (vla-get-Blocks (vla-get-activedocument (vlax-get-acad-object)) ) (vlax-3d-point '(0 0 0)) NomB ) w 1 ) (repeat 3 (Creat_Bloc_Imb Bloc NomB ptB NomBloc Rot) (setq ptB (list (+ (car ptB) (* w 2.50)) (+ (cadr ptB) (* w 1.50)) (+ (caddr ptB) 2.00) ) Rot (+ Rot (* w 180)) w (* w -1) ) ) Pour insérer le bloc NomB : (vla-insertblock (vla-get-ModelSpace (vla-get-activedocument (vlax-get-acad-object)) ) (vlax-3d-point (trans '(0 0 0) 1 0)) "NomB" 1 1 1 (angle '(0 0 0) (trans (getvar "UCSXDIR") 0 (trans '(0 0 1) 1 0 T)) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bred Posté(e) le 30 mai 2006 Auteur Posté(e) le 30 mai 2006 Merci pour ta réponse, je vais la tester... Mais j'ai testé le lisp précedent ce dernier pour comprendre comment ça fonctionnait, et je trouve un truc "étrange" que peut-être tu pourrais élucider par ton experience : j'ai testé ceci : (setq Bloc (vla-add (vla-get-Blocks (vla-get-activedocument (vlax-get-acad-object))) (vlax-3d-point '(0 0 0)) "Bloc")) (setq a (vla-insertblock Bloc (vlax-3d-point (trans [surligneur] '(1 2 3)[/surligneur]1 0)) "MonBloc" 1 1 1 0)) (vla-put-Normal a (vlax-3d-point '(0 0 1))) (vlax-safearray->list(vlax-variant-value (vla-explode a))) (vla-delete a) en remplacant [surligneur] '(1 2 3)[/surligneur] par [surligneur] '(1 2 4)[/surligneur] puis par [surligneur] '(2 3 5)[/surligneur](donc insertion de "MonBloc" à 3 coordonées différentes...) Puis j'ai inséré le bloc "bloc" (vla-insertblock (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))) (vlax-3d-point (trans '(4 8 9) 1 0)) "Bloc3" 1 1 1 (angle '(0 0 0) (trans (getvar "UCSXDIR") 0 (trans '(0 0 1) 1 0 T)))) ... et j'ai pris les distances des 3 point d'insertion...- Entre le point '(1 2 3) et '(1 2 4), pas de problème (j'ai bien +1 en Z)- Entre le point '(1 2 4) et '(2 3 5) j'ai .... -1 sur les X ??? ... Y OK, Z OK ... Je ne comprends pas ... Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Bred Posté(e) le 31 mai 2006 Auteur Posté(e) le 31 mai 2006 ... J'ai enfin testé (en profondeur) ta proposition et elle fonctionne PAR-FAI-TE-MENT !!!Par "confort" d'utilisation j'ai sorti de tous ça 3 (4) petites routines à lancer à la suite pour créer donc un "bloc imbriqué" : ;;;; Création du Bloc Vide pour Construction Bloc Imbriqué ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun Creat_BlocImb (NomB) (setq Bloc_Imb (vla-add (vla-get-Blocks (vla-get-activedocument (vlax-get-acad-object))) (vlax-3d-point '(0 0 0)) NomB)) ) ;;;; Construction du Bloc Imbriqué dans Bloc Vide ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; (Const_BlocImb *Chemin bloc à insérer* *Point d'insert par rapport à (0 0 0)* *Rotation du Bloc en °*) (defun Const_BlocImb (chem pt_Base Rot / a) (setq a (vla-insertblock Bloc_Imb (vlax-3d-point '(0 0 0)) chem 1 1 1 (/ (* pi Rot) 180))) (vla-put-Normal a (vlax-3d-point '(0 0 1))) (vla-move a (vlax-3d-point '(0 0 0)) (vlax-3d-point pt_Base)) ) ;;;; Construction du Bloc Imbriqué dans Bloc Vide ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; ATTENTION !!! Les Blocs Insérés doivent être des blocs IMBRIQUES (Explosion du bloc à l'insertion) ;;;;; ;;;; (Const_BlocImbXXX *Chemin bloc à insérer* *Point d'insert par rapport à (0 0 0)**(defun Const_BlocImbXXX (chem pt_Base Rot / a) (setq a (vla-insertblock Bloc_Imb (vlax-3d-point '(0 0 0)) chem 1 1 1 (/ (* pi Rot) 180))) (vla-put-Normal a (vlax-3d-point '(0 0 1))) (vla-move a (vlax-3d-point '(0 0 0)) (vlax-3d-point pt_Base)) (vla-explode a) (vla-delete a) ) ;;; Insertion du Bloc Imbriqué;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun Ins_BlocImb (NomB pt) (vla-insertblock (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))) (vlax-3d-point (trans pt 1 0)) NomB 1 1 1 (angle '(0 0 0) (trans (getvar "UCSXDIR") 0 (trans '(0 0 1) 1 0 T)))) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; encore merci !!! Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
(gile) Posté(e) le 31 mai 2006 Posté(e) le 31 mai 2006 Je ne comprends pas ... Moi non plus, je ne comprends pas toujours, souvent, je constate, je teste, je tatonne et parfois je trouve sans avoir forcément vraiment compris. J'ai compris que quand on insère un bloc dans une définition de bloc on l'insère par rapport à l'origine (Origin) de cette définition (c'est pour çà qu'il est plus simple de choisir l'origine à (0 0 0)) et dans le plan du SCG. J'ai compris que lors de l'insertion le bloc "enfant" est inséré en conservant la normale (Normal) du SCU courant. C'est pour çà que la première solution proposée était de basculer en SCG pour faire ces opérations sans se poser trop de questions et de restaurer le SCU précédent ensuite. Après tu me fais noter que (vla-put-Normal ... ) modifie la position du point d'insertion par rapport à l'origine et je constate que ce n'est pas le cas si celui-ci est confondu avec l'origine (0 0 0). Là je ne comprends pas (peut-être une sorte de rotation 3D suivant un axe qui ne passerait pas par le point d'insertion ?), mais je trouve une "astuce" en insérant en (0 0 0), changeant la normale du bloc inséré, puis en le déplaçant du (0 0 0) vers le point d'insertion désiré. 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