souchier Posté(e) le 30 juillet 2009 Posté(e) le 30 juillet 2009 bonjours a tousj'essais d'employer ce code: ;__________ouverture d'un fichier_______________________________ (vl-load-com) (setq nom (findfile "c:/test/11.dwg")) ;Nom du dessin (if (= 0 (getvar "SDI")) (setq a (vla-open (vla-get-documents (vlax-get-acad-object)) nom :vlax-true)) ) (vla-activate a) ;__________debut changement attribut dans un cartouche_______ (setq ent (entnext)) (while ent (if (and (member '(0 . "ATTRIB") (entget ent)) (member '(2 . "DATE") (entget ent)) ) (progn (entmod (subst (cons 1 (strcat "nouveau nomF")) (assoc 1 (entget ent)) (entget ent) )) (entupd ent) ) ) (setq ent (entnext ent)) ) (princ) ;__________fin changement attribut__________________________ et a chaque fois je bloque sur (vla-activate a)Savez-vous pourquoi, à cet ligne il trourne en rond? [Édité par (gile) : ajout des bbcodes "Code"]
(gile) Posté(e) le 30 juillet 2009 Posté(e) le 30 juillet 2009 Salut et bienvenue, C'est normal, tu lances un LISP dans un document, tu en ouvres un autre et tu l'actives. Le LISP est actif dans le premier document (qui n'est plus actif). PS : la seconde partie de ton code semble n'avoir rien à voir avec la première. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
souchier Posté(e) le 30 juillet 2009 Auteur Posté(e) le 30 juillet 2009 en fait le but est d'ouvrir un document dwg et ensuite de modifier un attribut "date" d'un cartouche par un texte le premier code fonctionne sans "'val-active"le second fonctionne seul mais les deux à ce suivre ne fonctionne pas? le but a la fin est de pouvoir modifier la date d'une centaine de dwg ou tous autre attribut.avec une boucle d'ouverture fermeture de fichier,mais pour ce faire il faut que je passe cette étape Merci d'avance
(gile) Posté(e) le 30 juillet 2009 Posté(e) le 30 juillet 2009 Comme je le dis plus haut, un LISP ne peut agir que dans le document dans lequel il a été lancé. Une solution couramment employée consiste à utiliser un script pour ouvrir les DWG et à lancer le LISP dans le script.Tu peux utiliser SuperAutoScript d'Eric qui s'occupe de l'ouverture, enregistrement et fermeture des fichiers sélectionnés. il te suffit de faire une fonction LISP avec le code qui change l'attribut, charger automatiquement le LISP à l'ouverture de chaque document (ou appeler le chargement depuis le script) et de mettre un appel de la fonction dans la case script. Par ailleurs, le code qui modifie la valeur de l'attribue parcourt systématiquement toute la base de données du document, ce qui peut prendre un certains temps sur de gros fichiers, si, en plus, tu veux en traiter une centaine, il vaudrait mieux optimiser le code... Sélectionner d'abord les blocs cartouche (en les filtrant par le nom du bloc) puis parcourir les attributs de chaque référence jusqu'à trouver celui dont l'étiquette est "DATE". Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 30 juillet 2009 Posté(e) le 30 juillet 2009 Salut (gile) a raison.Un lisp ne peut être actif que sur le dwg actif.Tu ouvre un dwg, lance un lisp qui ouvre un autre dwg. Le lisp continu sur le 1er dwg, mais pas sur le second. Pour réaliser ton besoin, il faut travailler sur la variable a qui correspond au dwg ouvert et un iniquement en vlisp.Ton lisp de changement d'attribut ne peut fonctionner que sur le document actif. Tu as aussi la solution d'utiliser ObjectDbx, qui accède au dwg sans l'ouvrir dans autocad. Tu as regardé le lisp PAT qui doit correspondre à ton besoin ? @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bseb67 Posté(e) le 30 juillet 2009 Posté(e) le 30 juillet 2009 Salut, j'allais juste poster pour dire d'utiliser SAS. :D Sinon, je me demande si avec un open avec ObjectDBX on peut aussi modifierdes entités. Je voudrai tester, mais pas encore eu le temps d'essayer. mais un read avec ObjectDBX c'est super rapide :D :pour le boulot cela ma permit de passer de 45min avec un open classique dans autocad avec sasà 3min seulement Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
(gile) Posté(e) le 30 juillet 2009 Posté(e) le 30 juillet 2009 Oui, on peut accéder aux entités contenues dans les "Blocks" des "Layouts" avec ObjectDBX, mais j'ai préféré suggérer un méthode plus "simple" vu le niveau des questions posées. D'un autre côté, je n'ai pas fait les tests mais dans un document ouvert avec ObjectDBX ou vla-open on ne peut pas faire de sélection, on ne peut que scanner les espaces Model et Papier(s). Est-ce qu'on gagne autant de temps que ça ? Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
souchier Posté(e) le 30 juillet 2009 Auteur Posté(e) le 30 juillet 2009 (gile) a raison.Un lisp ne peut être actif que sur le dwg actif. ok n'en jetté plus,mais que penser de ce code: (setq nom (findfile "c:/test/11.dwg") ;Nom du dessin cou (vla-get-activedocument (vlax-get-acad-object)) ; Dessin courant dwg (vla-open (vla-get-documents (vlax-get-acad-object)) nom) ;Ouverture du dessin ) (vl-bb-set "toto" cou) ; Définition de la variable toto dans le blackboard (setq dwg_close (vla-activate dwg)) ; Je passe sur le dessin ouvert ;;;Et le dessin qui s'ouvre doit obligatoirement charger un lisp qui contient (and (vl-bb-ref "toto") (vla-close (vl-bb-ref "toto") :vlax-false)) ; fermeture de l'ancien dessin en récupérant la valeur de la variable toto ; dans le blackboard si variable existe (vl-bb-set "toto" nil) ; effacer la variable toto du blackboard par contre le ne sais pas faire le :;;;Et le dessin qui s'ouvre doit obligatoirement charger un lisp qui contient (and (vl-bb-ref "toto") (vla-close (vl-bb-ref "toto") :vlax-false)) a tester on peut trouver, peut être.merci pour vos commentaires , il me sont précieux. [Édité par (gile) : ajout des bbcodes]
Patrick_35 Posté(e) le 30 juillet 2009 Posté(e) le 30 juillet 2009 Salut (gile) Tu n'as pas le regen du document, ce qui peut faire gagner un temps énorme.Quant à parcourir la bd sur les layouts, cela va très vite.Il faut juste utiliser si possible une progress bas pour que psychologiquement, le temps ne paraisse pas trop long ;) souchierJe t'ai indiqué un lisp. Inutile d'utiliser le blackboard. @+ 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 30 juillet 2009 Posté(e) le 30 juillet 2009 Effectivement, on peut aussi utiliser un fichier de chargement automatique des routines LISPTu crées un fichier nommé acaddoc.lsp dans un chemin de recherche d'AutoCAD.Tu mets dans ce fichier les expressions que tu veux évaluer automatiquement à l'ouverture de chaque nouveau dessin. Je ne comprends pas l'intérêt de l'utilisation du BlackBoard. PS : s'il te plait, utilise les bbcodes quand tu postes du code (le bouton dièse [#]), tes messages seront plus facilement lisible. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 30 juillet 2009 Posté(e) le 30 juillet 2009 souchier Un exemple (setq mon_dwg (vla-open .....)) ; Ouvrir un dwg (vlax-for lay (vla-get-layouts mon_dwg) ; Parcourir tous les layouts (vlax-for ent (vla-get-block lay) ; rechercher les objets dans le layout (and (eq (vla-get-objectname ent) "AcDbBlockReference") : tester si c'est un bloc (mon lisp continu) ; la suite du lisp ) ) ) Cela fonctionne aussi bien avec un vla-open qu'avec ObjectDbx. Edit : Modif suivant remarque de (gile) en réponse 11 @+ [Edité le 30/7/2009 par Patrick_35] 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 30 juillet 2009 Posté(e) le 30 juillet 2009 Patrick_35, Il me semble que c'est plutôt :(vlax-for ent [surligneur](vla-get-Block lay)[/surligneur] ...) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
souchier Posté(e) le 30 juillet 2009 Auteur Posté(e) le 30 juillet 2009 merci pour tous vos commentaires. j'ai quelques test à faire, afin de faire évoluer mon apprentissage. le code de pat est suprprennant et il a du passer quelques temps à le développer. c'est super de travailer avec vous. @+ ps: pour sur, la fonction # est parfaite.
Patrick_35 Posté(e) le 30 juillet 2009 Posté(e) le 30 juillet 2009 Patrick_35, Il me semble que c'est plutôt :(vlax-for ent [surligneur](vla-get-Block lay)[/surligneur] ...) heu, tu as raison (gile) :red: Je corrige le message le code de pat est suprprennant et il a du passer quelques temps à le développer. C'est une adaptation de MAT avec des copier/coller d'autres lisps, pas plus d'1H avec les tests. c'est super de travailer avec vous. Tous le plaisir est pour nous :) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
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