|
SolidWorks bietet mit dem API eine hervorragende Möglichkeit eigene Tools und Hilfsmittel zu programmieren. Wenn man zumindest über grundlegende Kenntnisse der Programmierung von VB verfügt ist es nur einen kleinen Schritt weiter zu den ersten eigenen Progrämmchen. Und ich hoffe mal: Hier werden Sie geholfen (Verona sei Dank für diesen Ausspruch :-)) |
Eigene Hilfsmittel für das eigene CAD-System zu schreiben gehörte in der Vergangenheit zur normalen Arbeit jedes Systemadministrators oder Powerusers eines Systems. Viele CAD-Systeme hatten ihre eigene Scriptsprache (z.B. das LISP von AutoCAD oder BACIS von MEDUSA), mit denen sich der geneigte Anwender oder Admin die vielen kleinen Gismos zum Leben erweckte, die das Arbeiten komfortabel machten.
Aber damit kam auch der Fluch bei der Umstellung: auf einmal waren die ganzen liebgeworden Tools weg. SolidWorks geht hier (IMHO glücklicherweise) einen anderen Weg: anstatt wieder eine proprietäre Sprache zu erfinden setzen die Jungs (und Mädels) einfach auf bekannte und in Windows bestens integrierte Art der Programmierung: OLE-Programmierung mittels der SolidWorks API.
Sagt mir am Anfang auch nichts, also nicht gleich aufgeben. Es bedeutet nichts anderes, als dass man praktisch mit den bekannten Programmiersprachen wie C, C++ oder auch Visual Basic Programme schreiben kann, die SolidWorks dazu bringen, das zu tun, was man möchte.
Ich beschränke mich hier ausschließlich auf Visual Basic, aus zwei
Gründen: erstens kenne ich mich damit zumindest ein bischen aus (im Gegensatz zu Delphi),
zum zweiten glaube ich das all die Masochisten und andere Profis, die mit C oder C++
programmieren keine Grundlagenhilfe dazu brauchen. Leider können nicht alle Funktionen der API über VB angesprochen werden (z.B. DLL und Menuintegration), aber um diese Art geht es ja bei der einfachen Toolprogrammierung auch nicht. Wir werden in diesem Kapitel des Tutorials als kleines Einstiegsbeispiel ein Minitool mit Visual Basic schreiben, mit dem wir die Dichte aus einer vorgegebenen Auswahl im Klartet auswählen und dann die entsprechende Dichte in die Materialeigenschaften in SolidWorks eingetragen wird. |
Tutorial Beispiel |
Eine API (Application Programming Interface, gelegentlich auch in der Bedeutung von Advanced Programming Interface) ist nichts anderes als ein Werkzeug, eine Sammlung von Routinen und Befehlen, mit denen man gaaaanz kleine Teilchen in SolidWorks ansprechen kann. IMHO ist das API von SolidWorks sehr mächtig, da selbst von VB aus praktisch alle Funktionen, Methoden und Eigenschaften angesprochen werden können.
Die wichtigste Hilfe bei der Programmierung ist sicherlich die API-Hilfe-Datei. Der Shortcut dazu wird bei der Soldiworksinstallation mit in der Programmgruppe von SolidWorks angelegt. Wenn Sie doch selbst suchen wollen schauen Sie mal nach der Datei [SWX-Installationsverzeichnis]\samples\appcomm\api_help.hlp
Update: seit SolidWorks 2003 ist die API Hilfedateien unter Installationsverzeichnis]/api/apihelp.chm zu finden
Auch die Beispiele, die bei der SolidWorksinstallation unter [SWX-Installationsverzeichnis]\samples\visualbasic mit eingespielt wurde sind gut dokumentiert und geben eine Menge Anregungen.
Direkt von der SolidWorkswebsite bekommen Sie unter http://www.solidworks.com/html/Products/Api/ die aktuellste Version der API-Hilfe sowie Neuigkeiten, eine API-FAQ, Trainingsmaterial und Tutorials. Aber halt alles in Englisch.
Genug der Theorie, ab in die Praxis. Wenn Sie sich an die ersten Programme wagen sollten Sie unbedingt an Zweierlei denken: a) versuchen Sie ein möglichst überschaubares Tool zu entwickeln, was Ihnen auch wirklich weiterhelfen kann und b) machen Sie (zumindest bei den ersten Versuchen) nur etwas, was Ihnen auch wirklich selbst am Herzen liegt und setzen Sie sich dabei nicht unter Zeitdruck. Sie werden an einigen Stellen deutlich festhängen und da müssen Sie sich selbst motivieren können weiterzumachen. Aber wem sag ich das ...
Nun gut: in diesem Beispiel hier möchte ich gerne etwas anpacken, was mir schon häufig ein Dorn im Auge war und das eine einfache und überschaubere Funktion darstellt: Auswahl einer Materials für ein Modell im Klartext und Eintragen der dazu gehörenden Dichte in die Materialeigenschaften des Modells. Wenn ich schonmal selbst was konstruiere, ist es halt meistens nicht aus Wasser B-)
Ich hoffe, Sie verstehen, was ich meine. Da es für die Programmierung
generell wichtig ist, dass man vorher weiß, was man anschließend
programmieren will (Stichwort: Lastenheft oder Pflichtenkatalog), vielleicht nochmal etwas
detaillierter. Es scheint mir eine gute Technik, auch für noch so kleine Projekte sich
selbst eben ein kleines Pflichtenheft in Form von Stichworten aufzuschreiben, dann hat man
eine Richtung und verzettelt sich nicht in die 80/20-Problematik. BOT. SolidWorks bietet unter Extras/Optionen/Materialeigenschaften ... die Möglichkeit die Dichte des benutzten Materials einzugeben. Dies ist wichtig, damit z.B. die Masseneigenschaften wie das Gewicht richtig berechnet werden. Dummerweise muss man den Wert von Hand eintragen und kann ihn nicht einfach aus einer Liste auswählen. Außerdem muss man den Wert auch noch in den SI-Einheiten Kilogramm / Kubikmeter (entspricht dem in SWX angezeigten Gramm / Kubikmillimeter) eingeben, wodurch man schnell mal mit dem Komma daneben rutscht. Also soll unser erstes Progrämmchen folgendes leisten:
|
SolidWorks-Funktionalität
so soll es anschließend aussehen |
Soweit, so gut. Sie werden sehen, dass wir mit diesem Pflichtenheft noch eine ganze Menge Unsicherheiten und "freies Feld" haben, aber das soll fürs erste genügen.
Ich setze mal voraus, dass Sie zumindest soweit mit Visual Basic vertraut sind, dass Sie die Oberfläche ohne Schwierigkeiten selbst generieren können. Die Anordnung der einzelnen Elemente in der Form sehen Sie ja im Bild, damit hinterher alles übereinstimmt ein kleine Tabelle mit den notwendigen Elementen und Namen:
Objekt | Name des Objektes | Eigenschaft | Wert der Eigenschaft |
---|---|---|---|
ComboBox | cmbAuswahl | Style | 2 |
CommandButton | cmdGetDensity | Caption | "&Dichte vom Modell auslesen" |
CommandButton | cmdSetDensity | Caption | "Dichte nach &SWX übertragen" |
CommandButton | cmdExit | Caption | "&Ende" |
Label | lblDensity | Caption | "0,001" |
Label | lblAuswahl | Caption | "Bitte auswählen" |
Label | lblDichte | Caption | "Dichte [kg/m³] =" |
Alles VB-Standards. Die ComboBox mit Style 2, damit der Benutzer hinterher nur Werte auswählen kann, die er auch in der Liste findet. Im Label lblDensity einfach mal den Dummywert 0,001 eintragen. Bei den CommandButtons kennen Sie ja den Trick mit dem "&" Zeichen: diese Taste zusammen mit der ALT-Taste gedrückt funktioniert praktisch als Shortcut für diesen Knopf. Verschönern Sie alles, wie Sie gerne möchten, tragen ein paar ToolTipTexte ein usw.
Sie können es sich natürlich auch einfach machen und das komplette Beispiel mit Sourcecode herunterladen (4 KB). Aber Achtung: ich benutze VB6 und weiss nicht, ob sich das auch in "älteren" Versionen aufrufen läßt.
So, jetzt bereiten wir erstmal einige Strukturen und Programmcodeteile vor, die vollkommen unabhängig von den eigentlichen SolidWorksfunktionen sind. In das Click-Ereignis von cmdExit schreiben Sie einfach den Befehl "end", das Programm soll ja auch mal wieder gestoppt werden können.
Jetzt wird es für Anfänger schon etwas tricky: in die ComboBox (diese Auswahlliste, die beim Anklicken des nach unten gerichteten Pfeils ausklappt) sollen ein paar Werte eingetragen werden und im lblDensity der passende Wert dazu angezeigt werden. Ich mach es etwas mit der Holzhammermethode, es gibt bestimmt schönere Wege dafür, aber dieser hier hat den Vorteil, das er funktioniert und einfach zu durchblicken ist:
Zwei Feldvariablen für die Namen und den Wert dieses "Materials" anlegen. Dies geschieht am einfachsten im Deklarationsbereich der Form. Wir brauchen dabei für die Namen ein Stringfeld und für die Werte ein Feld aus Double, weil die Dichte ja in SI-EInheiten angegeben wird (und auch von SolidWorks so verlangt wird) und wir dadurch Kommawerte haben.
Machen Sie sich jetzt noch keine Gedanken um die komischen Deklarartionen, die danach kommen, das wird weiter unten erklärt.
In der Laderoutine der Form (also das Ereignis Form_Load) werden wir jetzt erstmal die Werte für diese Variablen definieren, die wir haben wollen. Im Beispiel werden einfach 3 verschiedene Werte eingetragen. Denken Sie daran, dass in VB Kommawerte nicht mit "," sondern mit "." eingegeben werden.
Anschließend auch in der Form_Load-Prozedur die Namen dieser Materialien in die Combobox eintragen lassen. Vorher sicherheitshalber die Liste komplett löschen. Dann die gewünschte Standardvorgabe der ComboBox aktivieren. Das sieht dann vom Quelltext her erstmal so aus:
Puh, bald haben wir es geschafft. Was jetzt noch passieren sollte ist eine Kleinigkeit. Das Label lbldensity soll den Wert des ausgewählten Eintrages anzeigen, wenn wir einen auswählen. Dies erledigen wir am einfachsten im Click-Ereignis der Auswahlbox:
Für alle, die wie ich am Anfang immer auf diesen Fehler gelaufen sind: wenn Sie in der Entwicklungsumgebung von VB einen Doppelclick auf die ComboBox machen, um das Defaultereignis auszuwählen, landen Sie im Change-Ereignis. Wir brauchen aber das Click-Ereignis. Das wird ausgelöst, wenn der Benutzer (oder über Programm) ein anderer Eintrag aus der Liste ausgewählt wird. Dann suchen wir einfach die Nummer (heißt in den Eigenschaften den ListIndex) der ComboBox raus, holen den passenden Wert aus der Werte-Feldvariablen und schreiben das in den Textinhalt (Caption) von lblDensity.
Eh voilà. Jetzt können Sie das ganze schonmal laufen lassen. Klar, funktioniert noch überhaupt nicht mit SolidWorks zusammen, aber die Form müßte aufgehen und in der ComboBox sollte der Eintrag "Stahl" zu sehen sein sowie der Dichtewert 7850 im Label. Wenn Sie in der Combobox einen anderen Wert wählen, wird der entsprechende Wert im Label angezeigt. Wenn das alles nicht funktioniert ... kontrollieren Sie nochmal Ihr Programm.
Wie oben erwähnt läuft alles zwischen unserem Programm und SolidWorks objektorientiert. Sie müssen sich mit dem Objektmodell von SolidWorks vertraut machen, wenn Sie irgendetwas in SolidWorks von aussen steuern wollen. Um Ihnen den Einstieg etwas zu erleichtern, kommt diesmal erst der Quellcode und danach die Erklärungen dazu: am Beispiel des Auslesens der Dichte des aktuellen Modells werden die grundlegenden Operationen zur Programmierung von SolidWorks mit Visual Basic gezeigt:
Ich hoffe, die Kommentare in dem Beispiel helfen schonmal etwas weiter. Wie gesagt, alles läuft über die Objekte, und das wichtigste dieser Objekte ist das SolidWorks-Programm selbst. Immer, wenn Sie ein Objekt ansprechen wollen, müssen Sie zuvor eine entsprechende Variable deklarieren. Sie können diese Objektvariablen benennen wie Sie gerne möchten. Ich empfehle Ihnen aber dringend in allen Applikationen denselben Stil einzuhalten und wenn es Ihrem Geschmack nicht allzu sehr widerspricht die Standardbezeichnungen von SolidWorks zu benutzen. Ach ja, ich habe selbst in diesem Beispiel direkt gegen meine eigene Empfehlung verstossen, die "normale" Bezeichnung des SolidWorks-Objektes ist SldWorks und nicht SwApp, aber ich hatte schon alles fertig ...
So weit, so gut. Den Handler auf SolidWorks erledigen wir noch mit einer VB-Funktion: CreateObjekt. Mit dieser Methode wird ein Bezug zu einem laufenden SolidWorks hergestellt oder ein SolidWorks geladen. Natürlich nur, wenn SolidWorks auch korrekt installiert ist, aber sonst macht ja das Ganze keinen Sinn :-))
Wenn Sie aber nur an ein laufendes SWX anklinken wollen, benutzen Sie statt CreateObject einfach GetObject. Aber sorgen Sie dann auch für die Fehlerbehandlung; wir werden das in einem anderen Beispiel noch machen.
Fein, jetzt haben wir endlich unseren Bezug zu SolidWorks. Ein Tip von mir sehen Sie direkt in den nächsten Zeilen: machen Sie das SolidWorks sicherheitshalber bei Programmen, bei denen der Benutzer sowohl mit ihrem Programm als auch SolidWorks interagieren soll, sichtbar. Sollte nämlich das SolidWorks erst von Ihrem Programm geladen worden sein ist es erstmal nicht sichtbar!! Und Sie haben selbst sicher schonmal die Probleme erlebt, wenn mehrere SolidWorks auf einer Maschine laufen und man die nicht sieht ...
Was nun? Wir wollen ja die Dichte für das aktuelle Modell auslesen und später auch setzen. Also müssen wir erstmal das aktuelle Modell finden. Dazu benutzen wir die Funktion SldWorks.ActiveDoc. Schauen Sie mal einfach in die API-Hilfe unter dem Stichwort ActiveDoc. Wie man die passenden Funktionen herausfindet versuche ich weiter unten zu erklären.
Jetzt sollten wir zumindestens zwei Sachen abfangen, mit denen das Programm ansonsten nicht umgehen kann: in SolidWorks muß ein Part aktiv sein. Ich habe mir angewöhnt, sowas in zwei Schritten zu untersuchen: erstaml schauen, ob überhaupt irgendein Dokument geöffnet ist (ansonsten ist der Objekthandler für das aktive Dokument Nothing) und danach, ob das aktive Dokument in diesem Fall auch ein Part ist.
Hier hilft die Methode ModelDoc.GetType Diese gibt den Typ des angesprochenen Objektes als Zahl zurück. Es ist gute Praxis, nie direkt hart mit den Werten zu vergleichen (also immer swDocPART statt 1 benutzen). Denn wenn SolidWorks irgendwann mal auf die Idee kommen sollte, diese Werte zu ändern ... ausserdem weiß man auch im Quelltext direkt, was gemeint ist.
Diese ganzen Konstanten und Werte brauchen Sie glücklicherweise nicht selbst zu erfinden oder aus der API-Hilfe abzutippen. SolidWorks liefert ein Modul namens swconst.bas mit, das Sie einfach als Modul in Ihrem Projekt einbinden können, und schon haben Sie alle Werte und Konstanten parat. Sie finden dieses Modul im Verzeichnis [SWX-Installationsverzeichnis]\samples\appcomm. Ich habe für dieses Beispiel der Einfachheit halber die Werte direkt im allgemeinen Deklarationsbereich eingefügt, benutze aber ansonsten immer die swconst.bas als eingebundenes Modul.
Jetzt können wir uns sicher sein, das SolidWorks läuft und das aktive Dokument auch ein Part ist. Jetzt müssen wir nur noch herausfinden, wie wir die Dichte auslesen können.
Ins Eingemachte: wir müssen uns die benötigten Funktionen heraussuchen. Wenn Sie nicht gerade wie hier schon irgendjemand diese Arbeit für Sie erledigt hat, müssen Sie einen tiefen Blick in die API-Hilfe werfen. Das Problem: Sie müssen zumindest eine wage Vorstellung davon haben, was Sie suchen.
In unserem Fall wollen wir ja die Dichte setzen bzw. lesen. Also gehen
wir in alter Trappermanier einfach mal in den Index des Hilfefiles und suchen nach
"Dichte". Hey, aber in Englisch, also "Density" das Ergebnis sieht
zunächst mal so aus: Dies ist eine der wirklich tollen neuen Funktionen der aktuellen variante des Hilfefiles. Sie bekommen schon beim Klick auf die gefundene Stelle eine Übersicht bzw. Auswahl, wo das alles vorkommt. Da wir ja im Prinzip noch nicht wissen, wo wir hin wollen, nehmen wir erstmal direkt den ersten Eintrag. |
|
Hier steht ziemlich viel Zeug über die Masseneigenschaften, Schwerpunkt
und Volumen des Body (was immer das auch sein mag), aber erstmal nix von der
Dichte. In einem zunächst unscheinbaren Nebensatz kommt aber der entscheidene Hinweis: |
|
Aaaa-Ha!! Die aktuell benutzte Dichte kann durch GetUserPreferenceDoubleValue
herausgefunden werden. Also flugs in das Suchfeld eingetragen und mal geguckt, was er dazu
sagt: Ups, zweimal vorhanden. Aber ist ja eingentlich auch logisch, in SolidWorks kann man die Dichte ja auch sowohl für das Modell als auch global für SolidWorks setzen. Also weitergeklickt auf die Beschreibung. |
|
Hier sehen wir dann endlich was, wir brauchen. Das einzige was noch fehlt
ist der Wert für die UserPreference, die wir haben wollen. Ein Klick weiter gibt uns die API-Hilfe auch dieses Preis: swMaterialPropertyDensity Hurra, wir haben es. Wie im Quellcode oben zu sehen benutzen wir also die Funktion, die wir gefunden haben mit dem passenden Parameter und tragen dann den ausgelesenen Wert in das Label ein. Spätestens hier merken Sie dann auch, das SolidWorks intern mit den SI-Einheiten agiert; für die Dichte bedeutet das also die Einheit kg/m³, was zunächst zu recht seltsamen Werten führt. Aber wenn Sie das umrechnen auch die gebräuchlichen g/cm³ ... |
Sie haben es sicher während des letzten Kapitels schon selbst geahnt: um die Dichte zu setzen benutzt ma nicht die Funktion Get... sondern die SetUserPreferenceDoubleValue. Sie sollten die richtigen Funktionen, die nötige Syntax und auch die entsprechenden Werte jetzt selbst aus der Hilfe heraussuchen können. Wenn Sie gar nicht zurecht kommen schauen Sie doch mal auf den Quelltext der Routine, um die Dichte auch noch zu setzen:
Alles klar?? Ich hoffe schon. der Anfang wie gehabt, an SolidWorks anklinken, überprüfen ob SWX läuft und ein Modell aktiv ist und dann den Wert, der zu dem ausgewählten Eintrag der ComboBox passt in die Dichte-Eigenschaft des aktuellen Modells eintragen. Wie sich das für ein halbwegs gutes Programm gehört wird der Anwender anschließend noch über Erfolg oder Missglücken der Aktion informiert und das war es dann.
Wow, das erste fertige Progrämmchen. Aber ruhen Sie sich jetzt nicht aus sondern versuchen Sie direkt selbst weiter zu basteln. Der nächste Schritt ist die Nachbildung der SolidWorks-Funktion: dort kann der Benutzer den Dichtewert sowohl für das aktive Modell als auch für den Systemstandard abfragen und separat oder gemeinsam setzen.
Versuchen Sie bitte Ihr Beispiel dahingehend zu erweitern, sonst bin ich ja hier der einzige der was tun muss :-))) Spaß beseite, wenn Sie sich bis hierher durchgebissen haben haben Sie offensichtlich wirkliches Interesse an der Sache und ich kann aus Erfahrung nur sagen: probieren Sie es selbst. Wenn Sie aber (wie ich auch) aus den Beispielen anderer gut lernen können laden Sie den Quellcode des erweiterten Beispiels (5 KByte) herunter und analysieren Sie, wie ich es umgesetzt habe.
Und Sie können dann noch versuchen, ein paar Erweiterungen und Verbesserungen einzubauen:
Wir haben gelernt, das man SolidWorks über das Ansprechen der Objekte und deren Eigenschaften und Methoden von "aussen" programmieren kann. Wir wissen, wo wir Informationen zur Programmierung und insbesondere der API von SolidWorks bekommen und uns auf dem aktuellen Stand halten können.
Anhand eines einfachen Beispiels haben wir mit Visual Basic die Dichtewerte des aktiven Modells ausgelesen und konnten dem Modell durch einfaches Auswählen eines Material in einer Dropdown-Liste den passenden Dichtewert zuordnen. Dabei haben wir in einfachen Schritten die Funktionsweise der API-Hilfe kennengelernt und sind in der Lage, durch Eingeben von einfachen Schlüsselwörtern in der Hilfe benötigte Funktionen zu finden.
Ich denke, für die ersten Schritte in diese Welt war das schon eine ganze Menge. Ich würde mich freuen von Ihnen ein Feedback (einfach eine EMail an Stefan.Berlitz@gmx.de ) zu bekommen, wie Sie dieses Tutorial benutzen, ob Sie mit meinem Stil zurecht kommen und ob Sie gerne weitere Tutorials in dieser Art sehen möchten. Ich freue mich gerne über Ihre Kommentare und konstruktive Kritik.
Keep on hacking!!
Kritik und Anregungen bitte an Stefan Berlitz. Letzte Änderung dieser Seite am Donnerstag, 01. Februar 2007 17:40 |