| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS |
| |
| Elektromagnetische Simulation im niederfrequenten Bereich mit CST Studio Suite |
Autor
|
Thema: API: Rückgabewert von Set Current layer (1249 mal gelesen)
|
Olls Lai Lolli Mitglied Konstrukteur
Beiträge: 366 Registriert: 07.05.2009 MS Windows 10 Prof. Intel Xeon E5-1630 v 3 3.7 GHz 32 GB Ram Nvidia Quadro M4000 SWX 2019 x64 SP 5 PDM Enterprise 2019 SP 3
|
erstellt am: 01. Apr. 2020 20:49 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich versuche die Corona-Zwangspause sinnvoll zu nutzen und befasse mich etwas mit der Erstellung von Makros. In einem ersten kleinen Makro will ich prüfen ob der Layer "Red" in einer Zeichnung vorhanden ist, oder nicht. Um überhaupt mal einen Einstieg in das Thema zu bekommen habe ich mir dieses Beispiel von der API Hilfe runter geladen: Meine Idee war es zu versuchen den Layer Red zu aktivieren. Falls es klappt sollte der Rückgabewert 1 zurück gegeben werden, falls es nicht klappt, weil es den Layer nicht gibt, sollte der Rückgabewert von 0 erscheinen. So zumindest habe ich die Beschreibung von Set Current layer verstanden. Mit meinem angepassten Code bekomme ich aber immer den Rückgabewert 1 Code:
Option ExplicitSub main() Dim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim swLayerMgr As SldWorks.LayerMgr Dim vLayerArr As Variant Dim vLayer As Variant Dim swLayer As SldWorks.Layer Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc Set swLayerMgr = swModel.GetLayerManager
Debug.Print "File = " & swModel.GetPathName Debug.Print " Current Layer = " & swLayerMgr.GetCurrentLayer ' Debug.Print "" Dim retVal As Integer retVal = swLayerMgr.SetCurrentLayer("Red") Debug.Print retVal If retVal = 1 Then Debug.Print "Layer vorhanden und aktiviert" If retVal = 0 Then Debug.Print "Fehler beim aktivieren" Debug.Print " Current Layer = " & swLayerMgr.GetCurrentLayer Debug.Print ""
End Sub
Wo liegt mein Denk- bzw. Programmierfehler ? Gruß OLL [Diese Nachricht wurde von Olls Lai Lolli am 01. Apr. 2020 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RBE Mitglied TechSupport; Bechtle PLM Deutschland GmbH
Beiträge: 291 Registriert: 11.02.2002 HP ZBook 17 G5 Core i9 2.9GHz 32GB RAM Quadro P4200 Win11 SolidWorks2024 SP1
|
erstellt am: 02. Apr. 2020 08:11 <-- editieren / zitieren --> Unities abgeben: Nur für Olls Lai Lolli
Moin OLL, wie wäre es, wenn Du Dir vorher einfach die Liste der vorhandenen Layer holst und dort erstmal schaust, ob es den gibt, den Du setzen möchtest -> LayerMgr::GetLayerList EDIT: Das mit dem Rückgabewert kann ich bestätigen. In dem Fall dann vorher Liste prüfen und im Nachhinein schauen, ob tatsächlich der gewünschte Layer aktiv ist. ------------------ Grüße, RBE ---------- [Diese Nachricht wurde von RBE am 02. Apr. 2020 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bk.sc Ehrenmitglied V.I.P. h.c. Konstrukteur Sondermaschinenbau
Beiträge: 2776 Registriert: 18.07.2012 -Solid Works 2019 SP5 -Pro Engineer WF 3
|
erstellt am: 02. Apr. 2020 08:53 <-- editieren / zitieren --> Unities abgeben: Nur für Olls Lai Lolli
Hallo OLL, mach doch in der Schleife des Beispielmacros einen Namensabgleich "swLayer.Name = Red" Code:
Option ExplicitSub main() Dim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim swLayerMgr As SldWorks.LayerMgr Dim vLayerArr As Variant Dim vLayer As Variant Dim swLayer As SldWorks.Layer Dim boolstatus As Boolean Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc Set swLayerMgr = swModel.GetLayerManager vLayerArr = swLayerMgr.GetLayerList For Each vLayer In vLayerArr Set swLayer = swLayerMgr.GetLayer(vLayer) If swLayer.Name = "Red" Then swLayerMgr.SetCurrentLayer ("Red") boolstatus = True Exit For End If Next If boolstatus Then Debug.Print "Layer vorhanden und aktiviert" Else Debug.Print "Fehler beim aktivieren" End If End Sub
Warum aber SetCurrentLayer trotzt nicht vorhanden sein des Layer "1" (oder in meinem Fall True) ausgibt ist mir auch ein Rätsel. Gruß Bernd
------------------ --- Man muß nicht alles wissen, man muß nur wissen wo es steht --- Staatlich anerkannte Deutschniete Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Olls Lai Lolli Mitglied Konstrukteur
Beiträge: 366 Registriert: 07.05.2009 MS Windows 10 Prof. Intel Xeon E5-1630 v 3 3.7 GHz 32 GB Ram Nvidia Quadro M4000 SWX 2019 x64 SP 5 PDM Enterprise 2019 SP 3
|
erstellt am: 02. Apr. 2020 09:25 <-- editieren / zitieren --> Unities abgeben:
Hallo RBE und bk.sc, vielen Dank für Eure Unterstützung. Ich werde die Überprüfung dann so umsetzen wie ihr das vorgeschlagen habt. Ich hoffe mal dass ich nicht noch öfters über solche "Fehler" stolpere, macht es für einen Anfänger wie mich, der noch nicht so richtig weiß was er tut, nicht gerade einfach den Einstieg ins programmieren zu finden. Wenn das doch passiert, werde ich in nächster Zeit hier im Forum zum Alleinunterhalter :-) Lohnt es sich diesen Fehler zu melden? Gruß OLL
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Christian_W Ehrenmitglied V.I.P. h.c. Konstrukteur (Dipl-Ing)
Beiträge: 3189 Registriert: 04.04.2001 CSWP 12/2015<P>SWX2021sp5 Win10/11 (SWX2016, SWX2012) proAlpha6.2e00/calinkV9 (Tactonworks) (Medusa7, NesCAD2010, solidEdge19)
|
erstellt am: 02. Apr. 2020 10:34 <-- editieren / zitieren --> Unities abgeben: Nur für Olls Lai Lolli
Zitat: Original erstellt von Olls Lai Lolli: ... Ich hoffe mal dass ich nicht noch öfters über solche "Fehler" stolpere, ...
Hallo, nach Murphy's Gesetz wirst du schon noch ein paar solcher Fehler finden ... hab mal versucht einen Wert zu setzen per api - das ging einfach nicht, weil man den Funktionsaufruf zwar definiert hatte, aber vergessen hat den entsprechenden Programmcode da reinzuschreiben. trotzdem viel Spaß und Erfolg! Gruß, Christian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Olls Lai Lolli Mitglied Konstrukteur
Beiträge: 366 Registriert: 07.05.2009 MS Windows 10 Prof. Intel Xeon E5-1630 v 3 3.7 GHz 32 GB Ram Nvidia Quadro M4000 SWX 2019 x64 SP 5 PDM Enterprise 2019 SP 3
|
erstellt am: 02. Apr. 2020 11:14 <-- editieren / zitieren --> Unities abgeben:
Zitat: nach Murphy's Gesetz wirst du schon noch ein paar solcher Fehler finden ...
Oh Oh! das kann ja noch lustig werden, muss mich dann wohl öfters hilfesuchend ans Forum wenden....:D Zitat: hab mal versucht einen Wert zu setzen per api - das ging einfach nicht, weil man den Funktionsaufruf zwar definiert hatte, aber vergessen hat den entsprechenden Programmcode da reinzuschreiben.
--> ich versteh nur Bahnhof..... Gruß OLL
[Diese Nachricht wurde von Olls Lai Lolli am 02. Apr. 2020 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
TMS-TB Mitglied Konstrukteur
Beiträge: 34 Registriert: 30.07.2012
|
erstellt am: 02. Apr. 2020 14:43 <-- editieren / zitieren --> Unities abgeben: Nur für Olls Lai Lolli
Ich hoffe bin jetzt nicht hier falsch, aber gehört zum Thema. Ich setzte mit setcurrentlayer die Farbe auf "Blau" und füge danach eine Stückliste ein und diese wird nicht in dem Layer "Blau" eingefügt sondern bleibt auf dem Standardlayer von dem Blatt. Füge ich danach einfach eine neue Stückliste per Hand ein ist diese im Layer "Blau". Warum? Hier der Codeschnipsel boolstatus = swDrawing.ActivateView("Zeichenansicht1") swDrawing.SetCurrentLayer ("Blau") Set swView = swDrawing.ActiveDrawingView Set swBOMAnnotation = swView.InsertBomTable4(True, 0, 0, 3, 2, "Standard", sStuecklistePfad, False, swNumberingType_Detailed, False) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Christian_W Ehrenmitglied V.I.P. h.c. Konstrukteur (Dipl-Ing)
Beiträge: 3189 Registriert: 04.04.2001 CSWP 12/2015<P>SWX2021sp5 Win10/11 (SWX2016, SWX2012) proAlpha6.2e00/calinkV9 (Tactonworks) (Medusa7, NesCAD2010, solidEdge19)
|
erstellt am: 02. Apr. 2020 16:10 <-- editieren / zitieren --> Unities abgeben: Nur für Olls Lai Lolli
Zitat:
--> ich versteh nur Bahnhof.....
ungefähr so: Code: function setzeSchrifttyp() as boolean rem hier müsste eigentlich noch Programmtext rein rem am besten bevor das Programm ausgeliefert wird end function
Da hatte SolidWorks eine Funktion definiert, die etwas tun sollte (und auch in der API-Hilfe beschrieben), aber vergessen den eigentlichen Programmtext da reinzuschreiben. ich hab die function aufgerufen, es gab auch keinen Fehler, aber es ist auch nix passiert ... ich meine es war eine Schrifttype in den Dokumenteigenschaften, die ich setzen wollte. musste dann halt anders gelöst werden Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Christian_W Ehrenmitglied V.I.P. h.c. Konstrukteur (Dipl-Ing)
Beiträge: 3189 Registriert: 04.04.2001 CSWP 12/2015<P>SWX2021sp5 Win10/11 (SWX2016, SWX2012) proAlpha6.2e00/calinkV9 (Tactonworks) (Medusa7, NesCAD2010, solidEdge19)
|
erstellt am: 02. Apr. 2020 16:17 <-- editieren / zitieren --> Unities abgeben: Nur für Olls Lai Lolli
Zitat: Original erstellt von TMS-TB: Ich hoffe bin jetzt nicht hier falsch, aber gehört zum Thema. Ich setzte mit setcurrentlayer die Farbe auf "Blau" und füge danach eine Stückliste ein und diese wird nicht in dem Layer "Blau" eingefügt sondern bleibt auf dem Standardlayer von dem Blatt. Füge ich danach einfach eine neue Stückliste per Hand ein ist diese im Layer "Blau". Warum? Hier der Codeschnipsel boolstatus = swDrawing.ActivateView("Zeichenansicht1") swDrawing.SetCurrentLayer ("Blau") Set swView = swDrawing.ActiveDrawingView Set swBOMAnnotation = swView.InsertBomTable4(True, 0, 0, 3, 2, "Standard", sStuecklistePfad, False, swNumberingType_Detailed, False)
habe das mit der Stückliste nicht probiert, aber von Hand kann es einem ja auch passieren, dass man erstmal von etwas selektiertem den Layer ändert und dann erst für neue Objekte umstellt. aber du schreibst ja, dass es danach per Hand geht ... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Olls Lai Lolli Mitglied Konstrukteur
Beiträge: 366 Registriert: 07.05.2009 MS Windows 10 Prof. Intel Xeon E5-1630 v 3 3.7 GHz 32 GB Ram Nvidia Quadro M4000 SWX 2019 x64 SP 5 PDM Enterprise 2019 SP 3
|
erstellt am: 02. Apr. 2020 17:14 <-- editieren / zitieren --> Unities abgeben:
|
TMS-TB Mitglied Konstrukteur
Beiträge: 34 Registriert: 30.07.2012
|
erstellt am: 03. Apr. 2020 06:35 <-- editieren / zitieren --> Unities abgeben: Nur für Olls Lai Lolli
|
bk.sc Ehrenmitglied V.I.P. h.c. Konstrukteur Sondermaschinenbau
Beiträge: 2776 Registriert: 18.07.2012 -Solid Works 2019 SP5 -Pro Engineer WF 3
|
erstellt am: 06. Apr. 2020 14:31 <-- editieren / zitieren --> Unities abgeben: Nur für Olls Lai Lolli
Hallo TMS-TB, wenn du direkt nach dem erstellen der Stückliste swBOMTable.GetAnnotation.Layer = "Layername" aufrufst sollte das ändern des Layers klappen. Aber nicht wunder das ist in der API-Hilfe nicht direkt zu finden dass das so geht. Gruß Bernd ------------------ --- Man muß nicht alles wissen, man muß nur wissen wo es steht --- Staatlich anerkannte Deutschniete Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
TMS-TB Mitglied Konstrukteur
Beiträge: 34 Registriert: 30.07.2012
|
erstellt am: 06. Apr. 2020 14:46 <-- editieren / zitieren --> Unities abgeben: Nur für Olls Lai Lolli
Danke bk.sc, das klappt einwandfrei. Hier noch der korrigierte Code für alle: Dim swBOMAnnotation As SldWorks.BomTableAnnotation boolstatus = swDrawing.ActivateView("Zeichenansicht1") Set swView = swDrawing.ActiveDrawingView 'Hier kommt die Stückliste Set swBOMAnnotation = swView.InsertBomTable4(True, 0, 0, 3, 2, "Standard", sStuecklistePfad, False, swNumberingType_Detailed, False) 'Hier wird Farbe von der Stückliste geändert swBOMAnnotation.GetAnnotation.Layer = "Blau" Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |