Aller au contenu

Modification attribut


didicools

Messages recommandés

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 !!

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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

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

Lien vers le commentaire
Partager sur d’autres sites

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 ?

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

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.

Lien vers le commentaire
Partager sur d’autres sites

Salut

 

Tu utilises la commande vla-wbloc ?

Si oui, oublie-la vite fait car tu as effectivement ce problème de récupération

Il faut utiliser à la place ObjectDbx puis vla-save.

Cela revient au même, mais sans l'erreur

 

Un exemple d'utilisation

 

@+

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

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é