| |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS |
| |
 | SOLIDWORKS Grundlagen Schulung, ein Seminar am 14.07.2025
|
Autor
|
Thema: Layer über API ein/ausschalten (2162 mal gelesen)
|
caxman Mitglied
 
 Beiträge: 270 Registriert: 06.08.2002 4GB RAM<P>Windows 7 32bit SWX 2008/2010
|
erstellt am: 01. Sep. 2009 09:41 <-- editieren / zitieren --> Unities abgeben:         
Hallo, bin neu in SolidWorks und möchte mich auch ein bisschen in API einarbeiten. Die ersten Versuche haben auch soweit geklappt, doch nun hänge ich etwas fest. Ich möchte mit einer UserForm über eine Checkbox einen Haken setzen lassen um einen Layer ein bzw. auszuschaltzen. D.h. Haken gesetzt - Layer ein, Haken fehlt - Layer aus. Hier mal der Code: Sub LayerSetzen() Dim swApp As Object Dim Model As Object Dim swLayer As SldWorks.Layer Dim swLayerMgr As SldWorks.LayerMgr Set swApp = CreateObject("SldWorks.Application") swApp.Visible = True Set swModel = swApp.ActiveDoc Set swLayerMgr = swModel.GetLayerManager Set swLayer = swLayerMgr.GetLayer("Layer1") 'CheckBoxPreliminary If CheckBoxPreliminary = True Then 'Layer einschalten swLayer.Visible = True Debug.Assert True = swLayer.Visible Else 'Layer ausschalten swLayer.Visible = False Debug.Assert False = swLayer.Visible End If GraphicsRedraw End Sub Hab ich mit Hilfe der API-Hilfe zusammengebastelt, aber anscheinend stimmt was nicht. Schon mal jetzt vielen Dank! SolidWorks 2009, SP3, 32Bit mit Windows XP Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StefanBerlitz Guter-Geist-Moderator IT Admin (CAx)

 Beiträge: 8756 Registriert: 02.03.2000 SunZu sagt: Analysiere die Vorteile, die du aus meinem Ratschlag ziehst. Dann gliedere deine Kräfte entsprechend und mache dir außergewöhnliche Taktiken zunutze.
|
erstellt am: 01. Sep. 2009 10:04 <-- editieren / zitieren --> Unities abgeben:          Nur für caxman
|
caxman Mitglied
 
 Beiträge: 270 Registriert: 06.08.2002 4GB RAM<P>Windows 7 32bit SWX 2008/2010
|
erstellt am: 01. Sep. 2009 10:54 <-- editieren / zitieren --> Unities abgeben:         
Hallo Stefan, danke schon mal für die schnelle Antwort. Das ist erst mal das ganze Makro. Ich versuch immer Stückweise mcih ranzutasten, d.h. ich möchte jetzt erst mal nur über diese Checkbox einen Layer ein oder ausschalten. Dazu hab ich eine einfache Userform erstellt (siehe Anhang) und dieses kleine Programm. Fehklermeldung kommt gar nichts, es passiert einfach auch nichts. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thomas Liebezeit Mitglied Dipl.-Ing. Maschinenbau, CSWP
 
 Beiträge: 114 Registriert: 01.07.2005 2007 SP5.0 2008 SP4.0 2009 SP3.0
|
erstellt am: 01. Sep. 2009 11:33 <-- editieren / zitieren --> Unities abgeben:          Nur für caxman
|
caxman Mitglied
 
 Beiträge: 270 Registriert: 06.08.2002 4GB RAM<P>Windows 7 32bit SWX 2008/2010
|
erstellt am: 01. Sep. 2009 11:55 <-- editieren / zitieren --> Unities abgeben:         
|
StefanBerlitz Guter-Geist-Moderator IT Admin (CAx)

 Beiträge: 8756 Registriert: 02.03.2000 SunZu sagt: Analysiere die Vorteile, die du aus meinem Ratschlag ziehst. Dann gliedere deine Kräfte entsprechend und mache dir außergewöhnliche Taktiken zunutze.
|
erstellt am: 01. Sep. 2009 12:15 <-- editieren / zitieren --> Unities abgeben:          Nur für caxman
Hallo caxman, also bei mir klappt das Makro wunderbar. Ich hab mir eine Zeichnung gemacht, darauf ein paar Beschriftungen und 3 Layer namens Layer0, Layer1 und Layer2. Da hab ich dann die Texte auf diese Layer zugewiesen, dass ich sehen kann, was das Makro macht. Direkt nach dem Aufruf des Makro passiert ... logischerweise nix, warum sollte auch. Also steht die Maske da mit deaktivierter Checkbox. Die kann ich jetzt anklicken, daraufhin ändert sich auf der Zeichnung ... immer noch nix, da ja der Layer1, der vorher sichtbar war, jetzt sichtbar geschaltet wird, kein Wirklich großer Unterschied  Klicke ich aber noch mal die Checkbox an und entferne den Haken wieder verschwindet auch der Text auf dem Layer1 und ich kann im Layermanager anschließend sehen, dass der Layer1 auch ausgeblendet ist. Also: es funktioniert alles, so wie es soll. Die Frage ist also: wie sollte es deiner Meinung nach funktionieren und warum glaubst du, dass es nicht richtig arbeitet? Ciao, Stefan ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Stefans SolidWorks Blog Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
caxman Mitglied
 
 Beiträge: 270 Registriert: 06.08.2002 4GB RAM<P>Windows 7 32bit SWX 2008/2010
|
erstellt am: 01. Sep. 2009 12:33 <-- editieren / zitieren --> Unities abgeben:         
Hallo Stefan, manchmal braucht man nur einen Anstoss von jemand oder sitzt einfach auf der Leitung! ;-)) Bei mir funktioniert's auch; mein Fehler war einfach ich hab nur einmal draufgeklickt, also den Haken gesetzt und dann mit Ende bestätigt; logisch der Layer war ja an. Dann als ich es wieder aufgerufen hab war mein Haken weg und der Layer immer noch an. Deshalb dachte ich es funktioniert nicht. Ich muss also jetzt vorher noch den Status des Layer abfragen und den Haken initial schon setzen bzw. wegnehmen. Kannst Du mir dazu einen Tipp geben? 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: 01. Sep. 2009 13:51 <-- editieren / zitieren --> Unities abgeben:          Nur für caxman
Mahlzeit, In der API Hilfe hab ich spontan zwei tolle Beispiele gefunden..: - Determine if Layer is Visible Example (VB) - Get Layers Example (VB) ...da kann dir bestimmt nichtmal Stefan besser helfen
viele Grüße Andy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
caxman Mitglied
 
 Beiträge: 270 Registriert: 06.08.2002 4GB RAM<P>Windows 7 32bit SWX 2008/2010
|
erstellt am: 01. Sep. 2009 14:11 <-- editieren / zitieren --> Unities abgeben:         
Hallo Andy, vielen Dank für den Tipp. AAber. Die eigentliche Herausforderung (für mich) wie ich jetzt der Checkbox sage Haken rein oder raus wird in diesen Themen (soweit ich das verstehe) leider nicht behandelt. 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: 01. Sep. 2009 14:23 <-- editieren / zitieren --> Unities abgeben:          Nur für caxman
Das ist nicht schwer eigentlich weisst du es, du weisst nur nicht dass du es weisst...du musst nur das Beispiel minimal umwandeln: If False = swLayer.Visible Then checkbox.visible = false Else checkbox.visible = true End If swLayer kann bei dir natürlich anders heißen, ich hab jetzt nicht in dein Makro reingekuckt aber prinzipiell sollte das funktionieren.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StefanBerlitz Guter-Geist-Moderator IT Admin (CAx)

 Beiträge: 8756 Registriert: 02.03.2000 SunZu sagt: Analysiere die Vorteile, die du aus meinem Ratschlag ziehst. Dann gliedere deine Kräfte entsprechend und mache dir außergewöhnliche Taktiken zunutze.
|
erstellt am: 01. Sep. 2009 14:28 <-- editieren / zitieren --> Unities abgeben:          Nur für caxman
Ah ja, manchmal sieht man einfach den Wald vor lauter Bäumen nicht  Wenn du eine definierte Ausgangslage herstellst wird das einfacher. Du musst also beim Aufruf das Ganze so hinstellen, wie du es als Ausgangslage für den Anwender haben willst. Um dabei deine Prozedur auch auszuführen muss du die also einmal ausführen ... und das sollte passieren, wenn die Userform angezeigt wird. Solche Initialisierungen macht man am Besten in der Prozedur UserForm_Initialize, dort simulierst du dann durch aufrufen deiner Prozedur CheckBoxPreliminary_Click einen Click auf die Checkbox. Wichtig bei der Simulation: der Haken wird durch den Aufruf der Clickprozedur nicht umgestellt, also stellst du vorher den Default der Checkbox so ein, wie du die definierte Ausgangslage haben möchtest. Also Value auf True, wenn der Layer zu Beginn eingeschaltet sein soll, auf FALSE wenn der ausgeschaltet sein soll. Ich hoffe, das ist so weit halbwegs klar und es macht dann, was du möchtest. Ciao, Stefan ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Stefans SolidWorks Blog Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
caxman Mitglied
 
 Beiträge: 270 Registriert: 06.08.2002 4GB RAM<P>Windows 7 32bit SWX 2008/2010
|
erstellt am: 01. Sep. 2009 15:03 <-- editieren / zitieren --> Unities abgeben:         
Ja, das funktioniert soweit super! Nur ist machmal beim Öffnen der Zeihcnung der Layer ausgeschaltet, manchmal eingeschaltet, je nach Zeihcnung. Und diesen status möchte ich abfragen und der Box zuweisen. Wenn ich initialisiere und ruf mein Makro auf dann verschwindet der Layer weil ich in meinem Makro keinen Haken gesetzt habe; er muss aber bei dieser Zeihcnung sichtbar bleiben. Oder der Layer wird angezeigt weil ich im Makro einen Haken setze, er soll aber ausgeblendet bleiben weil die Zeichnung so abgespeichert wurde. Wenn ich die Version von andy nehme dann verschwindet nach mehrmaligem Klicken irgendwan meine ganze Checkbox und ich kann gar keinen Haken mehr setzen. Erst beim nächsten Makroaufruf ist sie wieder da. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StefanBerlitz Guter-Geist-Moderator IT Admin (CAx)

 Beiträge: 8756 Registriert: 02.03.2000 SunZu sagt: Analysiere die Vorteile, die du aus meinem Ratschlag ziehst. Dann gliedere deine Kräfte entsprechend und mache dir außergewöhnliche Taktiken zunutze.
|
erstellt am: 01. Sep. 2009 15:20 <-- editieren / zitieren --> Unities abgeben:          Nur für caxman
Hallo caxman, dann willst du die Ausgangslage nicht selbst herstellen, sondern schauen wie es steht und deine Checkbox so einstellen. Auch das machst du in der Initialisieruprozedur des Userform, und wie Andy oben geschrieben hat musst du nur den Zustand deines Layer abfragen und die Checkbox auf diesen Wert setzen. Sieht praktisch so aus wie deine vorhandene Prozedur:
Code: Private Sub UserForm_Initialize() Dim swApp As Object Dim Model As Object Dim swLayerMgr As SldWorks.LayerMgr Dim swLayer As SldWorks.Layer Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc Set swLayerMgr = swModel.GetLayerManager Set swLayer = swLayerMgr.GetLayer("Layer1") CheckBoxPreliminary.Value = swLayer.VisibleEnd Sub
Achtung: das setzen der Value Eigenschaft löst das ClickEreignis aus, dass ist ist diesem Fall nicht schlimm, weil der Code darin ja genau den Zustand in SolidWorks herstellt, den du eh schon hast; aber in anderen Fällen kann das zu einem lustigen Ping-Pong führen  Ciao, Stefan ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Stefans SolidWorks Blog Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
caxman Mitglied
 
 Beiträge: 270 Registriert: 06.08.2002 4GB RAM<P>Windows 7 32bit SWX 2008/2010
|
erstellt am: 01. Sep. 2009 15:32 <-- editieren / zitieren --> Unities abgeben:         
|