| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS |
| |
| 3DEXPERIENCE Conference, eine Veranstaltung am 16.10.2024
|
Autor
|
Thema: Verknüpfungen automatisch sortieren (API) (1422 / mal gelesen)
|
F-Schmidt87 Mitglied Konstrukteur
Beiträge: 13 Registriert: 29.08.2016
|
erstellt am: 30. Aug. 2016 06:31 <-- editieren / zitieren --> Unities abgeben:
Sehr geehrte CAD-Gemeinde, da ich schon sehr lange vorzugsweise hier nach Lösungen suche und eigentlich immer eine passende gefunden habe, wende ich mich nun auch mal mit einem Problem an euch: Ich möchte mit analog zum Featurebaum, auch die Verknüpfungen alphabetisch sortieren. Das Grundgerüst in Form eines Arrays steht schon und funktioniert auch soweit gut. Lediglich mit folgendem Code habe ich Probleme: Code: For i = UBound(sArray) - 1 To 0 Step -1 Boolstatus = swAssyDoc.ReorderFeature(sArray(i), sArray(i + 1), SwConst.swMoveLocation_e.swReorderComponents_Before) Next i
Ich habe die Befürchtung, dass "SwConst.swMoveLocation_e" laut API erst ab SW2015 ansprechbar ist. Ich arbeite leider mit Version 2014. Wenn ich das ganze händisch durchführe und ein paar Verknüpfungen hoch, bzw. runter schiebe und dieses mit dem Makrorekorder aufzeichne erscheint dieser Code: Code: Dim swApp As ObjectDim Part As Object Dim boolstatus As Boolean Dim longstatus As Long, longwarnings As Long Sub main() Set swApp = _ Application.SldWorks Set Part = swApp.ActiveDoc Dim myModelView As Object Set myModelView = Part.ActiveView myModelView.FrameState = swWindowState_e.swWindowMaximized boolstatus = Part.Extension.SelectByID2("Abstand43", "MATE", 0, 0, 0, False, 0, Nothing, 0) boolstatus = Part.ReorderFeature("Abstand43", "Verknüpfungen") boolstatus = Part.Extension.SelectByID2("Abstand61", "MATE", 0, 0, 0, False, 0, Nothing, 0) boolstatus = Part.ReorderFeature("Abstand61", "Abstand43") End Sub
Also habe ich versucht, da ich ja die Namen der einzelnen Verknüpfungen im Array habe, diesen Code in die For-Schleife einzubauen. Leider steigt er mir auch da aus. Man muss dazu sagen, dass ich die Anwendungen generell in Visual Studio programmiere. Über eine rege Beteiligung, oder noch besser eine Lösung würde ich mich sehr freuen und den gesamten Quellcode natürlich gerne zur Verfügung stellen! Freundliche Grüße und einen schönen Tag!!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nahe Ehrenmitglied
Beiträge: 1764 Registriert: 18.01.2001 arbeite mit: Dell Precision 7750 i7 2,6 GHz 6 Kerne 32GB RAM 512GB SSD NVIDIA Quadro RTX 4000 ------------------------ SWX-2020 SP5.0 EPDM ---------------- Windows 10 ---------------- VB.net VB VBA ein wenig Swift am Mac
|
erstellt am: 30. Aug. 2016 07:37 <-- editieren / zitieren --> Unities abgeben: Nur für F-Schmidt87
Hallo F-Schmidt87, was mir auffällt ist, dass in dem aufgezeichneten Makro scheinbar auf ein Part verwiesen wird und in Deinem Makro verweist Du scheinbar auf eine Baugruppe. Wenn Du mal die API 2014 Hilfe bemühst und dort nach "ReorderFeature" suchst, gibt es zwar den Befehl "ReorderFeature" aber nicht mit einer Option siehe Bild anbei Die Option kann scheinbar nur angegeben werden wenn Komponenten verschoben werden. (siehe Hilfe unter "ReorderComponents") Was aber wieder was anderes ist, als Du möchtest. Ich hab das jetzt nicht live probiert das ist nur das was mir aufgefallen ist. ------------------ Grüße Heinz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
F-Schmidt87 Mitglied Konstrukteur
Beiträge: 13 Registriert: 29.08.2016
|
erstellt am: 30. Aug. 2016 07:56 <-- editieren / zitieren --> Unities abgeben:
Hallo nahe, erst mal vielen Dank für die schnelle Antwort und ja! Ich habe eine Baugruppe geöffnet. Die Bedingungen waren die gleichen, sowohl bei VB.NET (Visual Studio) und SolidWorks VBA, jeweils die gleiche Baugruppe geöffnet. Ich habe mich auch gewundert, warum er die Baugruppe vermeintlich als Teil behandelt. Die Option habe ich auch mal weg gelassen und ausprobiert, aber auch da bekomme ich einen Fehler. ReorderComponents habe ich für Featurebaum Sortierung bereits verwenden, dieses funktioniert wunderbar! Gruß Felix Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nahe Ehrenmitglied
Beiträge: 1764 Registriert: 18.01.2001 arbeite mit: Dell Precision 7750 i7 2,6 GHz 6 Kerne 32GB RAM 512GB SSD NVIDIA Quadro RTX 4000 ------------------------ SWX-2020 SP5.0 EPDM ---------------- Windows 10 ---------------- VB.net VB VBA ein wenig Swift am Mac
|
erstellt am: 30. Aug. 2016 08:07 <-- editieren / zitieren --> Unities abgeben: Nur für F-Schmidt87
Hallo Felix, hast Du "swAssyDoc" als Object oder "AssemblyDoc" deklariert? Wenn als AssemblyDoc, dann versuch mal das als Object zu deklarieren. Weil es in der Hilfe so aussieht, als gäbe es die Methode "ReorderFeature" nicht bei Baugruppen. Bekommst Du eine Fehlermeldung oder funktioniert es einfach nicht? PS vielleicht solltest Du doch mal das komplette Makro posten ------------------ Grüße Heinz [Diese Nachricht wurde von nahe am 30. Aug. 2016 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
F-Schmidt87 Mitglied Konstrukteur
Beiträge: 13 Registriert: 29.08.2016
|
erstellt am: 30. Aug. 2016 08:21 <-- editieren / zitieren --> Unities abgeben:
Hallo Heinz, swAssyDoc habe ich als AssemblyDoc deklariert, Das mit Object habe ich auch mal versucht, dann erhalte ich den Fehler (siehe Anhang) Anbei der komplette Code. (Ist noch nicht ganz aufgeräumt, ich bitte dieses zu entschuldigen ;-) Code: Dim Components As Object Dim modelDoc2 As ModelDoc2 Dim modelDocExt As ModelDocExtension Dim oPart As Object Dim AssyDoc As Object oPart = swApp.ActiveDoc countDel = 0 Try swApp = CreateObject("SldWorks.Application") Catch ex As Exception lbl_msgbox.Text = ex.Message End Try swModel = swApp.ActiveDoc modelDoc2 = swApp.ActiveDoc If swModel Is Nothing Then ' wenn kein Dokument geöffnet ist wieder raus lbl_msgbox.ForeColor = Color.Red lbl_msgbox.Text = "Kein Dokument geöffnet" Exit Sub End If 'swAssyDoc = swModel AssyDoc = swModel 'Abfrage ob wirklich sortiert werden soll lbl_msgbox.ForeColor = Color.Black lbl_msgbox.Text = "Unnötige Verknüpfungen werden gelöscht..." swAssembly = swModel swSelMgr = swModel.SelectionManager swModelDocExt = swModel.Extension Components = swAssembly.GetComponents(False) i = 0 ReDim sArray(i) ReDim iArray(i) For Each SingleComponent In Components vConfNameArrs = swModel.GetConfigurationNames activeconfig = swModel.ConfigurationManager.ActiveConfiguration.Name For Each vConfNameArr In vConfNameArrs swModel.ShowConfiguration(vConfNameArr) Next swModel.ShowConfiguration(activeconfig) swComp = SingleComponent Debug.Print("Name of component: " & swComp.Name2) Mates = swComp.GetMates() If Mates Is Nothing = False Then For Each SingleMate In Mates If TypeOf SingleMate Is SldWorks.Mate2 Then featureName = SingleMate.Name ReDim Preserve sArray(i) ReDim Preserve iArray(i) sArray(i) = featureName iArray(i) = i i = i + 1 End If Next End If Next 'Den String-Array auf doppelte Werte überprüfen und diese löschen Debug.Print(UBound(sArray)) Dim Liste As New ArrayList Liste.AddRange(sArray) Dim Test As New ArrayList For Each a As String In Liste If Not Test.Contains(a) Then Test.Add(a) End If Next ReDim sArray(Test.Count - 1) sArray = CType(Test.ToArray(GetType(String)), String()) Debug.Print(UBound(sArray)) ' Die Arrays sortieren For x = 0 To UBound(sArray) - 1 For y = (x + 1) To UBound(sArray) If sArray(x) > sArray(y) Then 'Dateiname mit Dateinamen vergleichen sTemp = sArray(x) 'Dateiname in Speicher schreiben 'iTemp = iArray(x) 'Zähler in Speicher schreiben sArray(x) = sArray(y) 'Gleichsetzen der Dateiname 'iArray(x) = iArray(y) 'Gleichsetzen der Zähler sArray(y) = sTemp 'Dateiname aus Speicher zurückführen 'iArray(y) = iTemp 'Zähler aus Speicher zurückführen End If Next y Next x For i = UBound(sArray) - 1 To 0 Step -1 'Boolstatus = swAssyDoc.ReorderFeature(sArray(i), sArray(i + 1), SwConst.swMoveLocation_e.swReorderComponents_Before) Boolstatus = AssyDoc.ReorderFeature(sArray(i), sArray(i + 1)) Next i
lbl_msgbox.ForeColor = Color.Green lbl_msgbox.Text = "Es wurden " & countDel & " Verknüpfungen gelöscht" & vbCrLf _ & "Diese wurden nicht mehr benötigt" End Sub
Gruß Felix Ich habe in Visual Studio globale Variablen deklariert, diese tauchen logischerweise hier nicht auf. anbei die wichtigsten für SldWorks: Code: 'Solidworks Variablen Public swAllDocs As SldWorks.EnumDocuments2 Public swDrw As SldWorks.DrawingDoc Public swAnn As SldWorks.IAnnotation Public swApp As SldWorks.SldWorks Public swAssembly As SldWorks.AssemblyDoc Public swAssyDoc As SldWorks.AssemblyDoc Public swBody As SldWorks.Body2 Public swChildComp As SldWorks.Component2 Public swChildModel As SldWorks.ModelDoc2 Public swComp As SldWorks.Component2 Public swConfig As SldWorks.Configuration Public swConfMgr As SldWorks.ConfigurationManager Public swCustPropMgr As SldWorks.CustomPropertyManager Public swDwgDoc As SldWorks.ModelDoc2 Public swFeat As SldWorks.Feature Public swFirstDoc As SldWorks.ModelDoc2 Public swMate As SldWorks.Mate2 Public swModel As SldWorks.ModelDoc2 Public swModelDocExt As SldWorks.ModelDocExtension Public swOpenModel As SldWorks.ModelDoc2 Public swpart As SldWorks.PartDoc Public swRootComp As SldWorks.Component2 Public swSelData As SldWorks.SelectData Public swSelMgr As SldWorks.SelectionMgr Public swsheetmetal As SldWorks.SheetMetalFeatureData Public swMathUtil As SldWorks.MathUtility Public swMathPoint As SldWorks.MathPoint
[Diese Nachricht wurde von F-Schmidt87 am 30. Aug. 2016 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nahe Ehrenmitglied
Beiträge: 1764 Registriert: 18.01.2001 arbeite mit: Dell Precision 7750 i7 2,6 GHz 6 Kerne 32GB RAM 512GB SSD NVIDIA Quadro RTX 4000 ------------------------ SWX-2020 SP5.0 EPDM ---------------- Windows 10 ---------------- VB.net VB VBA ein wenig Swift am Mac
|
erstellt am: 30. Aug. 2016 09:00 <-- editieren / zitieren --> Unities abgeben: Nur für F-Schmidt87
|
F-Schmidt87 Mitglied Konstrukteur
Beiträge: 13 Registriert: 29.08.2016
|
erstellt am: 30. Aug. 2016 09:09 <-- editieren / zitieren --> Unities abgeben:
Hallo Heinz, kein Thema, ich habe auch feststellen müssen, dass es eher selten Code-Schnipsel für VB.NET o.Ä. gibt. Wenn ich eine funktionierende Lösung für das gängige SolidWorks habe, könnte ich mir das entsprechend umschreiben. (Zumindest erhoffe ich mir das) Aber vielleicht hat ja sonst noch jemand eine Idee. Freundliche Grüße Felix Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nahe Ehrenmitglied
Beiträge: 1764 Registriert: 18.01.2001 arbeite mit: Dell Precision 7750 i7 2,6 GHz 6 Kerne 32GB RAM 512GB SSD NVIDIA Quadro RTX 4000 ------------------------ SWX-2020 SP5.0 EPDM ---------------- Windows 10 ---------------- VB.net VB VBA ein wenig Swift am Mac
|
erstellt am: 30. Aug. 2016 10:42 <-- editieren / zitieren --> Unities abgeben: Nur für F-Schmidt87
oder Du versuchst das ganze Visual Studio Projekt zu zippen und hochzuladen vielleicht kann man es dann einfacher öffnen. Mit welcher Visual Studio Version ist das erstellt?
------------------ Grüße Heinz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
F-Schmidt87 Mitglied Konstrukteur
Beiträge: 13 Registriert: 29.08.2016
|
erstellt am: 30. Aug. 2016 10:45 <-- editieren / zitieren --> Unities abgeben:
Hallo Heinz, das ist in der aktuellen Version noch nicht machbar, da dort mehrere Aktionen mit ausgeführt werden können und ich diese aktuell noch am bearbeiten, bzw. aufräumen bin. Später wenn es alles fertig ist, kann ich es gerne bei bedarf mal zur Verfügung stellen!!! Erstellt habe ich das ganze mit Visual Studio 2015. Gruß Felix Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bk.sc Ehrenmitglied V.I.P. h.c. Konstrukteur Sondermaschinenbau
Beiträge: 2795 Registriert: 18.07.2012 -Solid Works 2019 SP5 -Pro Engineer WF 3
|
erstellt am: 30. Aug. 2016 15:19 <-- editieren / zitieren --> Unities abgeben: Nur für F-Schmidt87
Hallo Felix, hast du mal versucht das Object als ModelDocExtension zu deklarieren und nicht als AssemblyDoc oder ModelDoc2, weil mit der ReorderFeature Method (IModelDocExtension) funktioniert es bei mir? Wenn ich oben in deinem aufgenommenen das Verschieben auf
Code: boolstatus = Part.Extension.ReorderFeature("Abstand43", "Abstand61", swMoveBefore)
ändere klappt es auch 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 |
F-Schmidt87 Mitglied Konstrukteur
Beiträge: 13 Registriert: 29.08.2016
|
erstellt am: 31. Aug. 2016 06:32 <-- editieren / zitieren --> Unities abgeben:
Hallo Bernd, vielen Dank für deinen Ansatz!!! Hast du es direkt in SolidWorks programmiert oder auch über VB.NET (Visual Studio) versucht? Ich haben den Code jetzt auf folgende Weise in Visual Studio ausprobiert, allerdings ohne Erfolg Code: Dim Part As SldWorks.ModelDocExtension swModel = swApp.ActiveDoc Part = swModel.Extension For i = UBound(sArray) - 1 To 0 Step -1 Boolstatus = Part.reorderfeature(sArray(i), sArray(i + 1)) Next i
Auch die direkte Schreibweise von dir Code:
"boolstatus = Part.Extension.ReorderFeature("Abstand43", "Abstand61", swMoveBefore)"
habe ich mal versucht, auch leider ohne Erfolg. Er bietet mir im IntelliSense nach "Part.Extension." das "ReorderFeature" schon gar nicht an. Habe ich noch einen entscheidenden Ansatz vergessen? Ich habe leider keine Idee... Gruß Felix Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bk.sc Ehrenmitglied V.I.P. h.c. Konstrukteur Sondermaschinenbau
Beiträge: 2795 Registriert: 18.07.2012 -Solid Works 2019 SP5 -Pro Engineer WF 3
|
erstellt am: 31. Aug. 2016 08:22 <-- editieren / zitieren --> Unities abgeben: Nur für F-Schmidt87
Hallo Felix, hab es direkt im VBA Editor programmiert. Bei der Verwendung von Part.Extension kann Visual Studio das ja garnicht anbieten, er kann es ja nur anbieten wenn das Object direkt davor steht und nicht wenn du das Object erst direkt davor erzeugst. Hab gerade in der API Hilfe gesehen das die Methode erst in SWX 2015 hinzu gekommen ist, daher wird das mit der 2014 theoretisch noch nicht gehen, hab jetzt auch keine Idee wie das mit der 2014 gehen könnte da es mit dem PartDoc Object nicht gehen wird da es ja eine Baugruppe ist. 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 |
F-Schmidt87 Mitglied Konstrukteur
Beiträge: 13 Registriert: 29.08.2016
|
erstellt am: 31. Aug. 2016 09:14 <-- editieren / zitieren --> Unities abgeben:
Hallo Bernd, Ich denke auch, dass ich hinter die Sache wohl leider einen Haken machen muss. Mir fällt in der Hinsicht bei SW2014 nämlich auch nichts passendes mehr ein. Vielleicht bestünde ja noch die Möglichkeit, die Verknüpfungen in den einzelnen Parts rekursiv zu sortieren, allerndings weiß ich nicht, ob sich das dann so auch in die Baugruppe überträgt. Außerdem würde der Prozess unnötig aufgeblasen. Gruß Felix Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |