| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS |
| |
| Der größte Rechenreiniger der Welt bei MUHR (SOLIDWORKS, SOLIDWORKS Simulation), ein Anwenderbericht
|
Autor
|
Thema: Makro - Konfigurationswechsel in Stückliste (1097 / mal gelesen)
|
julmue Mitglied
Beiträge: 14 Registriert: 24.05.2019 SWX: Professional 2020 SP5.0 PDM: 28.5 CPU: Intel(R) Xeon(R) W-11955M @ 2.6 GHz Ram: 64GB GPU: NVidia RTX A5000 16GB
|
erstellt am: 15. Jul. 2021 16:35 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, da ich aktuell sehr viele Explosionszeichnungen über eine Baugruppe mit dementsprechend vielen Konfigurationen mache, wollte ich mir hier durch ein Makro etwas die Arbeit erleichtern. Bisher habe ich: - Speicherung der Zeichnung als DRW - Speicherung der Zeichnun als PNG - Speicherung der Stückliste als xlsx - Wechsel der Konfiguration des Modells Nun fehlt mir leider ein Ansatz wie ich die Konfiguration der Stückliste per VBA ändern kann. Leider ignoriert die Aufzeichnungsfunktion dies auch komplett...
Hat mir jemand hierfür eine Lösung? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andi Beck Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2580 Registriert: 02.10.2006 Firma: SW 2024-3.1 + PDM Prof. Windows 10 Pro 64bit, i9-11900 32 GbRAM, Quadro P2200 Home: SW 2023-5.0 Passungstabelle von Heinz Windows 11 Pro 64bit, i7-12700K, 32 GbRAM, GeForce GTX 1050Ti Samsung C34H892, 3440x1440 Pixel
|
erstellt am: 15. Jul. 2021 19:57 <-- editieren / zitieren --> Unities abgeben: Nur für julmue
|
julmue Mitglied
Beiträge: 14 Registriert: 24.05.2019 SWX: Professional 2020 SP5.0 PDM: 28.5 CPU: Intel(R) Xeon(R) W-11955M @ 2.6 GHz Ram: 64GB GPU: NVidia RTX A5000 16GB
|
erstellt am: 16. Jul. 2021 11:23 <-- editieren / zitieren --> Unities abgeben:
Hallo Andi, vielen Dank für deine Antwort! Leider laufe ich bei meinem Code ständig in den Laufzeitfehler 91 und komme irgendwie nicht weiter. Liegt vermutlich aber auch daran, dass ich mich erst seit kurzem mit VBA beschäftige und hier irgendwo etwas fehlt/falsch gemacht wurde. Anbei mal mein Code, damit man den zusammenhang verstehen kann. Hier sind mit Sicherheit so einige Fehler oder tote Codezeilen.. Der Debugger führt mich immer in die Zeile recht weit unten "swBOMFeat.SetConfigurations True, boolActiveBOM, configNames" Code: ' ****************************************************************************** 'Macro to change the configuration of the drawing and the BOM ' ******************************************************************************Option Explicit Sub main() 'object variables define and assign to SolidWorks+active document Dim swApp As SldWorks.SldWorks Set swApp = Application.SldWorks Dim swModel As SldWorks.ModelDoc2 'swModel for DRW Dim swModelASM As SldWorks.ModelDoc2 'swModel for ASM Dim swConfigASM As SldWorks.Configuration Dim swDraw As SldWorks.DrawingDoc Dim swBOMFeat As SldWorks.BomFeature Dim swView As SldWorks.View Dim swSelMgr As SldWorks.SelectionMgr 'Dim swFeatMgr As SldWorks.FeatureManager 'Dim swBOMAnn As BomTableAnnotation 'Dim swSheet As Sheet Dim configName As String Dim configNames() As String Dim strFileDRW As String Dim strActiveConfig As String Dim strNextConfig As String Dim boolActiveBOM(250) As Boolean 'Array which enables or disables the configurations of the BOM 'Test variables Dim strTest As String Dim intTest As Integer Dim boolRecall As Boolean Dim i As Long Dim j As Long Dim k As Long Dim h As Long Dim errors As Long Dim warnings As Long '******************************** '**insert here the path of the ASM** Dim fileName As String fileName = "C:\Hauptordner\Unterordner\Test.SLDASM" '**insert here the path of the ASM** '******************************** Set swModel = swApp.ActiveDoc Set swModelASM = swApp.OpenDoc6(fileName, swDocumentTypes_e.swDocASSEMBLY, swOpenDocOptions_e.swOpenDocOptions_Silent, "", errors, warnings) Set swConfigASM = swModelASM.GetActiveConfiguration Set swDraw = swModel Set swSelMgr = swModel.SelectionManager Set swFeatMgr = swModel.FeatureManager Set swView = swDraw.GetFirstView 'Get drawing views of activ drawing Set swView = swView.GetNextView '--------------------check file-format----------------------------
'proof that document is loaded and correct for this operation If Not swModel Is Nothing Then Select Case swModel.GetType Case swDocumentTypes_e.swDocPART swApp.SendMsgToUser "Es ist ein Part geladen und damit diese Funktion nicht möglich." Exit Sub Case swDocumentTypes_e.swDocASSEMBLY swApp.SendMsgToUser "Es ist eine Baugruppe geladen und damit diese Funktion nicht möglich." Exit Sub Case swDocumentTypes_e.swDocDRAWING 'swApp.SendMsgToUser "Die Zeichnung wird unter dem einzugebenden Namen gespeichert und ein Bild im Unterordner Bilder erstellt." Case Else swApp.SendMsgToUser "Kein aktives Dokument geladen." Exit Sub End Select End If '--------------------list and change configurations of drawing---------------------------- 'Get and print names of all configurations configNames() = swModelASM.GetConfigurationNames() For i = 0 To UBound(configNames) configName = configNames(i) Set swConfigASM = swModelASM.GetConfigurationByName(configName) 'Debug.Print " Name of configuration(" & i & ") = " & configName Next i strActiveConfig = swView.ReferencedConfiguration Debug.Print "active drawing configuration before change: " & strActiveConfig Do Until configNames(j) = strActiveConfig j = j + 1 strNextConfig = configNames(j + 1) Loop boolRecall = swModel.ActivateView("Zeichenansicht1") swView.ReferencedConfiguration = strNextConfig ' Model Rebuild swModel.EditRebuild3 Debug.Print "active drawing configuration is now: " & strActiveConfig '--------------------list and change configurations of BOM---------------------------- 'Fill boolArray with False in all cells to disable all configurations by default For k = 0 To UBound(configNames) boolActiveBOM(k) = False Next k 'change all configurations to false and the now active configuration (strNextConfig) to true Do While configNames(h) <> strNextConfig h = h + 1 Loop boolActiveBOM(h) = True ' actives the showed drawing configuration swBOMFeat.SetConfigurations True, boolActiveBOM, configNames ' Update FeatureManager design tree swFeatMgr.UpdateFeatureTree ' Clean up Set swApp = Nothing End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andi Beck Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2580 Registriert: 02.10.2006 Firma: SW 2024-3.1 + PDM Prof. Windows 10 Pro 64bit, i9-11900 32 GbRAM, Quadro P2200 Home: SW 2023-5.0 Passungstabelle von Heinz Windows 11 Pro 64bit, i7-12700K, 32 GbRAM, GeForce GTX 1050Ti Samsung C34H892, 3440x1440 Pixel
|
erstellt am: 16. Jul. 2021 11:59 <-- editieren / zitieren --> Unities abgeben: Nur für julmue
Hallo, mal auf die Schnelle. Schau dir mal deine Deklaration an, evtl. fällt dir was auf. Code:
Dim configNames() As String
wäre da wahrscheinlich besser angebracht. Grüße, Andi
------------------ Hast du kein Problem? Such dir eins. ( Und löse es ) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
julmue Mitglied
Beiträge: 14 Registriert: 24.05.2019 SWX: Professional 2020 SP5.0 PDM: 28.5 CPU: Intel(R) Xeon(R) W-11955M @ 2.6 GHz Ram: 64GB GPU: NVidia RTX A5000 16GB
|
erstellt am: 19. Jul. 2021 07:35 <-- editieren / zitieren --> Unities abgeben:
Das war anfänglich ebenfalls mein Ansatz, jedoch beschwert sich der Compiler bei der Deklaration auf variant über unverträgliche Typen in der Zeile "configNames() = swModelASM.GetConfigurationNames()". Deklariert als String funktioniert dieser Teil der Konfigurationsabfrage einwandfrei. Wieso kann ich jedoch auch nicht sagen. Das zentrale Problem liegt hier im Laufzeitfehler 91: Objektvariable oder With-Blockvariable nicht festgelegt und hier markiert er diese Zeile "swBOMFeat.SetConfigurations True, boolActiveBOM, configNames". Kann es sein, dass hier irgendwo ein Set swBOMFeat = ... hin müsste? Edit: Meine Ansatzversuche sind aktuell: Dim swBOMTable As IBomTableAnnotation Set swBOMTable = swView.GetBomTable() Set swBOMFeat = swBOMTable.BomFeature --> nun wird der Debugging-Fehler hier gesetzt [Diese Nachricht wurde von julmue am 19. Jul. 2021 editiert.] Edit2: Irgendwie bekommt das Makro die Stückliste nicht zu fassen, weshalb ich den Ansatz nun komplett geändert habe und die Stückliste nun erstellen lasse über den Code hier: Code: ' Insert BOM table AnchorType = swBOMConfigurationAnchor_BottomRight BomType = swBomType_TopLevelOnly TableTemplate = "C:\HST_PDM\Systemdaten\SWX_Vorlagen\Dokumentvorlagen\Stückliste Artikelnummer.sldbomtbt" Configuration = strNextConfig Set swBOMTable = swView.InsertBomTable4(False, 0, 0, AnchorType, BomType, Configuration, TableTemplate, False, swNumberingType_Flat, False) Set swBOMFeat = swBOMTable.BomFeature
Nun muss nur immer die alte Stückliste igendwie entfernt werden, da es mir hier natürlich immer eine neue erstellt. Gibt's da was schönes a la .Delete? [Diese Nachricht wurde von julmue am 19. Jul. 2021 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
julmue Mitglied
Beiträge: 14 Registriert: 24.05.2019 SWX: Professional 2020 SP5.0 PDM: 28.5 CPU: Intel(R) Xeon(R) W-11955M @ 2.6 GHz Ram: 64GB GPU: NVidia RTX A5000 16GB
|
erstellt am: 19. Jul. 2021 13:30 <-- editieren / zitieren --> Unities abgeben:
hab's über .EditDelete gelöst bekommen. Nun klappt das ganze zwar noch nicht über den Taskplaner, da er hier das Modell noch nicht bekommt, aber manuell über die Zeichnung gestartet funktioniert das super! Danke erstmal für die Tipps! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
julmue Mitglied
Beiträge: 14 Registriert: 24.05.2019 SWX: Professional 2020 SP5.0 PDM: 28.5 CPU: Intel(R) Xeon(R) W-11955M @ 2.6 GHz Ram: 64GB GPU: NVidia RTX A5000 16GB
|
erstellt am: 18. Jan. 2022 08:11 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, die Arbeit an dem Makro geht in die nächste Runde. Das ganze hat bisher schon zu einer ganz schönen Effizienzsteigerung geführt. Hierfür möchte ich mich nochmals bedanken! Was mir nun noch sehr weiterhelfen würde ist eine Ausgabe auf der Zeichnung in einem Textfeld o.ä. (NoPrint-Layer oder außerhalb des Druckbereichs) in dem die Anzahl der automatisch erzeugten BomBalloons steht. Diese könnte ich dann mit der Anzahl der Stücklisten Positionen bzw. der letzten Position vergleichen und so schneller festellen, ob alle Teile erfasst sind. Meistens sind die Stücklistensymbole für alle Teile erzeugt worden, jedoch leider nicht immer. Das manuelle durchzählen hat hier natürlich auch so seine Fehlerquellen. Die Balloons selbst werden auf diese Art erstellt und angepasst: VBA-Code 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: 3256 Registriert: 04.04.2001 CSWP 12/2015<P>SWX2021sp5 Win10/11 (SWX2016, SWX2012) proAlpha6.2e00/calinkV9 (Tactonworks) (Medusa7, NesCAD2010, solidEdge19)
|
erstellt am: 18. Jan. 2022 18:33 <-- editieren / zitieren --> Unities abgeben: Nur für julmue
|
julmue Mitglied
Beiträge: 14 Registriert: 24.05.2019 SWX: Professional 2020 SP5.0 PDM: 28.5 CPU: Intel(R) Xeon(R) W-11955M @ 2.6 GHz Ram: 64GB GPU: NVidia RTX A5000 16GB
|
erstellt am: 19. Jan. 2022 07:24 <-- editieren / zitieren --> Unities abgeben:
Hallo Christian, danke für deine Antwort. Das Prinzip wäre schon richtig, allerdings suche ich nicht nach der Stückliste sondern nach den BomBalloons (Stücklisten symbolen), welche automatisch erzeugt werden. Würden diese in meinem Skript in einer Schleife erzeugt, wäre das die Lösung. Allerdings werden sie mit dem Befehlt autoBalloons erzeugt und von dem Befehl finde ich keine Eigenschaft, welche die Anzahl der Balloons trägt. Quasi ein: Anzahl = swModelExt.autoBalloons.quantity o.ä. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
riesi Mitglied CAD-Admin
Beiträge: 1087 Registriert: 06.05.2002 SWX Premium 2023-Sp5
|
erstellt am: 19. Jan. 2022 08:57 <-- editieren / zitieren --> Unities abgeben: Nur für julmue
|
Christian_W Ehrenmitglied V.I.P. h.c. Konstrukteur (Dipl-Ing)
Beiträge: 3256 Registriert: 04.04.2001 CSWP 12/2015<P>SWX2021sp5 Win10/11 (SWX2016, SWX2012) proAlpha6.2e00/calinkV9 (Tactonworks) (Medusa7, NesCAD2010, solidEdge19)
|
erstellt am: 19. Jan. 2022 09:15 <-- editieren / zitieren --> Unities abgeben: Nur für julmue
Zitat: Original erstellt von julmue: ... nicht nach der Stückliste sondern nach den BomBalloons (Stücklistensymbolen), welche automatisch erzeugt werden. ...
Ah, ich war noch bei der ursprünglichen Aufgabenstellung von Hand kann man in der Stückliste sehen, ob zu einer Zeile ein Symbol existiert - wenn ich nicht irre. Aber per vba weiß ich jetzt nicht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
julmue Mitglied
Beiträge: 14 Registriert: 24.05.2019 SWX: Professional 2020 SP5.0 PDM: 28.5 CPU: Intel(R) Xeon(R) W-11955M @ 2.6 GHz Ram: 64GB GPU: NVidia RTX A5000 16GB
|
erstellt am: 19. Jan. 2022 11:28 <-- editieren / zitieren --> Unities abgeben:
|