Aller au contenu

Lire la valeur d'un Attribut (d'un bloc) hors du dessin


Messages recommandés

Posté(e)

Bonjour,

 

Ma question, est-il possible de lire la valeur d'un Attribut d'un bloc sans qu'il soit dans le dessin, et sans l'ouvrire.

Scanner un répertoire, et lire un attribut dans un ensemble de bloc ?

Posté(e)

Salut,

 

Avec ObjectDBX (Visual LISP uniquement), on peut accéder à la base de donnée (database) d'un dessin sans l'ouvrir dans l'éditeur.

Ce qui veut dire, qu'on aura pas la possibilité d'utiliser les fonctionnalités de l'éditeur comme les commandes ou les sélections, mais on peut très bien parcourir le bloc de l'espace objet pour y retrouver des objets puis les lire et/ou modifier.

 

Une fonction qui retourne le Document (AxDbDocument) du fichier passé en argument (ou nil s'il n'a pu être ouvert).

 

;;; 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 :
;;; filename : le chemin complet du fichier
;;;
;;; Exemple d'utilisation :
;;; (if (setq doc (gc:GetAxDbDoc filename))
;;;   (progn
;;;     ...
;;;     ...
;;;     (vlax-release-object doc)
;;;   )
;;; )

(defun gc:GetAxDbDoc (filename / acadver progId axdbdoc)
 (vl-load-com)
 (setq	progId
 (if (< (setq acadver (substr (getvar 'acadver) 1 2)) "16")
   "ObjectDBX.AxDbDocument"
   (strcat "ObjectDBX.AxDbDocument." acadver)
 )
 )
 (if (setq axdbdoc (vlax-create-object progId))
   (if	(vl-catch-all-apply
  'vla-open
  (list axdbdoc filename)
)
     (not (vlax-release-object axdbdoc))
     axdbdoc
   )
 )
)

 

Exemple d'utilisation simple (affiche le nombre d'entité contenues dans l'espace objet du dessin) :

Note que c'est le programme qui a la resposabiblité de libérer les ressources de l'objet externe ObjectDBX, avec vlax-release-object.

 

(if (setq doc (gc:GetaxDbDoc
	"C:\\Program Files\\Autodesk\\AutoCAD 2014\\Sample\\ActiveX\\ExtAttr\\attrib.dwg"
      )
   )
 (progn
   (princ
     (strcat "\n" (itoa (vla-get-Count (vla-get-ModelSpace doc))) " entités dans l'espace objet")
   )
   (vlax-release-object doc)
 )
 (princ "\nEchec à l'ouverture du fichier.")
)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Salut Gile

 

par curiosité j'ai essayé ton lisp et j'ai ceci en retour

"Commande: no function definition: GC:GETAXDBDOC"

 

(je suis sous MEP2014)

merci d'avance.

AHG

 

 

Salut,

 

Avec ObjectDBX (Visual LISP uniquement), on peut accéder à la base de donnée (database) d'un dessin sans l'ouvrir dans l'éditeur.

Ce qui veut dire, qu'on aura pas la possibilité d'utiliser les fonctionnalités de l'éditeur comme les commandes ou les sélections, mais on peut très bien parcourir le bloc de l'espace objet pour y retrouver des objets puis les lire et/ou modifier.

 

Une fonction qui retourne le Document (AxDbDocument) du fichier passé en argument (ou nil s'il n'a pu être ouvert).

 

;;; 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 :
;;; filename : le chemin complet du fichier
;;;
;;; Exemple d'utilisation :
;;; (if (setq doc (gc:GetAxDbDoc filename))
;;;   (progn
;;;     ...
;;;     ...
;;;     (vlax-release-object doc)
;;;   )
;;; )

(defun gc:GetAxDbDoc (filename / acadver progId axdbdoc)
 (vl-load-com)
 (setq	progId
 (if (< (setq acadver (substr (getvar 'acadver) 1 2)) "16")
   "ObjectDBX.AxDbDocument"
   (strcat "ObjectDBX.AxDbDocument." acadver)
 )
 )
 (if (setq axdbdoc (vlax-create-object progId))
   (if	(vl-catch-all-apply
  'vla-open
  (list axdbdoc filename)
)
     (not (vlax-release-object axdbdoc))
     axdbdoc
   )
 )
)

 

Exemple d'utilisation simple (affiche le nombre d'entité contenues dans l'espace objet du dessin) :

Note que c'est le programme qui a la resposabiblité de libérer les ressources de l'objet externe ObjectDBX, avec vlax-release-object.

 

(if (setq doc (gc:GetaxDbDoc
	"C:\\Program Files\\Autodesk\\AutoCAD 2014\\Sample\\ActiveX\\ExtAttr\\attrib.dwg"
      )
   )
 (progn
   (princ
     (strcat "\n" (itoa (vla-get-Count (vla-get-ModelSpace doc))) " entités dans l'espace objet")
   )
   (vlax-release-object doc)
 )
)

Posté(e)

Salut,

 

Il faut, bien sûr, charger la routine gc:GetAxDbDoc avant de lancer l'expression :

(if (setq doc (gc:GetAxDbDoc ...)) ...)

 

Il faut aussi changer le chemin du fichier à ouvrir si besoin (dans l'exemple, il s'agit d'un fichier dans le répertoire Sample d'AutoCAD 2014).

J'ai ajouté l'affichage d'un message en cas d'échec à l'ouverture du fichier.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

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é