| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS |
| |
| PLM TechnologieForum Leipzig |
Autor
|
Thema: SolidWorks VB.net: .GetEdges [Object|Edge]-Konfusion (1779 mal gelesen)
|
GDawg Ehrenmitglied V.I.P. h.c. Teamleiter FEM Simulation
Beiträge: 2622 Registriert: 12.07.2004 SolidWorks_2o2o SP3.o Win10_x64, Quadro_P2ooo. VisualStudio_2o19_Pro. FEM: Forge_NxT_HPC, ANSYS_WB. 3D-Printer: Ultimaker_2, Tinker_Gnome.
|
erstellt am: 13. Okt. 2015 11:28 <-- editieren / zitieren --> Unities abgeben:
Tach zusammen! Ich stehe hier total auf dem Schlauch und hoffe, dass mir jemand weiterhelfen kann. Folgendes habe ich vor: Fläche selektieren, Skizze darauf erstellen, alle Konturen (jawohl, Aussen- und Innenkonturen!) übernehmen, Skizze schliessen. Das alles in VB.net mit Option Strict ON. Folgenden Code habe ich bereits (Dank geht an diesen Beitrag: http://forum.cad.de/foren/ubb/Forum2/HTML/028072.shtml#000002): Code: Option Strict OnImports SolidWorks.Interop.sldworks Imports SolidWorks.Interop.swconst Imports System.Runtime.InteropServices Imports System Partial Class SolidWorksMacro Public Sub main() Dim ModDoc As ModelDoc2 = Nothing Dim swPart As PartDoc = Nothing Dim swDrawing As DrawingDoc = Nothing Dim swAssembly As AssemblyDoc = Nothing Dim boolstatus As Boolean = False Dim longstatus As Integer = 0 Dim longwarnings As Integer = 0 Dim SelMgr As SelectionMgr Dim EdgeCount As Integer Dim Edges() As Edge Dim SelFace As Face2 Dim SelData As SelectData Dim SelectedCount As Integer ModDoc = CType(swApp.ActiveDoc, ModelDoc2) If Not ModDoc Is Nothing Then SelMgr = CType(ModDoc.SelectionManager, SelectionMgr) If SelMgr.GetSelectedObjectCount2(-1) = 1 Then Select Case SelMgr.GetSelectedObjectType3(1, -1) Case swSelectType_e.swSelFACES SelFace = CType(SelMgr.GetSelectedObject6(1, -1), Face2) If Not SelFace Is Nothing Then ModDoc.SketchManager.InsertSketch(True) EdgeCount = SelFace.GetEdgeCount Edges = SelFace.GetEdges ' grrrrrrr ' Edges = CType(SelFace.GetEdges, Edge()) ' grrrr^2 ' Dim Edges as Object()= CType(SelFace.GetEdges, Object()) ' grrrr^37 SelData = SelMgr.CreateSelectData ModDoc.ClearSelection2(True) SelectedCount = SelMgr.AddSelectionListObjects(Edges, SelData) boolstatus = ModDoc.SketchManager.SketchUseEdge2(False) ModDoc.SketchManager.InsertSketch(True) End If End Select End If End If End Sub ''' <summary> ''' The SldWorks swApp variable is pre-assigned for you. ''' </summary> Public swApp As SldWorks End Class
Mein Problem: SolidWorks API ist Sch.....! Diese Zeile bereitet mir Kopfschmerzen: Code: Edges = SelFace.GetEdges
SolidWorks muss, aus welchen Grund auch immer!, alles in Objekte verpacken. Nur, dass sich die Kanten (Edge) nicht aus dem Objekt heraus extrahieren lassen In VBA funktioniert das alles, weil VBA Alles in alle Typen verwandeln kann. Option Strict zu deaktivieren ist keine Option. Was auch immer ich versuchte, SelectedCount ist immer = 0! Nur in VBA nicht Das muss doch irgenwie funktionieren? Vielen Dank für Eure Gedanken und Vorschläge. ------------------
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: 13. Okt. 2015 15:56 <-- editieren / zitieren --> Unities abgeben: Nur für GDawg
Hallo GDawg, gibt dir GetEdges() nicht ein Array aus und du musst das Ergebnis der Funktion entsprechend auch als Variant deklarieren? Bzw. in VB.NET als Object, weil wenn es als Edges-Object deklariert werden sollte würde das auch denke ich so in der API-Hilfe stehen. Gruß Bernd ------------------ --- Man muß nicht alles wissen, man muß nur wissen wo es steht --- Staatlich anerkannte Deutschniete [Diese Nachricht wurde von bk.sc am 13. Okt. 2015 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
GDawg Ehrenmitglied V.I.P. h.c. Teamleiter FEM Simulation
Beiträge: 2622 Registriert: 12.07.2004 SolidWorks_2o2o SP3.o Win10_x64, Quadro_P2ooo. VisualStudio_2o19_Pro. FEM: Forge_NxT_HPC, ANSYS_WB. 3D-Printer: Ultimaker_2, Tinker_Gnome.
|
erstellt am: 14. Okt. 2015 06:22 <-- editieren / zitieren --> Unities abgeben:
Bernd, und genau da liegt das nächste Problem! Wenn ich aus .GetEdges() einen Array als Objekt deklariere, funktioniert der SelectionManager ( SelMgr.AddSelectionListObjects(Edges, SelData)) nicht. Ich habe zwar meine Kanten im Array aber die Funktion AddSelectionListObjects() kommt damit nicht klar. Oder vielleicht schon die Methode CreateSelectData - ich weiss es nicht genau. Definiere ich die Edges() als Edge, dann kann VB.net den Typen nicht umwandeln: Unable to cast object of type 'System.Object[]' to type 'SolidWorks.Interop.sldworks.Edge[]'. Was leider logisch ist Und, ja, GetEdges() ist, laut API-Hilfe, vom Typ Object. Leider hilft mir das nicht weiter. ... Das Beispiel von HenryV funktioniert auch nur unter VBA! ------------------
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: 14. Okt. 2015 06:58 <-- editieren / zitieren --> Unities abgeben: Nur für GDawg
Hallo nochmal, löscht dir ClearSelection2(True) nicht deine komplette Selection wieder? Weil wenn ich Edges als Object deklariere und die ClearSelection auskommentiere übernimmt mir das Macro immerhin schonmal die outlines. 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 |
GDawg Ehrenmitglied V.I.P. h.c. Teamleiter FEM Simulation
Beiträge: 2622 Registriert: 12.07.2004 SolidWorks_2o2o SP3.o Win10_x64, Quadro_P2ooo. VisualStudio_2o19_Pro. FEM: Forge_NxT_HPC, ANSYS_WB. 3D-Printer: Ultimaker_2, Tinker_Gnome.
|
erstellt am: 14. Okt. 2015 07:23 <-- editieren / zitieren --> Unities abgeben:
Bernd, ja das ist so und sollte auch so sein DENNnnnn! Achtung! Jetzt kommt's: Der Kanten-Array sollte sich nun in SelData befinden (ich habe auch eine Weile gebraucht, bis ich das verstanden hatte). Danach sollten die Kanten (nun im Objekt() enthalten) mit der Funktion AddSelectionListObjects() zum SelectionManager hinzugefügt werden. Jetzt wurden, rein theoretisch, alle Kanten selektiert und könnten einfach mit SketchUseEdge übernommen werden. Doch das ist alles sehr theoretisch Was auch immer ich mache, SelectedCount ist immer gleich Null! Die Aussenkontur war nie das Problem. Das funktioniert sehr gut. Ich habe mir die API von SolidWorks 2016 angesehen. Dort gibt es die Funktion SketchUseEdge3 (http://help.solidworks.com/2016/English/api /). Muss ich wirklich noch bis Version 2016 warten? Danke für Deine Bemühungen, Bernd! Gilbert ------------------
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
GDawg Ehrenmitglied V.I.P. h.c. Teamleiter FEM Simulation
Beiträge: 2622 Registriert: 12.07.2004 SolidWorks_2o2o SP3.o Win10_x64, Quadro_P2ooo. VisualStudio_2o19_Pro. FEM: Forge_NxT_HPC, ANSYS_WB. 3D-Printer: Ultimaker_2, Tinker_Gnome.
|
erstellt am: 16. Okt. 2015 11:39 <-- editieren / zitieren --> Unities abgeben:
Ich habe das nun SolidSolutions weitergeleitet. Auch nach einem WebEx konnte der Support nicht sofort eine Lösung liefern oder ein Problem mit dem Code feststellen. Bin ja mal gespannt, wann und ob der Support eine Lösung hat. ------------------
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HenryV Mitglied Konstrukteur, Engineering
Beiträge: 813 Registriert: 18.05.2005 SolidWorks 2022 x64 SP5.0 Dell Precision 5820 Intel Xeon W-2125 4x4GHz NVIDIA Quadro P2000 5GB 32GB RAM 2x Dell U2412M, 24" TFT Windows 10 Enterprise x64 22H2 Microsoft 365 E5 Microsoft Visual Studio Enterprise 2022
|
erstellt am: 19. Okt. 2015 17:32 <-- editieren / zitieren --> Unities abgeben: Nur für GDawg
Hallo Gilu So geht's... Die Kanten (Edges) in einen Array packen und dessen Elemente einzeln in einen Edges-Array kopieren. Code: ... Dim Edges() As SldWorks.Edge = Nothing Dim vEdgeArr As Array = Nothing ... EdgeCount = SelFace.GetEdgeCountvEdgeArr = CType(SelFace.GetEdges, Array) If vEdgeArr.GetUpperBound(0) >= 0 Then ReDim Edges(vEdgeArr.GetUpperBound(0)) For i As Integer = 0 To vEdgeArr.GetUpperBound(0) Edges(i) = CType(vEdgeArr.GetValue(i), SldWorks.Edge) Next i End If SelData = SelMgr.CreateSelectData ...
Gruss Andreas ------------------ 21 ist nur die halbe Antwort. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
GDawg Ehrenmitglied V.I.P. h.c. Teamleiter FEM Simulation
Beiträge: 2622 Registriert: 12.07.2004 SolidWorks_2o2o SP3.o Win10_x64, Quadro_P2ooo. VisualStudio_2o19_Pro. FEM: Forge_NxT_HPC, ANSYS_WB. 3D-Printer: Ultimaker_2, Tinker_Gnome.
|
erstellt am: 20. Okt. 2015 06:47 <-- editieren / zitieren --> Unities abgeben:
|
GDawg Ehrenmitglied V.I.P. h.c. Teamleiter FEM Simulation
Beiträge: 2622 Registriert: 12.07.2004 SolidWorks_2o2o SP3.o Win10_x64, Quadro_P2ooo. VisualStudio_2o19_Pro. FEM: Forge_NxT_HPC, ANSYS_WB. 3D-Printer: Ultimaker_2, Tinker_Gnome.
|
erstellt am: 20. Okt. 2015 06:51 <-- editieren / zitieren --> Unities abgeben:
Hier ist noch der komplette Code (ohne Kommentar), falls den jemand brauchen kann/will: Code:
Option Strict OnImports SolidWorks.Interop.sldworks Imports SolidWorks.Interop.swconst Imports System.Runtime.InteropServices Imports System Partial Class SolidWorksMacro Public Sub main() Dim ModDoc As ModelDoc2 = Nothing Dim swPart As PartDoc = Nothing Dim swDrawing As DrawingDoc = Nothing Dim swAssembly As AssemblyDoc = Nothing Dim boolstatus As Boolean = False Dim longstatus As Integer = 0 Dim longwarnings As Integer = 0 Dim SelMgr As SelectionMgr Dim SelFace As Face2 Dim SelData As SelectData Dim SelectedCount As Integer ModDoc = CType(swApp.ActiveDoc, ModelDoc2) If Not ModDoc Is Nothing Then SelMgr = CType(ModDoc.SelectionManager, SelectionMgr) If SelMgr.GetSelectedObjectCount2(-1) = 1 Then Select Case SelMgr.GetSelectedObjectType3(1, -1) Case swSelectType_e.swSelFACES SelFace = CType(SelMgr.GetSelectedObject6(1, -1), Face2) If Not SelFace Is Nothing Then ModDoc.SketchManager.InsertSketch(True) Dim Edges() As Edge = Nothing Dim EdgeCount As Integer = SelFace.GetEdgeCount Dim vEdgeArr As Array = CType(SelFace.GetEdges, Array) If vEdgeArr.GetUpperBound(0) >= 0 Then ReDim Edges(vEdgeArr.GetUpperBound(0)) For i As Integer = 0 To vEdgeArr.GetUpperBound(0) Edges(i) = CType(vEdgeArr.GetValue(i), Edge) Next i End If SelData = SelMgr.CreateSelectData ModDoc.ClearSelection2(True) SelectedCount = SelMgr.AddSelectionListObjects(Edges, SelData) boolstatus = ModDoc.SketchManager.SketchUseEdge2(False) ModDoc.SketchManager.InsertSketch(True) End If End Select End If End If End Sub ''' <summary> ''' The SldWorks swApp variable is pre-assigned for you. ''' </summary> Public swApp As SldWorks End Class
------------------
[Diese Nachricht wurde von GDawg am 20. Okt. 2015 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 20. Okt. 2015 08:28 <-- editieren / zitieren --> Unities abgeben: Nur für GDawg
Ich arbeite noch mit SWX 2013, aber ich glaube irgendwo gelesen zu haben, dass es mit SWX 2015 oder 2016 möglich sein soll, sowohl Außen- wie Innenkanten einer Fläche einfach zu selektieren und damit auch zu übernehmen. Wenn das so ist (und ich es nicht nur geträumt habe), wäre doch dein Progrämmchen weitgehend überflüssig? [Edit] Habs gefunden: Im WhatsNew2016 auf Seite 230 "Umwandeln von Elementen mit internen Kurvenzügen". Ok, es bedarf ein paar Klicks mehr als dein Programm, aber es ist endlich möglich. [/Edit] ------------------ Klaus www.al-ko.com | mein Gästebuch [Diese Nachricht wurde von KMassler am 20. Okt. 2015 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
GDawg Ehrenmitglied V.I.P. h.c. Teamleiter FEM Simulation
Beiträge: 2622 Registriert: 12.07.2004 SolidWorks_2o2o SP3.o Win10_x64, Quadro_P2ooo. VisualStudio_2o19_Pro. FEM: Forge_NxT_HPC, ANSYS_WB. 3D-Printer: Ultimaker_2, Tinker_Gnome.
|
erstellt am: 20. Okt. 2015 08:56 <-- editieren / zitieren --> Unities abgeben:
Klaus, mein Progrämmchen macht etwas mehr, als nur Skizzenelemente übernehmen. Dies ist nur ein kleiner Ausschnitt ;-) Die Skizzenelemente werden dann in ein DXF gespeichert (welche ich für FEM brauche). Dabei werden Ellipsen noch in Linien-Stücke umgewandelt, weil die FEM-Software keine DXF-Ellipsen versteht Und irgend wann kommen noch Splines dazu.... ------------------
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 20. Okt. 2015 09:19 <-- editieren / zitieren --> Unities abgeben: Nur für GDawg
|