| |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS |
Autor
|
Thema: API: Grundsätzliches (1494 mal gelesen)
|
ronny82 Mitglied Konstrukteur

 Beiträge: 24 Registriert: 16.01.2008 SWX 2014
|
erstellt am: 28. Jan. 2008 14:16 <-- editieren / zitieren --> Unities abgeben:         
Hallo, diese objektorienterte Programmierweise ist für mich allein mit der Hilfe nicht durchschaubar. Ich bekomme schon das initialisieren nicht hin. Bsp.: Ich möchte das GetType aus dem ModelDoc2 nutzen als Makro ---------------------- Dim swApp As Object Dim swModel As Object Dim swType As Object Dim retval As Long Sub main()
Set swApp = Application.SldWorks 'SolidWorks verwenden Set swModel = swApp.ActiveDoc 'ActivesModell verwenden Set swMdoc2 = swModel.ModelDoc2 'ModelDoc2 Objekt verwenden; Ist hier der Fehler? retval = swMdoc2.GetType() 'Methode GetType aus oben definierten Objekt verwenden 'und in retval ablegen MsgBox (retval) 'Rückgabewert aus Gettype ausgeben
End Sub Was mache ich verkehrt? Was habe ich noch nicht verstanden? In einigen Beispielen fand ich beim Deklarieren der Variablen teilweise folgende Ausdrücke Bsp.: ''dim swapp as sldworks.sldworks'' Sind beide Wege möglich und ich spare mir so einfach nur das setzen der Objekte? Ronny Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Baumjäger Mitglied CAD/PDM Administrator
 
 Beiträge: 339 Registriert: 21.06.2006 SW2017 - S5.0 AutoCAD Mechanical 2018 Win10 Intel Xeon E3-1240 V2 3,4GHz 16GB RAM NVIDIA Quadro 4000
|
erstellt am: 28. Jan. 2008 15:34 <-- editieren / zitieren --> Unities abgeben:          Nur für ronny82
Bin auch kein Profi Programmierer, daher von mir nur zwei Anfänger Tips die mir sehr geholfen haben. 1. Du kannst auch Makros aufnehmen und diese dann anschauen, das hilft oft weiter. 2. Grundsätzliche VisualBasic kenntnisse sind sehr sehr sinnvoll. Es gibt zB vb2005 Express für umsonst,und nen Haufen Hilfe im internet oder als Buchform wie VB grundsätzlich funktioniert. Habe leider kein Zeit mir dein Problem anzuschauen, mit meinen Kenntnissen dauert das leider betimmt wieder zu lange. Aber vllt. helfen dir ja mein Vorschläge weiter. viele Grüße Andy
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...

 Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 28. Jan. 2008 15:50 <-- editieren / zitieren --> Unities abgeben:          Nur für ronny82
Warum 2x das Model-Object bestimmen? Code:
Sub main()Set swApp = Application.SldWorks 'SolidWorks verwenden Set swModel = swApp.ActiveDoc 'ActivesModell verwenden ' Set swMdoc2 = swModel.ModelDoc2 'ist überflüssig, das ModelObject hast du schon in swModel retval = swModel.GetType() 'Methode GetType aus oben definierten Objekt verwenden 'und in retval ablegen MsgBox (retval) 'Rückgabewert aus Gettype ausgeben
End Sub
------------------ Klaus www.al-ko.com | mein Gästebuch | privat... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Piet Mitglied Konstruktionsleiter & Konstrukteur
  
 Beiträge: 661 Registriert: 20.11.2001 SWx 2021
|
erstellt am: 28. Jan. 2008 17:36 <-- editieren / zitieren --> Unities abgeben:          Nur für ronny82
Wenn du das Late Binding benutzt (siehe Forumssuche), musst du deinem Programm beibringen, welche Werte .getType annehmen kann. Füg mal in die Variablendeklarationen dies ein: Const swDocPART = 1 Const swDocASSEMBLY = 2 Const swDocDRAWING = 3 Gruß, Piet Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ronny82 Mitglied Konstrukteur

 Beiträge: 24 Registriert: 16.01.2008 SWX 2014
|
erstellt am: 29. Jan. 2008 09:11 <-- editieren / zitieren --> Unities abgeben:         
|
jens_oliver Mitglied Softwareentwickler
 
 Beiträge: 114 Registriert: 28.06.2005
|
erstellt am: 29. Jan. 2008 09:32 <-- editieren / zitieren --> Unities abgeben:          Nur für ronny82
hi, ja aber die Methode gehört zum Objekt und ist keine Funktion. Wenn du "Early Binding" (dim swapp as sldworks.sldworks) benutzt weiß das Programm es schon während des kompilierens. Es gibt dir auch eine Fehlermeldung aus, wenn die Methode nicht existiert. Wenn du einen Punkt nach dem Objekt eintippst schlägt dir der Editor auch alle möglichen Methoden und Member vor. Beim "Late Binding" wird das Objekt erst zur Laufzeit definiert/erzeugt. Somit wird beim kompilieren nicht überprüft ob die Methode für das Objekt existiert (wie auch). Ich arbeite auch immer mit der Option "Option explicit" (einfach in die erste Zeile schreiben). Damit zwingst du dich selber alle Variablen zu definieren/deklarieren. Gruß Oliver ------------------ Software nach Maß für Ihr CAD-System www.ib-knepper.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ronny82 Mitglied Konstrukteur

 Beiträge: 24 Registriert: 16.01.2008 SWX 2014
|
erstellt am: 29. Jan. 2008 12:24 <-- editieren / zitieren --> Unities abgeben:         
Hallo, ok, ich nehme mal an, wenn ich bei "late binding" die Konstanten nicht definiere, nimmt er die aus der Lib, auf welche die aktuelle SWX  Session verweisst? Ist ja kein selbstständiges Programm. Nochmal zu meinem Bsp. Irgendwie habe ich das Gefühl, ich bin nahe dran am Verständniss, aber es ich brauche noch einen Schupps. Dim swApp As Object Dim swModel As Object Dim swDim As Object Dim retval As Long Sub main() Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc retval = swModel.GetType() MsgBox (retval) Soweit ok, auch wenn mir das mit den Methoden noch etwas unklar ist. Nun noch ein anderes GetType im Makro aus ModelDoc2.Dimension wie muß ich das definieren, das ich da rankomme? Irgendwie komme ich auch mit der VB Hilfe und VB Forum nicht dahinter. Set swDim = ????? 'schon viel probiert und ständig 'andere Fehler retval = swDim.GetType() MsgBox (retval) End Sub Gruß Ronny
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jens_oliver Mitglied Softwareentwickler
 
 Beiträge: 114 Registriert: 28.06.2005
|
erstellt am: 29. Jan. 2008 13:11 <-- editieren / zitieren --> Unities abgeben:          Nur für ronny82
|
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...

 Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 29. Jan. 2008 13:43 <-- editieren / zitieren --> Unities abgeben:          Nur für ronny82
|
ronny82 Mitglied Konstrukteur

 Beiträge: 24 Registriert: 16.01.2008 SWX 2014
|
erstellt am: 30. Jan. 2008 14:56 <-- editieren / zitieren --> Unities abgeben:         
Hallo, mir geht es hier einfach nur um das Grundverständnis für das Arbeiten mit Objekten und Methoden bzw. wie ich auf diese zugreifen kann. Mein wissen von Assembler und Pascal hilft mir hier nicht wirklich weiter und ich scheine zu blöd zu sein, die Hilfe bzw. anderes Tutorial richtig zu interpretieren. Deshalb hier das einfache Bsp. etwas weiter oben. Leider helfen mir Meldungen wie "Objekt nicht definiert" etc. nicht weiter. Mir fehlt sozusagen die Grammatik für VBA Gruß Ronny Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...

 Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 30. Jan. 2008 15:04 <-- editieren / zitieren --> Unities abgeben:          Nur für ronny82
|
Lutz Federbusch Ehrenmitglied V.I.P. h.c. Dipl.-Ing. Maschinenbau

 Beiträge: 3094 Registriert: 03.12.2001 alle SW seit 97+ AutoCAD2016-2022 ERP ProAlpha + CA-Link Intel Core i7-7820K 32GB Win10x64 Quadro K5000 SpacePilot
|
erstellt am: 30. Jan. 2008 15:55 <-- editieren / zitieren --> Unities abgeben:          Nur für ronny82
"Objekt nicht definiert" ist doch schon mal eine Ansage und verweist auf einen konkreten Fehler: Prüfe jetzt die Zeile, in der das Auftritt (debuggen) ganz penibel, ob Du jede Variable und jedes Objekt deklariert hast und ob Du es auch mittels SET-Befehl schon gefüllt hast. Du scheinst an die Bemaßungen heranzuwollen. Da mußt Du Dich durch die Objekthierarchie bewegen und Dir jeweils den nächsten Ansprechpartner - ein Objekt holen. Wenn Du Dich in SW gut auskennst, verstehst Du auch die Objekte besser. In der API-Hilfe werden für jedes Objekt die Eigenschaften und Methoden, die Du an ihnen anwenden kannst, beschrieben. Und die Objekthierarchie kannst Du auch grafisch sehen. Das nächste Übergeordnete ist normalerweise das, das Dir das Untergeordnete mit einer seiner Methoden geben kann. Du mußt Dich nur durchhangeln. Es klingt erstmal verwirrend, daß die alle gleich heißen - aber genau das ist gut so. So weißt Du gleich beim nächsten auch wieder, wie Du an den Typ kommst. Bemaßungen sind noch dazu unterschiedlich in Teil/BG und Zeichnung. Zuerst brauchst Du die SolidWorksSitzung, dann das aktive Dokument und das untersuchst Du nach Typ und verzweigst für jede Dokumentart. So kommst Du dann an jedes Maß und deren Typ: Ist Deine Abfrage fertig, mußt Du hier im Beispiel jeweils das nächste Maß, Feature, DisplayDimension, Ansicht, Teil, Blatt usw. (i.d.R. die Methode GetNext) holen... Guck Dir für den Anfang am besten die API-Beispiele alle an und versuche zu verstehen, was da in welchen Schritten passiert. DerMakroRekorder taugt leider nicht allzuviel, besser ist da schon die Journaldatei als Tipgeber. Viel Erfolg! Teil: Set Feature = Teil.FirstFeature While Not Feature Is Nothing Set theDispDimen = Feature.GetFirstDisplayDimension While (Not theDispDimen Is Nothing) Set thedimen = theDispDimen.GetDimension If thedimen.GetToleranceType= ... In der Baugruppe machst Du eine Traverse über alle Teile (dafür gibts Beispiele) und wendest bei jedem ansonsten die Routine fürs Teil an. Zeichnung: Set swDraw = SwApp.ActiveDoc NumShts = swDraw.GetSheetCount For i = 1 To NumShts ' blind zum ersten Blatt swDraw.SheetPrevious Next i For i = 1 To NumShts ' alle Blätter durchwühlen Set swView = swDraw.GetFirstView ' und jede Ansicht While Not swView Is Nothing Set swDispDim = swView.GetFirstDisplayDimension While Not swDispDim Is Nothing Set Dimension = swDispDim.GetDimension If Dimension.GetToleranceType = ... Lutz Federbusch Mein Gästebuch Der Mensch, Herr oder Sklave der Technik?]
[Diese Nachricht wurde von Lutz Federbusch am 31. Jan. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Piet Mitglied Konstruktionsleiter & Konstrukteur
  
 Beiträge: 661 Registriert: 20.11.2001 SWx 2021
|
erstellt am: 31. Jan. 2008 08:28 <-- editieren / zitieren --> Unities abgeben:          Nur für ronny82
|