Aller au contenu

ObjectDbx


Patrick_35

Messages recommandés

Bonjour,

Je viens de découvrir les ObjectDbx et cela ouvre des perspectives... :cool:

 

Voici une petite routine qui permet de manipuler un dessin sans l'ouvrir et d'utiliser via le vlisp comme n'importe quel dessin d'ouvert

 

(defun Ouvrir_dessin_dbx(dwg / dbx)
 (if (< (atoi (substr (getvar "ACADVER") 1 2)) 16)
   (setq dbx (vlax-create-object "ObjectDBX.AxDbDocument"))
   (setq dbx (vlax-create-object (strcat "ObjectDBX.AxDbDocument." (substr (getvar "ACADVER") 1 2))))
 )
 (vla-open dbx dwg)
 dbx
)

 

Un exemple pour recopier le bloc "Un_Bloc" du dessin c:\test.dwg et le mettre dans la table des blocs du document en cours.

Il ne restera plus qu'à l'insérer normalement

 

(setq Dbx (ouvrir_dessin_dbx "c:/test.dwg"))
(vla-CopyObjects Dbx (vlax-safearray-fill 
                      (vlax-make-safearray vlax-vbObject '(0 . 0))
                      (list (vla-item (vla-get-blocks dbx) "Un_Bloc"))
                    )
                    (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
)

 

et pour finir proprement

 

(vlax-release-object dbx)

 

@+

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

Fabuleux !

Et moi qui croyais qu'il fallait obligatoirement passer par C++

Tramber a l'eau à la bouche, moi je suis plus gourmand :

- as tu vu des possibilités d'écrire (et non pas lire) dans un dessin existant... ou même un dessin vierge

- Est il possible dans ce cas d'ajouter un objet non bloc (ligne)

 

moi si on me montre comment on écrit une ligne dans un dessin non ouvert, je veux bien écrire la bibliothèque qui permettra d'écrire les autres types d'objets et ensuite partager le tout dans la rubrique routines.

Lien vers le commentaire
Partager sur d’autres sites

Donc, pour les grands dévoreurs de lisps ;) Je dessine une ligne de 0,0 à 50,50 dans le dessin c:/test.dwg sans "l'ouvrir"

 

(setq Dbx (ouvrir_dessin_dbx "c:/test.dwg"))
(setq bl (vla-item (vla-get-blocks Dbx) "*Model_Space"))
(vla-addline bl (vlax-3d-point '(0.0 0.0 0.0)) (vlax-3d-point '(50.0 50.0 0.0)))
(vla-saveas Dbx "c:/test.dwg")
(vlax-release-object Dbx)

 

ps : j'ai testé un (vla-save Dbx) et j'ai un message d'erreur. Je ne comprends pas pourquoi :(

 

je veux bien écrire la bibliothèque qui permettra d'écrire les autres types d'objets et ensuite partager le tout dans la rubrique routines.

Bon, bah il ne reste plus qu'à attendre ;)

 

nb : Avec ces possibilités, les réacteurs et ObjectDCL, le vlisp est plus puissant que VBA ?

 

@+

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

Bonjour,

 

Cela devrait répondre à la question que je posais ici

http://www.cadxp.com/sujetXForum-7941.htm

Enfin je pense, je n'ai pas encore essayé.

 

C'est un peu comme ça que fonctionne le Design center, je suppose ?

 

Merci pour tes recherches fondamentales qui font toujours avancer le schimili..., le schilimi...

 

Amicalement

 

Zebulon_

 

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Lien vers le commentaire
Partager sur d’autres sites

Salut,

Je n'ai pas testé (je sais, je devrais) mais peut-être l'avez-vous fait : le fait de manipuler le dessin sans l'ouvrir, ça charge le AutoCAD.lsp ? (ou pour être plus précis : peut-on utiliser nos routine lisp perso pour manipuler le plan non ouvert ?)

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Lien vers le commentaire
Partager sur d’autres sites

Pour zebulon_

Oui, je pense que l'on peut faire le même chose qu'avec le désign center

 

Exemple avec un style de cote nommé "cotes_perso" et toujours le fichier test.dwg

 

(setq Dbx (ouvrir_dessin_dbx "c:/test.dwg"))
(vla-CopyObjects Dbx (vlax-safearray-fill 
                      (vlax-make-safearray vlax-vbObject '(0 . 0))
                      (list (vla-item (vla-get-dimstyles Dbx) "cotes_perso"))
                    )
                    (vla-get-dimstyles (vla-get-activedocument (vlax-get-acad-object)))
)

 

Pour Bred

Le AutoCAD.lsp n'est pas chargé puisque le dessin n'est pas ouvert, mais oui, on peut utiliser des routines lisps pour modifier ces dessins. Par contre, si tes routines sont prévues pour fonctionner en autolisp ou en vlisp sur le dessin courant, il faudra les adapter

 

@+

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

C'est top :)

 

ce que sait faire design center, on saura le faire en vlisp par l'intermédiaire de (ouvrir_dessin_dbx ...)

 

C'est quand même plus élégant que de faire des insertions de blocs, comme je faisais dans l'exemple ci-dessus

 

Amicalement

 

Zebulon_

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Lien vers le commentaire
Partager sur d’autres sites

Bon, bah il ne reste plus qu'à attendre ;)

 

nb : Avec ces possibilités, les réacteurs et ObjectDCL, le vlisp est plus puissant que VBA ?

Chose promise....chose dûe ; je m'y mets

çà m'apprendra à m'enthousiasmer trop vite en oubliant que j'ai déjà plein d'atres trucs à faire

Je ferai passer les diffrentes versions au fur et à mesure....

 

quand à la supériorité de Vlisp sur VBA, qui en doute dans ce forum ?

Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...

Bonsoir,

Lors de mes recherches sur les dbx, je suis tombé sur ça, en espérant que ça puisse vous aider, car, perso, je connais pas les parenthèses et encore moins le russe :P .

 

(defun C:TEST ( / from File obj )
(vl-load-com)
(setq from "D:\\test.dwg")
(setq File (vla-open (vla-get-documents(vlax-get-acad-object))  from))
;;;Делать все надо vla методами
(princ "\nИмя файла-")(princ (vlax-variant-value (vla-GetVariable File "DWGNAME")))
(princ "\nТекущий слой-")(princ (vlax-variant-value (vla-GetVariable File "CLAYER")))
(princ "\nКол-во объектов в модели-")(princ (vla-get-Count (vla-get-ModelSpace File)))
(princ "\nРисуем линию от 0,0 до 100,100")
(setq obj (vla-AddLine (vla-get-ModelSpace file) (vlax-3d-point '(0 0 0))(vlax-3d-point '(100 100 0))))
(vla-put-color obj  acRed) [surligneur]
(vla-saveas File from ac2004_dwg) [/surligneur] 
;(vla-put-ActiveDocument  (vlax-get-acad-object) File) ;_Можно сделать активным
(vla-close File)
(vlax-release-object File)
(princ)
) 

http:// http://www.autocad.ru/cgi-bin/f1/board.cgi?t=30550fh

 

Bonne continuation

 

à moins de faire comme en vb :

DBX.SaveAs (StrChemin) 

Ce qui revient à dire qu'il faut redonner le chemin même s'il le connait déjà.

...........je crois que j'ai assez dit de bêtises.

 

[Edité le 21/2/2007 par winfield]

Nous n’ héritons pas de la terre de nos ancêtres.Nous l’empruntons à nos enfants.

Lien vers le commentaire
Partager sur d’autres sites

  • 6 mois après...

Salut Pat !

 

Vraiment cool tes post !

 

j'ai fais quelques tests pour effacer un block spécifique dans tous les layouts

 

 (defun Ouvrir_dessin_dbx(dwg / dbx)
(if (< (atoi (substr (getvar "ACADVER") 1 2)) 16)
(setq dbx (vlax-create-object "ObjectDBX.AxDbDocument"))
(setq dbx (vlax-create-object (strcat "ObjectDBX.AxDbDocument." (substr (getvar "ACADVER") 1 2))))
)
(vla-open dbx dwg)
dbx
) 


(defun BATCH_BLKREM (block /)
(setq Dbx (ouvrir_dessin_dbx "c:/test.dwg"))
       (vlax-for bdb Dbx
         (vlax-for item bdb
           (if 
               (eq  (vla-get-objectname ent) "AcDbBlockReference")
             (if 
                (eq (strcase (vla-get-name item)) (strcase block)) 
               (vla-delete item)
             )
           )
         )
       )
)

 

cependant je recois un message d'erreur...

que fais-je de pas normal ?

Sky is the limit.....Mon oeuil !!

Lien vers le commentaire
Partager sur d’autres sites

ok..j'ai modifié mon lisp..

 

 (defun Ouvrir_dessin_dbx(dwg / dbx)
(if (< (atoi (substr (getvar "ACADVER") 1 2)) 16)
(setq dbx (vlax-create-object "ObjectDBX.AxDbDocument"))
(setq dbx (vlax-create-object (strcat "ObjectDBX.AxDbDocument." (substr (getvar "ACADVER") 1 2))))
)
(vla-open dbx dwg)
dbx
) 


(defun BATCH_BLKREM (bloc / dbx)
(setq Dbx (ouvrir_dessin_dbx "c:/test.dwg"));;#
 (setq blk (vla-get-blocks Dbx))
       (vlax-for bl blk
         (vlax-for ent bl
           (if (eq (vla-get-objectname ent) "AcDbBlockReference")
             (if (eq (strcase (vla-get-name ent)) (strcase bloc)) 
               (vla-delete ent)
             )
           )
         )
       )
 (vlax-release-object dbx)
)

 

Je n'ai plus d'erreur....mais il n'enfface rien.. ;-\

Sky is the limit.....Mon oeuil !!

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,...

 

Petite question ici..

 

est-ce que ceci..

(setq Dbx (vla-get-activedocument (vlax-get-acad-object)))

 

est exactement le même type que...

 (setq Dbx (ouvrir_dessin_dbx "c:/test.dwg"))

 

si oui...

 

Pourquoi

 (vla-purgeall Dbx)

et

(vla-AuditInfo Dbx :vlax-true)

ne sont pas reconnues ??

font-ils partie de (vl-load-com) ?

 

j'ai un peu de misère à saisir...

:P

Sky is the limit.....Mon oeuil !!

Lien vers le commentaire
Partager sur d’autres sites

oh !......

 

résultats..:

 ; IAxDbDocument: Interface IAxDbDocument
; Valeurs de propriétés:
;   Application (RO) = Une exception s'est produite
;   Blocks (RO) = #
;   Database (RO) = #
;   Dictionaries (RO) = #
;   DimStyles (RO) = #
;   ElevationModelSpace = 0.0
;   ElevationPaperSpace = 0.0
;   FileDependencies (RO) = #
;   Groups (RO) = #
;   Layers (RO) = #
;   Layouts (RO) = #
;   Limits = (0.0 0.0 420.0 297.0)
;   Linetypes (RO) = #
;   Materials (RO) = #
;   ModelSpace (RO) = #
;   Name = "c:/test.dwg"
;   PaperSpace (RO) = #
;   PlotConfigurations (RO) = #
;   Preferences (RO) = #
;   RegisteredApplications (RO) = #
;   SectionManager (RO) = Une exception s'est produite
;   SummaryInfo (RO) = #
;   TextStyles (RO) = #
;   UserCoordinateSystems (RO) = #
;   Viewports (RO) = #
;   Views (RO) = #
; Méthodes prises en charge:
;   CopyObjects (3)
;   DxfIn (2)
;   DxfOut (3)
;   HandleToObject (1)
;   ObjectIdToObject (1)
;   Open (2)
;   Save ()
;   SaveAs (2)

 

 

le ACTIVEDOCUMENT offre ceci..

 ; Méthodes prises en charge:
;   Activate ()
;   AuditInfo (1)
;   Close (2)
;   CopyObjects (3)
;   EndUndoMark ()
;   Export (3)
;   GetVariable (1)
;   HandleToObject (1)
;   Import (3)
;   LoadShapeFile (1)
;   New (1)
;   ObjectIdToObject (1)
;   Open (2)
;   PurgeAll ()
;   Regen (1)
;   Save ()
;   SaveAs (3)
;   SendCommand (1)
;   SetVariable (2)
;   StartUndoMark ()
;   Wblock (2)

 

 

Merci les gars..

donc si je comprend bien...

On peut effacer des entitiés....mais non les purger ? hhmm..

 

Sky is the limit.....Mon oeuil !!

Lien vers le commentaire
Partager sur d’autres sites

  • 5 semaines après...

Salut,

j'essaye de répondre à ce message en utilisant ta routine, et j'ai une erreur :

; erreur: Erreur Automation. Aucune description n'a été entrée.

 

... je ne vois pas où.....

 

(setq r (vl-filename-directory
  (getfiled "Sélectionnez UN fichier dans le répertoire à traiter :" "c:/" "dwg" 8)))
(setq lst-f (mapcar
      '(lambda (x) (strcat r x)) (vl-directory-files r "*.dwg" 1)))

; test
(setq f (Ouvrir_dessin_dbx (car lst-f)))

 

merci !....

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

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é