Aller au contenu

vla-active


souchier

Messages recommandés

bonjours a tous

j'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"]

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

 

 

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

j'allais juste poster pour dire d'utiliser SAS. :D

 

Sinon, je me demande si avec un open avec ObjectDBX on peut aussi modifier

des 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...

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

(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]

Lien vers le commentaire
Partager sur d’autres sites

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 ;)

 

souchier

Je t'ai indiqué un lisp. Inutile d'utiliser le blackboard.

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Effectivement, on peut aussi utiliser un fichier de chargement automatique des routines LISP

Tu 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

Lien vers le commentaire
Partager sur d’autres sites

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

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.

 

Lien vers le commentaire
Partager sur d’autres sites

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité