| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS | | | | Workshop Leichtbauweise 2.0 bei HAM, eine Veranstaltung am 20.11.2024
|
Autor
|
Thema: Makro Gerichtetes Licht löschen (2991 mal gelesen)
|
Pneumus Mitglied Konstrukteur
Beiträge: 2 Registriert: 04.08.2012 SolidWorks
|
erstellt am: 04. Aug. 2012 15:49 <-- editieren / zitieren --> Unities abgeben:
Hallo. Ich möchte ein Makro schreiben welches mir die gerichteten Lichter aus meinem Teil löscht. (Ansicht --> Beleuchtung und Kameras --> Löschen--> ) Gerichtet1 Gerichtet2 Gerichtet3 Zwar habe ich in der SolidWorks API Hilfe die Methode gefunden, komme jedoch nicht weiter damit. Vielleicht hat das oder Ähnliches schon gemacht. Bitte um Hilfe!!!! freundliche Grüße Pneumus
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: 06. Aug. 2012 11:25 <-- editieren / zitieren --> Unities abgeben: Nur für Pneumus
Hallo Pneumus, und herzlich willkommen im SolidWork Brett auf CAD.de Die Aufgabe war ganz interessant, deswegen hab ich mal ein Beispielmakro dafür gemacht. Das Umpacken des Rückgabewertes in die einzelnen Werte dürfte der größte Stolperstein sein, da es nicht so ganz einfach nachzuvollziehen ist und von selbst drauf kommen schon sehr schwierig. Hier der Makrocode:
Code: ' ********************************************************************** ' * Makro ermittelt für alle Lichtquellen im aktiven Modell den ' * Lichtquellentyp und löscht in diesem Beispiel alle gerichteten ' * Lichter. ' * ' * (siehe auch http://ww3.cad.de/foren/ubb/Forum2/HTML/024417.shtml) ' * ' * 06.08.2012 Stefan Berlitz (stefan.berlitz@solidworks.cad.de) ' * http://solidworks.cad.de ' * http://swtools.cad.de ' **********************************************************************' benutzerdefinierte Datentypen definieren Type DoubleRec dValue As Double End Type Type Int2Rec iLower As Long iUpper As Long End Type ' Entpacken von 2 Interger Werten aus einem einzelnen Doublewert. Das wird ' erreicht durch Zuweisen an einen (benutzerdefinierten) Datentyp DoubleRec ' umkopieren dieses Typs an den benutzerdefinierten Type Int2Rec und von ' dort aus den unteren und oberen Integer auslesen. ' Die merkwürdige Konstellation zum "Entpacken" der Werte aus dem Doublearray ' siehe API Beispiel ' "Unpacking Double Arrays into Integer Pairs in Visual Basic .NET and Visual Basic" Function ExtractFields(dValue As Double, iLower As Integer, iUpper As Integer) Dim dr As DoubleRec, i2r As Int2Rec ' Setzen des Double Wertes dr.dValue = dValue ' Kopieren auf den zweiten benutzerdefinierten Datentyp LSet i2r = dr ' Auslesen der Werte und implizites Umsetzen in Integer iLower = i2r.iLower iUpper = i2r.iUpper
End Function Sub main() Dim swApp As Object Dim swModel As Object Dim nLightCount As Long Dim vLightProp As Variant Dim dLightProp As Double Dim LightsourceTypeUpper As Integer Dim LightsourceTypeLower As Integer Dim i As Long ' an SolidWorks anklinken und Modell holen Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc ' die Anzahl der Lichtquellen abfragen nLightCount = swModel.GetLightSourceCount ' und über alle Lichtquellen iterieren, und das rückwärts, damit das ' mit dem Löschen klappt, da sonst die Zählung durcheinander kommt For i = (nLightCount - 1) To 0 Step -1 ' die Eigenschaften der Lichtquellen holen ' der Rückgabewert ist ein Safearray bestehend aus 19 Doubles ' [ type, Intensity, Color[3], Position[3], Direction[3], coneAngle, ' falloff[3], Ambient, Specular, isDisabled, SpotExponent ] vLightProp = swModel.LightSourcePropertyValues(i) ' den Typ der Lichtquelle in ein Double umpacken dLightProp = vLightProp(0) ' und mit der Hilfsfunktion das "Umformatieren" in die gepackten Integers ExtractFields dLightProp, LightsourceTypeLower, LightsourceTypeUpper ' und dann nach dem Typ der Lichtquelle etwas damit anstellen Select Case LightsourceTypeLower Case 1 ' Umgebungslicht Case 2 ' Schweinwerfer Case 3 ' Punktlicht Case 4 ' gerichtetes Licht swModel.DeleteLightSource (i) Case Else ' unbekannter Lichttyp End Select Next i End Sub
Ich hoffe, das hilft als Gerüst oder schon fertige Lösung, wenn es nur um das Löschen geht.Ciao, Stefan ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Pneumus Mitglied Konstrukteur
Beiträge: 2 Registriert: 04.08.2012 SolidWorks
|
erstellt am: 07. Aug. 2012 10:46 <-- editieren / zitieren --> Unities abgeben:
Sehr schön! Hat mir prima geholfen! Vielen vielen herzlichen Dank. Aber Tatsache: Auf das Umpacken des Rückgabewertes in die einzelnen Werte wäre ich wohl so schnell nicht oder nie gekommen. Klasse Forum! LG Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Wilpe Mitglied
Beiträge: 2 Registriert: 18.10.2017
|
erstellt am: 18. Okt. 2017 16:44 <-- editieren / zitieren --> Unities abgeben: Nur für Pneumus
Hallo, ich weiss das dieses Thema schon etwas älter ist, ich habe aber dennoch eine Frage dazu. Das Löschen der gerichteten Lichter funktioniert mit dem Makro wunderbar. Gibt es noch eine Möglichkeit zusätzlich das Umgebungslicht auf 1.0 zu setzen? Viele Grüße Wilpe
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAD-Maler Mitglied Konstrukteur / CAD-Admin / Mädchen für alles
Beiträge: 727 Registriert: 17.01.2007 SWX 2023 SP5 Draftsight 2023 Win 11 Enterprise Intel i7-13700 2.10 GHz 64GB RAM Nvidia RTX A2000 12GB SWx EPDM AP+ CSWE 2018
|
erstellt am: 19. Okt. 2017 08:06 <-- editieren / zitieren --> Unities abgeben: Nur für Pneumus
Zitat: Original erstellt von Wilpe: Gibt es noch eine Möglichkeit zusätzlich das Umgebungslicht auf 1.0 zu setzen?
Guckst du hier... Müsste dann ungefähr so aussehen: (kann man auch mit dem Makrorekorder aufzeichnen) Code: boolstatus = Part.SetLightSourcePropertyValuesVB("Ambient", 1, 1, 16777215, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, False)
Gruß, Jens ------------------ CSWA, CSWP, CSWPA-SM & -SU =) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Wilpe Mitglied
Beiträge: 2 Registriert: 18.10.2017
|
erstellt am: 19. Okt. 2017 09:51 <-- editieren / zitieren --> Unities abgeben: Nur für Pneumus
Danke für den Hinweis. Mit dem Makrorecorder hat es gestern nicht funktioniert. Heute Schon, komisch. Hier nun mein gesamtes Makro um die gerichteten Lichter zu löschen und das Umgebungslicht auf 1 zu setzen.
Code: ' ********************************************************************** ' * Makro ermittelt für alle Lichtquellen im aktiven Modell den ' * Lichtquellentyp und löscht in diesem Beispiel alle gerichteten ' * Lichter. ' * ' * (siehe auch http://ww3.cad.de/foren/ubb/Forum2/HTML/024417.shtml) ' * ' * 06.08.2012 Stefan Berlitz (stefan.berlitz@solidworks.cad.de) ' * http://solidworks.cad.de ' * http://swtools.cad.de ' ********************************************************************** ' benutzerdefinierte Datentypen definieren Type DoubleRec dValue As Double End Type Type Int2Rec iLower As Long iUpper As Long End Type ' Entpacken von 2 Interger Werten aus einem einzelnen Doublewert. Das wird ' erreicht durch Zuweisen an einen (benutzerdefinierten) Datentyp DoubleRec ' umkopieren dieses Typs an den benutzerdefinierten Type Int2Rec und von ' dort aus den unteren und oberen Integer auslesen. ' Die merkwürdige Konstellation zum "Entpacken" der Werte aus dem Doublearray ' siehe API Beispiel ' "Unpacking Double Arrays into Integer Pairs in Visual Basic .NET and Visual Basic" Function ExtractFields(dValue As Double, iLower As Integer, iUpper As Integer) Dim dr As DoubleRec, i2r As Int2Rec ' Setzen des Double Wertes dr.dValue = dValue ' Kopieren auf den zweiten benutzerdefinierten Datentyp LSet i2r = dr ' Auslesen der Werte und implizites Umsetzen in Integer iLower = i2r.iLower iUpper = i2r.iUpper
End Function Sub main() Dim swApp As Object Dim swModel As Object Dim nLightCount As Long Dim vLightProp As Variant Dim dLightProp As Double Dim LightsourceTypeUpper As Integer Dim LightsourceTypeLower As Integer Dim i As Long Dim boolstatus As Boolean Dim longstatus As Long, longwarnings As Long Dim myModelView As Object ' an SolidWorks anklinken und Modell holen Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc ' die Anzahl der Lichtquellen abfragen nLightCount = swModel.GetLightSourceCount ' und über alle Lichtquellen iterieren, und das rückwärts, damit das ' mit dem Löschen klappt, da sonst die Zählung durcheinander kommt For i = (nLightCount - 1) To 0 Step -1 ' die Eigenschaften der Lichtquellen holen ' der Rückgabewert ist ein Safearray bestehend aus 19 Doubles ' [ type, Intensity, Color[3], Position[3], Direction[3], coneAngle, ' falloff[3], Ambient, Specular, isDisabled, SpotExponent ] vLightProp = swModel.LightSourcePropertyValues(i) ' den Typ der Lichtquelle in ein Double umpacken dLightProp = vLightProp(0) ' und mit der Hilfsfunktion das "Umformatieren" in die gepackten Integers ExtractFields dLightProp, LightsourceTypeLower, LightsourceTypeUpper ' und dann nach dem Typ der Lichtquelle etwas damit anstellen Select Case LightsourceTypeLower Case 1 ' Umgebungslicht Case 2 ' Schweinwerfer Case 3 ' Punktlicht Case 4 ' gerichtetes Licht swModel.DeleteLightSource (i) Case Else ' unbekannter Lichttyp End Select Next i boolstatus = swModel.SetLightSourcePropertyValuesVB("Ambient", 1, 1, 16777215, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, False) boolstatus = swModel.LockLightToModel(0, False) swModel.GraphicsRedraw
End Sub
VG Wilpe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAD-Maler Mitglied Konstrukteur / CAD-Admin / Mädchen für alles
Beiträge: 727 Registriert: 17.01.2007 SWX 2023 SP5 Draftsight 2023 Win 11 Enterprise Intel i7-13700 2.10 GHz 64GB RAM Nvidia RTX A2000 12GB SWx EPDM AP+ CSWE 2018
|
erstellt am: 19. Okt. 2017 12:14 <-- editieren / zitieren --> Unities abgeben: Nur für Pneumus
Der Vollständigkeit halber: Das Löschen der Lichter geht auch wesentlich einfacher: Code: Sub main() Dim swApp As SldWorks.SldWorks Dim Part As SldWorks.ModelDoc2 Set swApp = Application.SldWorks Set Part = swApp.ActiveDoc Do While Part.GetLightSourceCount > 1 Part.DeleteLightSource 1 Loop End Sub
Das Umgebungslicht wird dabei nicht gelöscht. Hin und wieder läuft der Code in eine Endlosschleife, falls eines der Lichter nicht korrekt gelöscht wird. Gruß, Jens ------------------ CSWA, CSWP, CSWPA-SM & -SU =) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
oko2010 Mitglied Konstruktion, Admin
Beiträge: 26 Registriert: 09.08.2013 ProEngineer Alle Versionen Solidworks Alle Versionen Rhino Alle Versionen
|
erstellt am: 16. Mai. 2019 12:19 <-- editieren / zitieren --> Unities abgeben: Nur für Pneumus
Eine Frage dazu: Wenn ich nun beim Umgebungslicht auch noch den Farbwert weiss mit angeben will in der Zeile, wie bzw. wo muesste der dann hier auftauchen? --------------- boolstatus = swModel.SetLightSourcePropertyValuesVB("Ambient", 1, 1, 16777215, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, False) boolstatus = swModel.LockLightToModel(0, False) swModel.GraphicsRedraw
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ConZept Mitglied Maschinenbautechniker
Beiträge: 15 Registriert: 19.02.2019 SolidWorks 2018 / SP 4.0 Win7x64 /HP Z440
|
erstellt am: 16. Mai. 2019 20:31 <-- editieren / zitieren --> Unities abgeben: Nur für Pneumus
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|