| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS | | | | PLM TechnologieForum Bamberg |
Autor
|
Thema: VBA-Makro zum Ändern von Schraffur und Komponentenlinien in der Zeichnung (799 mal gelesen)
|
Micha1985 Mitglied Technischer Zeichner
Beiträge: 24 Registriert: 30.06.2021 Intel(R) XEON(R) CPU E5-1620v4 @ 3.49Ghz 32 GB RAM 64-Bit Windows 10 SolidWorks 2018/SP5.0 proALPHA6.2e00 / CA-Link V9.0
|
erstellt am: 26. Jul. 2021 08:18 <-- editieren / zitieren --> Unities abgeben:
Hallo Leute! Ich steh wieder mal Makro-technisch etwas auf dem Schlauch, vielleicht kann mir ja einer von euch da runter helfen... Ich möchte ein Makro erstellen dass meinen Kollegen und mir einige Arbeitsschritte abnehmen soll, die bei praktisch jeder unserer Hauptzeichnungen gemacht werden müssen. Ausgangssituation ist so: -Eine Zeichnung mit mind. 3 Ansichten ist geöffnet. -Ansicht 1: Baugruppe, Konfiguration A -Ansicht 2: Baugruppe, Konfiguration B -Ansicht 3: Einzelteil, das in der Baugruppe verwendet wird Das Makro soll jetzt folgendes tun: -In Ansicht 1 und 2 soll bei einem bestimmten Einzelteil der Baugruppe die Schraffur entfernt und die Komponentenlinien (sichtbare Kanten) auf "Phantom, dünn" gestellt werden. -Auch in Ansicht 1/2 soll bei einem Einzelteil in einer Unterbaugruppe dasselbe passieren. -Immer noch in Ansicht 1/2 möchte ich bei 2 Einzelteilen einer anderen Unterbaugruppe die Schraffur auf "gestrichelte Linien", Maßstab 3 ändern. -In Ansicht 3 soll nur die Schraffur des Teils entfernt werden. Meine beiden Hauptprobleme daran sind: Erstens, wie ich die Komponenten am besten ansteuere. Über den Dateinamen/Teilenummer geht es leider nicht. Das einzige eindeutige Erkennungsmerkmal sitzt in den konfigurationsspezifischen Eigenschaften des jeweiligen Teils, aber ich weiß nicht wie ich von der Zeichnung aus am einfachsten dorthin gelange. Zweitens, wie kann ich Schraffur und Komponentenlinien überhaupt ansteuern und ändern? Im I-Net hab ich nichts brauchbares dazu gefunden, zumindest nicht für die Zeichnung. Und die Makro-aufzeichnen-Funktion von Solid war wie fast immer auch nicht besonders hilfreich... Hoffentlich kann mir jemand von euch ein paar Fingerzeige geben... bin halt noch blutiger Anfänger 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: 26. Jul. 2021 14:13 <-- editieren / zitieren --> Unities abgeben: Nur für Micha1985
Hallo Micha, mit "ReferencedDocument Property (IView)" hiermit kommst du an das Dokument dass zu einer Ansicht gehört (ModelDoc2 Objekt), die Bauruppe die in diesm Object steckt müsstest du auf Komponentenlevel Travesieren Beispeil dazu wäre "Traverse Assembly at Component and Feature Levels Using Recursion Example (VBA)", hier kommst du dann an die einzelnen Componenten ran (Component2 Objekt) zu diesen Objekten kannst du dir dann das ModelDoc2 Objekt holen und auch gleich die verwendete Konfiguration, mit dem ModelDoc2 und Namen der Konfiguration kannst du die genwünschte Eigenschaft mit "CustomInfo2 Property (IModelDoc2)" auslesen. Zum Thema Schraffur solltest du dir mal "Get Face Hatch Data Example (VBA)" anschauen und zum Ausschließen einer Komponente musst du glaube ich über "ExcludeSliceSectionBodies Property (IDrSection)" gehen. Als Anfänger hast du dir da aber eine ordentlich schwere Aufgabe aufgehalst. 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 |
Micha1985 Mitglied Technischer Zeichner
Beiträge: 24 Registriert: 30.06.2021 Intel(R) XEON(R) CPU E5-1620v4 @ 3.49Ghz 32 GB RAM 64-Bit Windows 10 SolidWorks 2018/SP5.0 proALPHA6.2e00 / CA-Link V9.0
|
erstellt am: 27. Jul. 2021 08:49 <-- editieren / zitieren --> Unities abgeben:
Hi Bernd, das ist schon mal ein Schritt in die richtige Richtung, dankeschön! Ja das Makro hat sich als komplizierter rausgestellt als ich ursprünglich gedacht hatte... hab schon ein paar kleinere nützliche Makros erstellt aber das hier ist schon eine ziemliche Hausnummer. Muss man als Herausforderung sehen Also das Traversieren der Komponenten mit "Traverse Assembly at Component..." scheint nur in Baugruppenmodellen zu funktionieren, nicht in der Zeichnung. Hab ich in nem anderen Makro tatsächlich schon in angepasster Form verwendet, aber da ging's auch um eine Baugruppe und nicht um die Zeichnung. Bei Zeichnungen scheint in Solid-VBA ja alles etwas komplizierter zu sein... Der Tip mit dem "Get Face Hatch Data..." war super, damit lässt sich einiges anfangen!
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: 27. Jul. 2021 13:08 <-- editieren / zitieren --> Unities abgeben: Nur für Micha1985
Hallo Micha, natürlich kannst du auch aus der Zeichnung bzw. aus einer Ansicht heraus die zugrunde liegende Baugruppe travesieren. -Ansicht holen z.B. über GetFirstView / GetNextView oder Selektion -Zur Ansicht referenziertes Dokument (ModelDoc2) holen mit ReferencedDocument(IView) -Auf dieses ModelDoc2 Object (das referenzierte Dokument) musst du die Traversierung loslassen nicht auf das ModelDoc2 das zur Zeichnung gehört Code: Sub TraverseComponent(swComp As SldWorks.Component2, nLevel As Long) Dim vChildComp As Variant Dim swChildComp As SldWorks.Component2 Dim sPadStr As String Dim i As Long For i = 0 To nLevel - 1 sPadStr = sPadStr + " " Next i vChildComp = swComp.GetChildren For i = 0 To UBound(vChildComp) Set swChildComp = vChildComp(i) Debug.Print sPadStr & "+" & swChildComp.Name2 & " <" & swChildComp.ReferencedConfiguration & ">" TraverseComponent swChildComp, nLevel + 1 Next i End Sub Sub main() Dim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim swDrawModel As SldWorks.ModelDoc2 'neue Variable hinzugefügt Dim swConfMgr As SldWorks.ConfigurationManager Dim swConf As SldWorks.Configuration Dim swRootComp As SldWorks.Component2 Dim swView As SldWorks.View Set swApp = CreateObject("SldWorks.Application") Set swDrawModel = swApp.ActiveDoc 'geändert von swModel auf swDrawModel Set swSelMgr = swDrawModel.SelectionManager 'neue Zeile wegen der Selektion der Ansicht Set swView = swSelMgr.GetSelectedObject6(1, -1) 'neue Zeile wegen der Selektion der Ansicht Set swModel = swView.ReferencedDocument 'neue Zeile um an das ModelDoc zum Referenzierten Model zu kommen Set swConfMgr = swModel.ConfigurationManager Set swConf = swConfMgr.ActiveConfiguration Set swRootComp = swConf.GetRootComponent3(True) Debug.Print "File = " & swModel.GetPathName If swModel.GetType = SwConst.swDocASSEMBLY Then TraverseComponent swRootComp, 1 End If End Sub
Hier ein einfaches Beispiel, für das anwenden des Beipieles musst du nur eine Ansicht die eine Baugruppe enthält vorher markieren. Hab hierzu in dem Ursprungsmakro aus der API-Hilfe nur 4 Zeilen eingefügt und eine geändert (siehe Kommentare), das FeatureLevel hab ich auch raus, weil für dich eh uninteressant. 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 |
Micha1985 Mitglied Technischer Zeichner
Beiträge: 24 Registriert: 30.06.2021 Intel(R) XEON(R) CPU E5-1620v4 @ 3.49Ghz 32 GB RAM 64-Bit Windows 10 SolidWorks 2018/SP5.0 proALPHA6.2e00 / CA-Link V9.0
|
erstellt am: 27. Jul. 2021 15:47 <-- editieren / zitieren --> Unities abgeben:
Hi Bernd, danke, das war echt hilfreich! Auf den Gedanken eine zweite ModelDoc2-Variable für die Komponente zu erstellen bin ich wieder nicht gekommen Ich hab deinen Code für meine Bedürfnisse umgebaut und es funktioniert prima, die Komponenten werden ausgelesen und ich kann die ausfiltern, die ich bearbeiten will! Wenn ich jetzt allerdings z.B. von einer dieser Komponenten die Linienart und -stärke ändern will, dann geht das nicht weil swChildComp als Component2 deklariert ist, und nicht als ModelDoc2. Und wenn ich versuch das ganze in eine neue Variable zu verpacken: Code: Dim swChildModel as sldworks.modeldoc2 Set swChildModel = swChildComp.GetModelDoc2
Dann kommt bei der zweiten Zeile die "Typen unverträglich"-Meldung... Beste Grüße, Micha 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: 27. Jul. 2021 17:27 <-- editieren / zitieren --> Unities abgeben: Nur für Micha1985
Hallo Micha, ohne Kontext ist hier eine Fehlersuche schwierig, theoretisch müsstest das so gehen, bei mir geht es zumindest. 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 |
Micha1985 Mitglied Technischer Zeichner
Beiträge: 24 Registriert: 30.06.2021 Intel(R) XEON(R) CPU E5-1620v4 @ 3.49Ghz 32 GB RAM 64-Bit Windows 10 SolidWorks 2018/SP5.0 proALPHA6.2e00 / CA-Link V9.0
|
erstellt am: 28. Jul. 2021 06:30 <-- editieren / zitieren --> Unities abgeben:
Hi Bernd, hier hab ich mal das komplette Ding, wie es momentan aussieht: Code: Option ExplicitDim swApp As SldWorks.SldWorks Dim Part As SldWorks.ModelDoc2 Dim Ansicht As SldWorks.View Dim Fehler As Long Dim Warnung As Long Dim boolstatus As Boolean Dim i As Long Dim EigenschMgr As SldWorks.CustomPropertyManager Dim Eigenschaft As Integer Dim EigenschNamen As Variant Dim EigenschName As Variant Dim EigenschTypen As Variant Dim EigenschWerte As String Dim EigenschWert As String Dim EigenschErgebnis As String Dim ZeiPart As SldWorks.ModelDoc2 Dim ZeiNr As String Dim KonfMgr As SldWorks.ConfigurationManager Dim Konf As SldWorks.Configuration Dim Komponente As SldWorks.Component2 Dim Kinder As Variant Dim KindKomp As SldWorks.Component2 Dim KindPart As SldWorks.DrawingComponent Dim Spanner As Boolean Dim Gewindelinien As Variant Dim Schraffuren As Variant Dim Schraffur As SldWorks.FaceHatch Sub main() Spanner = False Set swApp = Application.SldWorks Set Part = swApp.ActiveDoc 'Prüft, ob eine Zeichnung geöffnet ist. If Part Is Nothing Then NichtsOffen.Show NichtsOffen.Repaint End End If If Part.GetType <> swDocDRAWING Then ModellOffen.Show ModellOffen.Repaint End End If 'On Error GoTo Fehler 'Wenn eine Zeichnung geöffnet sein sollte, prüfen ob es eine Spannerzeichnung ist. Set EigenschMgr = Part.Extension.CustomPropertyManager("") Eigenschaft = EigenschMgr.GetAll2(EigenschNamen, EigenschTypen, EigenschWerte, EigenschErgebnis) If IsEmpty(EigenschNamen) Then boolstatus = Part.Save3(swSaveAsOptions_e.swSaveAsOptions_UpdateInactiveViews, Fehler, Warnung) 'Falls Dateieigenschaften leer sind, erst speichern End If For Each EigenschName In EigenschNamen If EigenschName Like "*Benennung1*" Then boolstatus = EigenschMgr.Get5(EigenschName, True, EigenschWert, EigenschWerte, True) If EigenschWert Like "*EINBAUSPANNER*" Or EigenschWert Like "*Einbauspanner*" Then Spanner = True Exit For End If End If Next EigenschName 'Hier geht der eigentliche Teil los. If Spanner = True Then 'Erster Schritt: Gewindelinien einblenden Gewindelinien = Part.InsertModelAnnotations3(0, 1, True, True, False, False) Part.EditSheet Set Ansicht = Part.GetFirstView Set Ansicht = Ansicht.GetNextView 'FirstView ist das Blattformat. Do While Not Ansicht Is Nothing 'Arbeitet sich durch alle Ansichten. 'Erst abgebildetes Teil prüfen: Set ZeiPart = Ansicht.ReferencedDocument ZeiNr = ZeiPart.GetPathName If ZeiNr Like "*S.sldprt" Then 'Ansicht der Spindelkontur erkannt Schraffuren = Ansicht.GetFaceHatches If Not IsEmpty(Schraffuren) Then For i = 0 To UBound(Schraffuren) Set Schraffur = Schraffuren(i) Schraffur.UseMaterialHatch = True 'Umstellung auf Materialschraffur, d.h. keine Next i End If Else 'Restliche Ansichten, d.h. Spanner Set KonfMgr = ZeiPart.ConfigurationManager Set Konf = KonfMgr.ActiveConfiguration Set Komponente = Konf.GetRootComponent3(True) Kinder = Komponente.GetChildren 'Jetzt wird nach Unterkomponenten sortiert und die jeweiligen Handlungen durchgeführt! For i = 0 To UBound(Kinder) Set KindKomp = Kinder(i) If KindKomp.Name2 Like "*S-*" Or KindKomp.Name2 Like "*T*" Then 'Aktionen für SpiKo und Hilfsteile '------------BAUSTELLE---------------- Set KindPart = KindKomp.GetModelDoc2 KindPart.SetLineStyle swDrawingComponentLineFontVisible, swLinePHANTOM KindPart.SetLineThickness swDrawingComponentLineFontVisible, swLW_CUSTOM, 0.00018 Else 'Hier kommt rein was mit Spannkopf, Spannsatz oder ZmH passiert! End If Next i '------------BAUSTELLE ENDE---------------- End If Set Ansicht = Ansicht.GetNextView Loop End If 'Exit Sub ' 'Fehler: End Sub
Eigentlich funktioniert bis jetzt alles bestens, bis auf den Teil wo BAUSTELLE steht... Bin für Vorschläge und Kritik immer offen 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: 28. Jul. 2021 13:50 <-- editieren / zitieren --> Unities abgeben: Nur für Micha1985
Hallo Micha, du deklarierst "Dim KindPart As SldWorks.DrawingComponent" aber möchtest da ein "ModelDoc2" reinstecken, das geht nicht. Orrientiert dich doch am Beispiel "Get Components in Drawing View Example (VBA)" bezüglich des herankommens an das "DrawingComponent" Object, hier hast du sogar entsprechend eine Schleife drin die dir auch das IComponent Objekt holt mit dem du analog die Eigenschaften etc. auswerten könntest. 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 |
Micha1985 Mitglied Technischer Zeichner
Beiträge: 24 Registriert: 30.06.2021 Intel(R) XEON(R) CPU E5-1620v4 @ 3.49Ghz 32 GB RAM 64-Bit Windows 10 SolidWorks 2018/SP5.0 proALPHA6.2e00 / CA-Link V9.0
|
erstellt am: 28. Jul. 2021 14:56 <-- editieren / zitieren --> Unities abgeben:
Hab es jetzt mal so umgebaut dass es dem Beispiel entspricht, ohne Erfolg: Code: Dim Kinder As Variant Dim KindKomp As Variant Dim KindPart As SldWorks.DrawingComponent Dim KindPart2 As SldWorks.Component2 Dim KindPart3 As SldWorks.ModelDoc2(...) Kinder = Komponente.GetChildren For i = 0 To UBound(Kinder) Set KindKomp = Kinder(i) If KindKomp.Name2 Like "*S-*" Or KindKomp.Name2 Like "*T*" Then '------------BAUSTELLE---------------- Set KindPart = KindKomp Set KindPart2 = KindPart.Component Set KindPart3 = KindPart2.GetModelDoc2 KindPart3.SetLineStyle swDrawingComponentLineFontVisible, swLinePHANTOM KindPart3.SetLineThickness swDrawingComponentLineFontVisible, swLW_CUSTOM, 0.00018 Else End If Next i '------------BAUSTELLE ENDE----------------
Jetzt kommt bei der Zeile "Set KindPart = KindKomp" die "Typen unverträglich"-Meldung. Ich komm mir langsam echt dämlich vor... 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: 29. Jul. 2021 15:29 <-- editieren / zitieren --> Unities abgeben: Nur für Micha1985
Hallo Micha, du kannst nicht einfach ein "Component Object" (das in KindKomp steckt) in ein "DrawingComponent Object" Gewand stecken. Geh doch den Weg andersrum, dass du mit dem "DrawingComponent Object" anfängst und über dieses an das "Component Object" kommst. In dem Beispiel "Get Components in Drawing View Example (VBA)" ist doch eigentlich schon alles drin um von der Ansicht aus an alle einzelnen "DrawingComponent" und "Component" Objecte zu kommen. Evtl. hilft es dir auch erst die einzelnen Aufgabenstellungen einzeln zu bearbeiten bevor du sie in ein gesammtes Macro packst, macht das Debuggen meist einfacher. 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 |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|