| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Datei öffnen, Layout anzeigen (3928 mal gelesen)
|
jupa Ehrenmitglied V.I.P. h.c. Ruheständler
Beiträge: 6050 Registriert: 16.09.2004 Windows 10 64bit, ACAD Rel. 14 - ACAD 2023
|
erstellt am: 09. Sep. 2010 13:37 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, wie ist es möglich, aus einer Drittanwendung heraus (konkret MS Access) eine AutoCAD-Zeichnung zu öffnen !und! dabei auch gleich ein bestimmtes Layout dieser Zeichnung anzeigen zu lassen? jupa
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 Hinweis: Meine Mitarbeit auf CAD.DE ist fakultativ, unentgeltlich und beruht nur auf einem ausgeprägtem Helfersyndrom.
|
erstellt am: 09. Sep. 2010 13:43 <-- editieren / zitieren --> Unities abgeben: Nur für jupa
|
jupa Ehrenmitglied V.I.P. h.c. Ruheständler
Beiträge: 6050 Registriert: 16.09.2004 Windows 10 64bit, ACAD Rel. 14 - ACAD 2023
|
erstellt am: 09. Sep. 2010 17:26 <-- editieren / zitieren --> Unities abgeben:
Danke für die Antwort. Aber wie sag ich's nun meinem Kinde? Meine VBA-Kenntnisse (und darauf läuft es ja sicherlich hinaus) streben leider gegen Null. Wären vielleicht ein paar Codezeilen als Beispiel möglich? TIA jupa Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 09. Sep. 2010 17:37 <-- editieren / zitieren -->
Hi, zeig mal den Code, mit dem Du AutoCAD aus MSAccess startest, ich setz Dir den Rest ein, wenn ich Deines verstehe. - alfred - ------------------ www.hollaus.at |
jupa Ehrenmitglied V.I.P. h.c. Ruheständler
Beiträge: 6050 Registriert: 16.09.2004 Windows 10 64bit, ACAD Rel. 14 - ACAD 2023
|
erstellt am: 10. Sep. 2010 08:37 <-- editieren / zitieren --> Unities abgeben:
Im einfachsten Fall könnte das wohl so aussehen: Private Sub Befehl0_Click() Call Shell("""D:\Programme\Autodesk\AutoCAD 2009\acad.exe""", 1) End Sub Den Dateinamen und das gewünsche Layout wöllte ich gern als Parameter übergeben, aber was kann der shell-Befehl mit diesen Parametern anfangen?
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 10. Sep. 2010 09:26 <-- editieren / zitieren -->
Hi, nee, so nicht, dieser Weg ist ein sehr übler Weg, denn Du hast AutoCAD zwar gestartet, aber nicht an der Leine. Sprich nachdem das AutoCAD gestartet ist, obliegt es nicht mehr Deiner Kontrolle. Dazu kommt, dass Du mit diesem Weg AutoCAD mehrfach startest, wenn Du mehrere DWG's aus Deinem MSAccess öffnest ==> das macht wenig Sinn und ist speichermordend. Willst Du trotzdem bei diesem Weg bleiben, dann guck Dir dieses an: >>>Starten von AutoCAD mit Script<<<, da kannst Du zuerst eine Scriptdatei schreiben (aus Deinem MSAccess-Makro) und dann AutoCAD mit diesem Script starten. Besser (und stabiler, weil mehr Kontrolle) hast Du es, wenn Du über den ActiveX-Server von AutoCAD gehst, also ähnlich wie:
Code: On Error Resume Next Dim tAcadApp as AcadApplication Set tAcadApp = GetObject(,"AutoCAD.Application") 'verbindet sich mit AutoCAD, wenn dieses schon laeuft If tAcadApp is Nothing then 'dann laeuft noch keine AutoCAD-Session ==> also eine starten set tAcadApp = CreateObject("AutoCAD.Application") end if if tAcadApp is Nothing then 'dann Fehlermeldung ausgeben, AutoCAD kann nicht gestartet werden else tAcadApp.Visible = true '..... Dein Code, jetzt hast Du AutoCAD in der Hand end if
HTH, - alfred - ------------------ www.hollaus.at |
jupa Ehrenmitglied V.I.P. h.c. Ruheständler
Beiträge: 6050 Registriert: 16.09.2004 Windows 10 64bit, ACAD Rel. 14 - ACAD 2023
|
erstellt am: 10. Sep. 2010 17:29 <-- editieren / zitieren --> Unities abgeben:
Danke für Deine Bemühungen. Ich muß aber wohl erst mal meine Hausaufgaben machen. Erstens läuft der code bei mir nicht: Kompilierfehler, daß benutzerdefinierter Typ (vermutlich der Typ AcadApplication ?) nicht definiert sei. Zweitens vermisse ich nach meinem Verständnis die Stelle, an der ich dem Programm mitteile, wo denn eigentlich nach dem zu startenden AutoCAD gesucht werden soll. (Diese Frage drängt sich bei mir insbesonders deshalb auf, da ich mehrere AutoCAD-Versionen auf meinem Rechner installiert habe. Mit welchem soll das Programm nun kommunizierren?). Vermutlich habe ich das ganza überhaupt noch nicht verstanden - also zurück in die Vorschulklasse ;-( jupa Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 10. Sep. 2010 17:35 <-- editieren / zitieren -->
Hi, Du kannst auch statt AcadApplication die Deklaration als Object machen. Das bringt mal den Fehler beim Kompilieren weg. Später wirst Du dann unter Extras ==> Verweise die Acad-TypeLibrary hinzufügen, weil der Code dann leichter zu schreiben ist, aber auch leider nicht mehr AutoCAD-Versions-neutral. Und die Version kannst Du indirekt angeben bei GetObject bzw. CreateObject, hier kannst Du z.B. AutoCAD.Application.18.1 angeben, wenn Du willst, dass AutoCAD 2011 startet. - alfred - ------------------ www.hollaus.at |
jupa Ehrenmitglied V.I.P. h.c. Ruheständler
Beiträge: 6050 Registriert: 16.09.2004 Windows 10 64bit, ACAD Rel. 14 - ACAD 2023
|
erstellt am: 10. Sep. 2010 18:35 <-- editieren / zitieren --> Unities abgeben:
Danke für Deine unendliche Geduld. Das funktioniert nun schon soweit, daß ich jede installierte AutoCAD-Version starten kann. Wenn Du mir jetzt noch verrätst, wie ich mich nun mit AutoCAD "unterhalten" kann (wo findet man die ganzen Objekte, Methoden, Eigenschaften?), vielleicht am eingangs genannten Beispiel, ein bestimmtes Layout einer bestimmten Datei zu öffnen? (BTW : Verweis auf die AutoCAD-Typbibliothek ist inzwischen eingebunden) jupa Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 10. Sep. 2010 18:48 <-- editieren / zitieren -->
Hi, das Objekt tAcadApp ist jetzt Dein ActiveX-Server, den Du unterhalten kannst, über den Du verfügen kannst, sogar (ganz entgegen der feinen Art) dem Du Deine gesamte Meinung aufzwingen kannst. Als solches steht Dur tAcadApp.Documents zur Verfügung und hier die Methode .Open, um eine Datei zu öffnen. Danach (nach dem Öffnen) hast Du auch schon das aktuelle Document (DWG-File) direkt vor dem Schuh und ein Kick in die Richtung <F1> (für Hilfe) zeigt Dir dann auch gleich die möglichen Zugriffe und Eigenschaften, die für so ein Objekt möglich sind. Also
Code: dim tAcadDoc as AcadDocument Set tAcadDoc = tAcadApp.Documents.Open("C:\TEMP\XX.DWG") 'hier natürlich Dein DWG-Name tAcadDoc.Active<<<<<und genau hier hast DU schon eine Liste von Methodenoder tAcadDoc.SendCommand(.... <<<<<hier Deine Befehle, wenn Du mit diesen besser kannst, um das Layout zu aktivieren.
Viel Erfolg, - alfred - ------------------ www.hollaus.at |
jupa Ehrenmitglied V.I.P. h.c. Ruheständler
Beiträge: 6050 Registriert: 16.09.2004 Windows 10 64bit, ACAD Rel. 14 - ACAD 2023
|
erstellt am: 10. Sep. 2010 19:39 <-- editieren / zitieren --> Unities abgeben:
|
jupa Ehrenmitglied V.I.P. h.c. Ruheständler
Beiträge: 6050 Registriert: 16.09.2004 Windows 10 64bit, ACAD Rel. 14 - ACAD 2023
|
erstellt am: 12. Sep. 2010 10:14 <-- editieren / zitieren --> Unities abgeben:
Irgendwo hab' ich noch 'nen Denkfehler. Mein aktueller Code: Dim tAcadApp As Object Dim tAcadDoc As AcadDocument Set tAcadApp = GetObject(, "AutoCAD.Application.18.1") If tAcadApp Is Nothing Then Set tAcadApp = CreateObject("AutoCAD.Application.18.1") End If If tAcadApp Then tAcadApp.Visible = True Set tAcadDoc = tAcadApp.Documents.Open("D:\test.dwg") If tAcadDoc.Active = True Then 'nun ein paar Varianten 'tAcadDoc.SendCommand ("setvar ctab layout1" + Chr(13)) ' so geht's, ist aber sicherlich wenig elegant. Set tAcadDoc.ActiveLayout = "Layout1" 'wechselt nicht wie ich erwarte zum Layout 'tAcadDoc.ActiveLayout = "Layout1" 'Fehlermeldung Typunverträglichkeit End If End If Die Zeile mit SendCommand funktioniert, gefällt mir aber nicht. Mit Set tAcadDoc.ActiveLayout = "Layout1" passiert nichts. Ich hoffte, daß man damit die Eigenschaft welches das aktuelle Layout sei auf einen beliebigen Wert setzen könne. ("Layout1" existiert natürlich). Wildes Probieren: tAcadDoc.ActiveLayout = "Layout1" scheitert an Typunverträglichkeit. Wie gehts denn nun richtig?
Any help would be very appreciated. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 12. Sep. 2010 10:27 <-- editieren / zitieren -->
Hi, zuerst mal: diese Zeile ist fragwürdig: If tAcadApp Then ...denn tAcadApp ergibt kein True/False Resultat, besser: If (not (tAcadApp is Nothing)) Then Und zu dem eigentlichen: tAcadDoc.ActiveLayout ist nicht vom Typ String, also kann auch kein String zugewiesen werden, Ersatz dafür (ohne Prüfung, ob das Layout überhaupt existiert): Code: tAcadDoc.ActiveLayout = tAcadDoc.Layouts("Layout1")
HTH, - alfred - ------------------ www.hollaus.at [Diese Nachricht wurde von a.n. am 12. Sep. 2010 editiert.] |
jupa Ehrenmitglied V.I.P. h.c. Ruheständler
Beiträge: 6050 Registriert: 16.09.2004 Windows 10 64bit, ACAD Rel. 14 - ACAD 2023
|
erstellt am: 12. Sep. 2010 11:00 <-- editieren / zitieren --> Unities abgeben:
Hi, zum Glück haben auch andere bei diesem schönen Wetter nichts besseres zu tun als am Rechner zu sitzen. Ist ja eine Super-Reaktionszeit ;-) Nun klappt's aber endlich (unb bei mir fallen auch langsam die Groschen). Nochmals danke. Schönes Wochenende jupa Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jupa Ehrenmitglied V.I.P. h.c. Ruheständler
Beiträge: 6050 Registriert: 16.09.2004 Windows 10 64bit, ACAD Rel. 14 - ACAD 2023
|
erstellt am: 16. Sep. 2010 08:31 <-- editieren / zitieren --> Unities abgeben:
Hi, nun muß ich noch mal nerven: Folgender Codeschnipsel: Dim tAcadApp As Object Dim tAcadDoc As Object Set tAcadApp = GetObject(, "AutoCAD.Application.17.2") If tAcadApp Is Nothing Then Set tAcadApp = CreateObject("AutoCAD.Application.17.2") End If If (Not (tAcadApp Is Nothing)) Then tAcadApp.Visible = True Set tAcadDoc = tAcadApp.Documents.Open("D:\NichtExistent.DWG") If tAcadDoc.Active = True Then ... Else MsgBox ("Datei nicht gefunden") End If Ich versuche, eine Datei zu öffnen, die es gar nicht gibt. Trotzdem läuft das Programm in den then-Zweig von "If tAcadDoc.Active = True". Falls es D:\NichtExistent.dwg gar nicht gibt hätte ich aber erwartet, daß t.AcadDoc.Active den Wert False hat. Wo ist denn nun schon wieder mein Denkfehler? Die AutoCAD-Hilfe gibt leider auch keine Auskunft darüber, was passiert, wenn man mit der Open-Methode ein Objekt (Zeichnung) öffnen will, das gar nicht vorhanden ist. jupa Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 16. Sep. 2010 08:39 <-- editieren / zitieren -->
Hi, ich vermute mal, dass Du On Error Resume Next in Deinem Code enthalten hast und dann läuft der Code halt weiter, wenn ein Fehler auftritt, in diesem Fall bist aber Du verantwortlich für die Behandlung von Fehlern (dem Programm hast Du die Behandlung ja entzogen )! Also z.B.:
Code: On Error Resume Next Err.Clear Set tAcadDoc = tAcadApp.Documents.Open("D:\NichtExistent.DWG") 'jetzt kannst Du auf zwei Arten prüfen 'if tAcadDoc is Nothing then 'dann wüsstest Du, dass da nix drin steht, oder if Err.Number <> 0 Then 'jetzt weisst Du, dass seit dem letzten Err.Clear ein Fehler aufgetreten ist
Kleiner ergänzender Hinweis dazu: Err.Clear musst Du nicht direkt nach On Error Resume Next setzen (denn On Error... setzt das Fehlerstatusflag implizit zurück), aber mitten im Code ist es immer dann sinnvoll, wenn die nächste Zeile 'Gefahrenpotential' in sich birgt. - alfred - ------------------ www.hollaus.at |
jupa Ehrenmitglied V.I.P. h.c. Ruheständler
Beiträge: 6050 Registriert: 16.09.2004 Windows 10 64bit, ACAD Rel. 14 - ACAD 2023
|
erstellt am: 16. Sep. 2010 10:19 <-- editieren / zitieren --> Unities abgeben:
|
Ex-Mitglied
|
erstellt am: 16. Sep. 2010 10:35 <-- editieren / zitieren -->
|