didicools Posté(e) le 5 mars 2010 Posté(e) le 5 mars 2010 Bonjour a tous, Je me lance, enfin j'essaye <acronym class=dict title=, dans le lisp et dans le vlisp. Je rencontre une difficulté et malgrès mes recherches je trouve pas. Voila mon souci: J'ai un fichier qui contient eu bloc avec attribut, le fichier contenant le bloc s'appel FICHIER, le bloc dans le FICHIER s'appel BLOC et son attribut s'apelle REPERE. en LISP, donc dans le dessin courant, j'arrive a insérer ce FICHIER en temps que bloc, le décomposé, selectionner la dernière entité pour avoir l'attribut et le modifier. Je voudrai faire cette maip en VLISP dans un dessin qui ne sera pas ouvert, mais je bloque, j'arrive bien insérer le FICHIER en temps que bloc mais j'arrive pas a le décomposer, sélectionner la dernière entité pour pouvoir modifier l'attribut. sur le dessin courant j'arrive a modifier l'attribut en VLISP mais en passant par un ENTLAST pour selectionner la dernière entité. Auriez vous la solution ?? Merci !!
capde06 Posté(e) le 5 mars 2010 Posté(e) le 5 mars 2010 (command "inserer" "*mon bloc.dwg" etc.... quand on met un asterix devant le fichier il arrive décomposé Vous fîtes ce que vous pûtes et vous m'épatâtes !!!!
didicools Posté(e) le 5 mars 2010 Auteur Posté(e) le 5 mars 2010 Merci capde06, je savais pas pour l'asterix, ca va allégé mon code de base, par contre je souterai le faire en vlisp pour pouvoir modifier l'attribut du bloc qui sera inséré dans un dessin sans l'ouvrir. J'arrive bien a insérer un bloc en vlisp dans un dessin sans l'ouvrir mais pas a modifier l'attribut. Et comme je souhaite faire une boucle pour insérer plusieur fois le meme bloc, il faut que je sélectionne la dernière entité avant l'insertion du bloc suivant pour modifier l'attribut.
Patrick_35 Posté(e) le 5 mars 2010 Posté(e) le 5 mars 2010 Salut Je suppose que tu connais ObjectDbx. En vlisp, tu peux déclarer une variable pour l'insertion de ton bloc (setq bl (vla-insertblock ...)), puis faire (vla-explode bl) pour le décomposer Pour ce qui est de récupérer ce qui a été décomposé, cela se complique.Avant de décomposer le bloc inséré, il faut regarder le nombre d'objets qui existent dans l'espace d'insertion du bloc (objet ou papier) --> (setq tot (vla-get-count (vla-get-modelspace/paperspace ...)))Décomposer le bloc.Et ensuite, une bouche avec un (vla-item (vla-get-modelspace/paperspace ...) (+ tot boucle)) pour retrouver les éléments décomposés, dont le bloc recherché pour enfin lui changer son attribut. @+ 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 5 mars 2010 Posté(e) le 5 mars 2010 qui sera inséré dans un dessin sans l'ouvrir Si, comme je le pense tu utilises ObjectDBX, tu n'as accès qu'à la base de données du dessin pas à son éditeur. Tu ne peux donc pas utiliser la fonction command. Je ne comprends pas bien ton imbrication FICHIER/BLOC qui t'oblige à décomposer FICHIER (qui est un bloc) pour accéder à un attribut dans BLOC. Si fichier ne contient que BLOC, il y a, à mon avis, une imbrication inutile. Fais un WBLOC en choisissant l'option Bloc et en sélection BLOC dans la liste déroulante, tu obtiendras un fichier BLOC.dwg que tu pourras insérer en tant que bloc et accéder à l'attribut sans avoir besoin de le décomposer. Si FICHIER contient d'autres entités que BLOC que tu veux insérer directement dans l'espace objet du fichier cible, plutôt que d'insérer FICHIER en tant que bloc et chercher à le décomposer ensuite, copie tous les objets de l'espace objet de FICHIER dans l'espace objet du fichier source avec vla-CopyObjects Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
didicools Posté(e) le 5 mars 2010 Auteur Posté(e) le 5 mars 2010 J'ai une autre idée, si j'insère mon bloc dans le dessin courant, je mofie l'attribut (ca je c faire), je le selectionne avec ENTLAST et je le copie/colle dans mon fichier de destination (sans l'ouvrir). Est ce que ca c possible ? si oui, qu'elle fonction puis-je utilisé ? vla-CopyObjects ?
didicools Posté(e) le 5 mars 2010 Auteur Posté(e) le 5 mars 2010 je pense avoir trouvé http://cadxp.cadmag.info/XForum+viewthread-fid-102-tid-15426.html?POSTNUKESID=115a420d424a281c49f739ebd8d86d32
didicools Posté(e) le 5 mars 2010 Auteur Posté(e) le 5 mars 2010 Bon il copie bien le bloc mais ne garde pas la valeur de l'attribut
(gile) Posté(e) le 5 mars 2010 Posté(e) le 5 mars 2010 Salut, Dans l'exemple que tu donnes c'est la définition du bloc qui est copiée. Il faut modifier l'attribut dans la référence insérée dans le dessin cible. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
didicools Posté(e) le 5 mars 2010 Auteur Posté(e) le 5 mars 2010 ok, en tous cas, tous cela me fait avancé un peu sur le vlisp, c'est déja ca. Comment pourai-je modifier l'attribut du bloc que je viens d'insérer? [Edité le 5/3/2010 par didicools]
(gile) Posté(e) le 5 mars 2010 Posté(e) le 5 mars 2010 Un exemple :le dessin "D:\Dessin1.dwg" est le dessin cible, il est fermé.le fichier "C:\\gile\\gile_blocs\\bloc-att.dwg" a été fait avec WBLOC (méthode explique plus haut) et contient 2 attributs (ATT1 et ATT2), il es fermé lui aussi.Le bloc "bloc-att" est inséré dans l'espace objet de "D:\Dessin1.dwg" et les valeurs des attributs sont modifiées. ;;; gc:GetAxDbDoc ;;; Accéder à un dessin fermé ;;; ;;; Retourne : ;;; un objet IAxDbDocument si le document est trouve ;;; nil si le document n'a pu être trouvé ou s'il est ouvert ;;; ;;; Argument : ;;; Le chemin complet du fichier (defun gc:GetAxDbDoc (filename / axdbdoc release) (setq axdbdoc (vlax-create-object (if ( "ObjectDBX.AxDbDocument" (strcat "ObjectDBX.AxDbDocument." (itoa release)) ) ) ) (if (vl-catch-all-apply 'vla-open (list axdbdoc filename) ) (not (vlax-release-object axdbdoc)) axdbdoc ) ) (defun test (/ cible blkRef) (vl-load-com) (if (setq cible (gc:GetAxDbDoc "D:\\Dessin1.dwg")) (progn (setq blkRef (vla-InsertBlock (vla-get-ModelSpace cible) (vlax-3d-point '(10. 20. 0.)) "C:\\gile\\gile_blocs\\bloc-att.dwg" 1. 1. 1. 0. ) ) (foreach att (vlax-invoke blkRef 'GetAttributes) (cond ((= (vla-get-TagString att) "ATT1") (vla-put-TextString att "toto") ) ((= (vla-get-TagString att) "ATT2") (vla-put-TextString att "007") ) ) ) (vla-SaveAs cible "D:\\Dessin1.dwg") (vlax-release-object cible) ) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
didicools Posté(e) le 18 mars 2010 Auteur Posté(e) le 18 mars 2010 Merci gile, J'ai réussi a faire ce que je voulais mais maintenant j'aimerai si c'est possible insérer un bloc dynamique mais ca ne confonctionne pas ou a moitier, quand je fait un wbloc sur mon bloc dynamique et que je l'insère en vlisp avec le code que tu as donné, il me met un message d'erreur quand il s'enregistre en me disant de récupérer le dessin.
Patrick_35 Posté(e) le 18 mars 2010 Posté(e) le 18 mars 2010 Salut Tu utilises la commande vla-wbloc ?Si oui, oublie-la vite fait car tu as effectivement ce problème de récupérationIl faut utiliser à la place ObjectDbx puis vla-save.Cela revient au même, mais sans l'erreur Un exemple d'utilisation @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
didicools Posté(e) le 18 mars 2010 Auteur Posté(e) le 18 mars 2010 j'arrive bien a inserer mon bloc dynamique mais je vois pas comment je pourai modifier mon attribut [Edité le 18/3/2010 par didicools]
(gile) Posté(e) le 18 mars 2010 Posté(e) le 18 mars 2010 Salut, Je ne comprends pas le problème.Le fait que le bloc soit dynamique ou statique ne change rien.Je viens d'essayer le code que j'ai donné avec un bloc dynamique avec attribut, je n'ai aucun problème. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
didicools Posté(e) le 18 mars 2010 Auteur Posté(e) le 18 mars 2010 effectivement ca me pose plus de pb, est-ce que ca peu etre due a la version d'autocad, parce qu'entre mes 2 essai, je suis passé de la 2009 à la 2010 ? Une autre petite question, a quoi servent ces instruction : vla-StartUndoMark et vla-EndUndoMark Merci pour votre aide
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