Autor
|
Thema: dxf-Export mittels SaveAs (1905 mal gelesen)
|
ckoring Mitglied Ingenieur
Beiträge: 227 Registriert: 09.06.2009 Fujitsu CELSIUS M740 Intel Xeon E5-1620v4 32 GB RAM Nvidia Quadro P4000 Windows 10 Pro SolidWorks 2017 SP4.1 DBWorks R16 SP1.7
|
erstellt am: 29. Mrz. 2012 10:00 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe mal wieder ein ein Problem mit DBWorks, wo ich nicht weiterkommen und hoffe das mir jemand einen Tipp geben kann. Zum Thema: Wir haben im Kontextmenü (\LST\AnyType, nur für Zeichnungen per .uivbs) ein Skript eingebunden welches Zeichnungen in dxf-Dateinen konvertiert. Das Ganze funktioniert wie gewünscht mit einer kleinen Einschränkung! Zum Export wird die SWX-Funktion SaveAs3(NewName,SaveAsVersion,Options) benutzt, diese verwendet die beim letzten Export genutzten dxf-Export-Optionen. D.h es kann nicht sichergestellt werden, dass die dxf-Dateien mit den richtigen Einstellungen erstellt wurden. Daher möchte ich das Skript um das Setzten der Optionen ergänzen. Leider unterstützt die veraltete Methode SaveAs3() dies nicht, es werde immer die letztmals verwendeten Optionen benutzt. Die aktuelle Methode zum Speichern ist SaveAsSaveAs(Name,Version,Options,ExportData,Errors,Warnings) diese nutzt einen anderen Unterbau (IModelDocExtension) und andere Parameter, ist daher nicht 1:1 kompatibel. Ich habe den Funktionsumfang erfolgreich in ein Solidworks-Makro implementiert:
Code: Sub main() ' nur im SWX-Makro Set DBWApp = Application.SldWorks exportedFileName = "C:\Users\ck\Documents\tmp\dxf\test.dxf" '<--- 28.03.2012 - Festlegen der Export-Optionen ergänzt Dim saveas_errors As Long Dim saveas_warnings As Long Set ActiveDoc = DBWApp.ActiveDoc Set swModel = DBWApp.ActiveDoc Set swModelDocExt = swModel.Extension saveas_errors = 0 saveas_warnings = 0 'swDxfMultiSheetOption[ 0=swDxfActiveSheetOnly 1=swDxfSeparateSheets 2=swDxfMultiSheet ] DBWApp.SetUserPreferenceIntegerValue swDxfMultiSheetOption, 2 'swDxfVersion[ 0=swDxfFormat_R12 1=swDxfFormat_R13 2=swDxfFormat_R14 3=swDxfFormat_R2000 4=swDxfFormat_R2004 5=swDxfFormat_R2007 6=swDxfFormat_R2010 ] DBWApp.SetUserPreferenceIntegerValue swDxfVersion, 3 MsgBox "swModelDocExt.SaveAs" & vbLf & vbTab & exportedFileName & vbLf & vbTab & "0=swSaveAsCurrentVersion" & vbLf & vbTab _ & "1=swSaveAsOptions_Silent" & vbLf & vbTab & "Nothing" & vbLf & vbTab & "saveas_errors=" & saveas_errors & vbLf & vbTab & "saveas_warnings=" & saveas_warnings swModelDocExt.SaveAs exportedFileName, 0, 1, Nothing, saveas_errors, saveas_warnings 'ok = swModelDocExt.SaveAs(exportedFileName, 0, 1, Nothing, errors, warnings) '--->End Sub
Das Einfügen in das DBWorks-Skript war aber nicht von Erfolg gekrönt! Ich bekomme eine Fehlermeldung wegen einer Typenunverträglichkeit in der Zeile mit dem SaveAs-Aufruf (siehe Screenshot). Ich vermute dass es am "Nothing" liegt, weis aber nicht wie ich das umgehen kann. Der Parameter ExportData ist vom Typ Object und außer beim PDF-Export mit "Nothing" zu verwenden (API sldworks.IModelDocExtension.SaveAs). Zweite Möglichkeit wären die Variablen saveas_errors und saveas_warnings. Hier macht die Deklaration im DBWorks-Skript Probleme. Bekomme die Fehlermeldung "Anweisungsende erwartet", siehe Screenshot. Darf ich hier bei der Deklaration keinen Datentypangeben? Hoffe mal das mir einer hier helfen kann! cheers ckoring [Diese Nachricht wurde von ckoring am 29. Mrz. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Michael Fröse Mitglied Anwendungsberater Mixed Realiy
Beiträge: 25 Registriert: 22.04.2010
|
erstellt am: 29. Mrz. 2012 14:26 <-- editieren / zitieren --> Unities abgeben: Nur für ckoring
Hallo, du kannst ein VisualBasicforApplications(VBA) Makro nicht einfach in ein DBWorks Skript kopieren, da die DBWorks Skripte VisualBasicSkripte(VBS) sind und VBS im Gegensatz zu VBA nur den Datentyp Variant kennt. Aus Dim saveas_errors As Long muss also Dim saveas_errors werden. In deinem Codeschnipsel fehlt auch eine Routine zum öffnen und ggfls. schließen der Zeichnung, so das du eine Fehlermeldung bekommen wirst wenn du das Skript bei geschlossener Zeichnung ausführst. Nicht zuletzt solltest du die Lösung mit dem Skript \LST\AnyType und *.uivbs überdenken, wies packt Ihr das Skript nicht in \LST\D wo Skripte die nur für Zeichnungen angezeigt werden sollen hingehören? Viele uivbs sind eine deutliche Performancebremse. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ckoring Mitglied Ingenieur
Beiträge: 227 Registriert: 09.06.2009 Fujitsu CELSIUS M740 Intel Xeon E5-1620v4 32 GB RAM Nvidia Quadro P4000 Windows 10 Pro SolidWorks 2017 SP4.1 DBWorks R16 SP1.7
|
erstellt am: 29. Mrz. 2012 15:13 <-- editieren / zitieren --> Unities abgeben:
Hi Michael, wo konkret die Unterschiede zwischen VBA und VBS sind war mir nicht bewußt. Wie vorgeschlagen habe ich das "As Long" entfernt. Leider war es das scheinbar noch nicht. Bekomme weiterhin die Fehlermeldung bzgl. Typenunverträglichkeit. Aber wie kann es eine Typenunverträglichkeit geben wenn eh alle Variablen vom Typ "Variant" sind?! Hab schon gedacht es liegt daran das die Parameter "Errors und "Warnings" byRef übergeben werden. Habe im Netz aber nix gefunden das VBS das nicht unterstützt. Code für das Öffnen und Schließen ist natürlich vorhanden und funktioniert wie gewünscht. Das ursprüngliche Skript kommt von unserem Reseller, daher die Sache mit AnyType/uivbs. Ich weiß nicht ob ich das hier so in Gänze einstellen darf, daher nur der Auschnitt:
Code: ... Call DBWSetOption ("OPEN_IN_VIEW_ONLY_IF_RELEASED", 0) DBWShell( "OpenDocument " & uniqueId ) DBWSetOption "OPEN_IN_VIEW_ONLY_IF_RELEASED", 1 if (okDBW = False) then DBWMSGBox " Fehler beim Öffnen der Datei: " & NR_FELD exit function End If '<--- 28.03.2012 - Festlegen der Export-Optionen ergänzt Dim saveas_errors Dim saveas_warnings Set ActiveDoc = DBWApp.ActiveDoc Set swModel = DBWApp.ActiveDoc Set swModelDocExt = swModel.Extension saveas_errors = 0 saveas_warnings = 0 'swDxfMultiSheetOption[ 0=swDxfActiveSheetOnly 1=swDxfSeparateSheets 2=swDxfMultiSheet ] DBWApp.SetUserPreferenceIntegerValue swDxfMultiSheetOption, 2 'swDxfVersion[ 0=swDxfFormat_R12 1=swDxfFormat_R13 2=swDxfFormat_R14 3=swDxfFormat_R2000 4=swDxfFormat_R2004 5=swDxfFormat_R2007 6=swDxfFormat_R2010 ] DBWApp.SetUserPreferenceIntegerValue swDxfVersion, 3 DBWMsgbox "swModelDocExt.SaveAs" & vbLf & vbTab & exportedFileName & vbLf & vbTab & "0=swSaveAsCurrentVersion" & vbLf & vbTab _ & "1=swSaveAsOptions_Silent" & vbLf & vbTab & "Nothing" & vbLf & vbTab & "saveas_errors=" & saveas_errors & vbLf & vbTab & "saveas_warnings=" & saveas_warnings swModelDocExt.SaveAs exportedFileName, 0, 1, Nothing, saveas_errors, saveas_warnings 'ok = swModelDocExt.SaveAs(exportedFileName, 0, 1, Nothing, errors, warnings) '---> set activeDoc = Nothing call DBWShell( "SWClose" ) ...
Werde wohl mal paralell unseren Reseller darauf ansetzten. Man nutzt die "Vorteile" eines Wartungsvertrages viel zu selten! cheers ckoring Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Michael Fröse Mitglied Anwendungsberater Mixed Realiy
Beiträge: 25 Registriert: 22.04.2010
|
erstellt am: 29. Mrz. 2012 15:38 <-- editieren / zitieren --> Unities abgeben: Nur für ckoring
Hallo ckoring, in dem Skriptausschnitt gibt es noch einige Fallstricke. Die Optionen werden immer fest gesetzt, aber hinterher nicht auf den Ursprungswert zurückgesetzt, so das die Option nachdem das Skript gelaufen ist immer an ist. Zitat: Call DBWSetOption ("OPEN_IN_VIEW_ONLY_IF_RELEASED", 0) DBWShell( "OpenDocument " & uniqueId ) DBWSetOption "OPEN_IN_VIEW_ONLY_IF_RELEASED", 1
In dem Schnippsel kann Ich auch nicht erkennen ob z.B. die Variable swDxfVersion irgendwo initialisiert wird, die steht sonst so nicht zur Verfügung. Zitat: DBWApp.SetUserPreferenceIntegerValue swDxfVersion, 3
Das hier scheint mir auch doppelt gemoppelt: Zitat: Set ActiveDoc = DBWApp.ActiveDoc Set swModel = DBWApp.ActiveDoc
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
BerndB Mitglied Ingenieur
Beiträge: 611 Registriert: 28.09.2001
|
erstellt am: 10. Apr. 2012 14:29 <-- editieren / zitieren --> Unities abgeben: Nur für ckoring
Hallo Makromanen, evtl. rufst du in dem Script ja das Makro auf, das bei SWX funktioniert? Alle Sachen die etwas umfangreicher sind, mache ich immer so. Kann dann viel besser das Makro testen als im Skript herumzueiern.. Anderer Weg Im Skript Datei öffnen SWX Makro zum Speichern nutzen Im Skript auf ergebnis der Speicherung warten ... Oder mal mit VIsial Studio einsteigen und dort "richtig Programmieren" Die exe oder dll läßt sich dann aus dem Skrit aufrufen Viele Wege hier in Kombination möglich Gruß Bernd ------------------ Complaining about the way wheels never worked properly however often you laid them flat and pushed them. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|