Patrick_35 Posté(e) le 15 janvier 2007 Posté(e) le 15 janvier 2007 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Tramber Posté(e) le 15 janvier 2007 Posté(e) le 15 janvier 2007 Hummm, very interesting, rien qu'à le lire j'en ai l'eau à la bouche. Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Didier-AD Posté(e) le 15 janvier 2007 Posté(e) le 15 janvier 2007 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.
Patrick_35 Posté(e) le 16 janvier 2007 Auteur Posté(e) le 16 janvier 2007 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
zebulon_ Posté(e) le 16 janvier 2007 Posté(e) le 16 janvier 2007 Bonjour, Cela devrait répondre à la question que je posais icihttp://www.cadxp.com/sujetXForum-7941.htmEnfin 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)
Bred Posté(e) le 16 janvier 2007 Posté(e) le 16 janvier 2007 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...
Patrick_35 Posté(e) le 16 janvier 2007 Auteur Posté(e) le 16 janvier 2007 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 BredLe 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
zebulon_ Posté(e) le 16 janvier 2007 Posté(e) le 16 janvier 2007 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)
Didier-AD Posté(e) le 17 janvier 2007 Posté(e) le 17 janvier 2007 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 à faireJe ferai passer les diffrentes versions au fur et à mesure.... quand à la supériorité de Vlisp sur VBA, qui en doute dans ce forum ?
winfield Posté(e) le 21 février 2007 Posté(e) le 21 février 2007 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.
Patrick_35 Posté(e) le 21 février 2007 Auteur Posté(e) le 21 février 2007 Merci, c'est gentil de ta partA quand le lisp/vlisp ;) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
winfield Posté(e) le 21 février 2007 Posté(e) le 21 février 2007 Quelle question ! :exclam: Quand je serai à la retraite............j'aurais plus de temps :P (ça, c'est à voir :( ) Nous n’ héritons pas de la terre de nos ancêtres.Nous l’empruntons à nos enfants.
Patrick_35 Posté(e) le 22 février 2007 Auteur Posté(e) le 22 février 2007 Quelle question ! :exclam: C’est pour changer du vba et pour que tu sois un peu moins esseulé @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
winfield Posté(e) le 22 février 2007 Posté(e) le 22 février 2007 Je me sens l'âme d'un irréductible.....mes profs me le disaient déjà. :cool: Nous n’ héritons pas de la terre de nos ancêtres.Nous l’empruntons à nos enfants.
ASTERIXII Posté(e) le 22 février 2007 Posté(e) le 22 février 2007 Donc il est possible de connaitre des valeurs d'attributs, les xref dans le dessin les images ?
CADarome Posté(e) le 19 septembre 2007 Posté(e) le 19 septembre 2007 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 !!
CADarome Posté(e) le 19 septembre 2007 Posté(e) le 19 septembre 2007 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 !!
Patrick_35 Posté(e) le 19 septembre 2007 Auteur Posté(e) le 19 septembre 2007 Salut Je n'ai plus d'erreur....mais il n'enfface rien.. ;-\ ll faut peut-être sauver le dessin ;) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
CADarome Posté(e) le 19 septembre 2007 Posté(e) le 19 septembre 2007 HA HA !! j'ai ajouté effectivement (vla-saveas Dbx "c:/test.dwg") Merci beaucoup. ;-)[Edité le 19/9/2007 par CADarome] [Edité le 19/9/2007 par CADarome] Sky is the limit.....Mon oeuil !!
CADarome Posté(e) le 24 septembre 2007 Posté(e) le 24 septembre 2007 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 !!
(gile) Posté(e) le 24 septembre 2007 Posté(e) le 24 septembre 2007 Salut, Essaye : (vlax-dump object (vla-get-ActiveDocument (vlax-get-acad-object)) T) et (vlax-dump-object (ouvrir_dessin_dbx "c:/test.dwg") T) Tu auras les propriétés accessibles et les méthodes applicables pour les deux objets. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 25 septembre 2007 Auteur Posté(e) le 25 septembre 2007 La réponse de (gile) est excellente car par ce biais, tu verras que ces deux fonctionnalités ne sont pas accessibles. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
CADarome Posté(e) le 25 septembre 2007 Posté(e) le 25 septembre 2007 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 !!
Patrick_35 Posté(e) le 25 septembre 2007 Auteur Posté(e) le 25 septembre 2007 On peut effacer des entitiés....mais non les purger ? hhmm.. Oui @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Bred Posté(e) le 25 octobre 2007 Posté(e) le 25 octobre 2007 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...
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