Die Informationen stammen aus einer kleinen Doku, die mir durch den API-Support von SolidWorks von Lightworks zur Verfügung gestellt wurden (natürlich in Englisch). Deswegen hier der Versuch einer Übersetzung. Bevor Sie fragen: ja, erst ab Photoworks 99. BTW, die offizielle FAQ von SolidWorks http://www.solidworks.com/swdocs/support/api/faq/detail.cfm?id=4014 stellt immer noch fest, dass eigentlich gar keine Möglichkeit besteht Photoworks per API anzusprechen. Nun, bald wissen auch Sie es besser :-)) |
Das folgende Dokument beschreibt die zur Verfügung stehenden Methoden um Photoworks 99 Funktionen auch von außerhalb der lworks.dll anzusprechen. Es ist möglich, alle extern definierten Funktionen aus der lworks.dll anzusprechen, jedoch sind einige dieser Funktionen nur dazu gedacht direkt durch das Benutzerinterface von SolidWorks ausgeführt zu werden und sollten deswegen nicht benutzt werden.
Die einzige externe Funktion die benutzt werden sollte ist folgende:
long DllExport CallBackHandler ( BSTR callbackAndArguments );
Anmerkung: dies ist die Deklaration in C++ in lworks.dll. Wie Sie diese Funktion aus
SolidWorks-Basic oder von Visual Basic heraus ansprechen sehen Sie am besten am Beispiel
unten. Der zu übergebende Parameter callbackAndArguments
legt die auszuführende Funktion und deren Parameter fest. (Ich weiß, durch die Brust ins
Auge, funktioniert aber.)
Die auszuführenden Funktionen, die von Photoworks mit dieser Übergabe erkannt werden sind:
Diese Funktion führt eine Render-Operation mit den aktuellen Optionseinstellungen für Photoworks durch. Wenn zum Beispiel im Optionsdialog von Photoworks im Register Bildausgabe "Render in Datei" angeklickt ist wird diese Funktion in eine Datei rendern.
Diese Funktion dient dazu verschiedene Photworks Optionen zu setzen
Die Render Optionen können durch die folgenden Parameter gesetzt werden. Die Werte für die Parameter entnehmen Sie bitte der Tabelle weiter unten:
pwRenderRayTracing <ray tracing value>
pwRenderShadingMaterials <switch value>
pwRenderShadingAntiAliasing <switch value>
pwRenderShadingOverlayImage <switch value>
pwRenderDisplayProgressDialog <switch value>
pwRenderDisplayTexturesInIRViewChanges <switch value>
Die Ausgabeotionen könne durch die folgenden Parameter gesetzt werden. Die Werte für die Parameter entnehmen Sie bitte der Tabelle weiter unten:
pwImageOutputTarget <target value>
pwImageOutputFilename <string value>
pwImageOutputImageSizeWidth <integer value>
pwImageOutputImageSizeHeight <integer value>
Als Werte für die verschiedenen Parameter benutzen Sie bitte die folgenden Definitionen. Die Werte sind entsprechend der Optionen, die Sie auch in den Phtoworks Optionsdialogen angeben können.
ray tracing value: [ pwRayTracingNone | pwRayTracingAdaptive | pwRayTracingFull ]
switch value: [ pwSwitchOff | pwSwitchOn ]
target value: [ pwTargetRenderToWindow | pwTargetRenderToFile ]
Die Funktionen hat auch einen Rückgabewerte. Der Rückgabewert (vom type long) gibt den Status des CallBack handlers wieder:
pwCBStatusOK = 0
pwCBStatusUnknown = 1
pwCBStatusNoCallBack = 2
pwCBStatusInvalidCallBack = 3
pwCBStatusInvalidArguments = 4
pwCBStatusCallBackFailed = 5
pwCBStatusCallBackStopped = 6
Okay, alles graue Theorie, also kommt jetzt ein Beispiel für SolidWorks Basic bzw. Visual Basic:
' Zunächst die nebötigten Objekte dimensionieren
Dim swApp As Object
Dim pwCommand As String
Dim pwStatus As Long
Sub main()
Set swApp = CreateObject ("SldWorks.Application")
' Erstmal zum testen das Modell im Fenster rendern
pwCommand = "Render"
pwStatus = swApp.Callback( "lworks@CallBackHandler", -1, pwCommand
)
' Die Option auf "apadpives Rendering" setzen
pwCommand = "SetOption pwRenderRayTracing pwRayTracingAdaptive"
pwStatus = swApp.Callback( "lworks@CallBackHandler", -1, pwCommand
)
' Ziel des Rendering auf Datei setzen
pwCommand = "SetOption pwImageOutputTarget pwTargetRenderToFile"
pwStatus = swApp.Callback( "lworks@CallBackHandler", -1, pwCommand
)
' Namen der Bilddatei setzen
' (die Extension gibt dabei das Output-Format an)
pwCommand = "SetOption pwImageOutputFilename C:\pw_image.bmp"
pwStatus = swApp.Callback( "lworks@CallBackHandler", -1, pwCommand
)
'Die Bildbreite auf z.B. 640 einstellen ...
pwCommand = "SetOption pwImageOutputImageSizeWidth 640"
pwStatus = swApp.Callback( "lworks@CallBackHandler", -1, pwCommand
)
' ... dann die Bildhöhe auf 480 einstellen ...
pwCommand = "SetOption pwImageOutputImageSizeHeight 480"
pwStatus = swApp.Callback( "lworks@CallBackHandler", -1, pwCommand
)
' ... und in die angegebene Datei rendern
pwCommand = "Render"
pwStatus = swApp.Callback( "lworks@CallBackHandler", -1, pwCommand
)
' Ziel für Rendering wieder auf Fenster
pwCommand = "SetOption pwImageOutputTarget pwTargetRenderToWindow"
pwStatus = swApp.Callback( "lworks@CallBackHandler", -1, pwCommand
)
End Sub
Zum Schluss noch ein paar Anmerkungen: ich habe es bisher noch nicht mit SolidWorks bzw. Photoworksmitteln geschafft die für eine Automatisierung lästigen Rückfragen und Infoboxen zu unterdrücken. Also gerade beim Rendern in eine Datei kommen immer noch die Infobox, ob man denn jetzt wirklich mit diesen Einstellungen rendern möchte und man braucht halt jemanden, der auf den Knopf "Okay" klickt.
Aber dafür gibt es ja im Zweifelsfalle Tools wie z.B. BuzOf von Basta Computing ... oder man schlägt sich in VB halt mit den API-Calls herum um das Fenster zu finden und den Knopf zu drücken.
Keep on hacking!!
Kritik und Anregungen bitte an Stefan Berlitz. Letzte Änderung dieser Seite am Donnerstag, 01. Februar 2007 17:40 |