| |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS |
| |
 | Wie kann Simulation Ihre Produktentwicklung beschleunigen?, ein Webinar am 07.08.2025
|
Autor
|
Thema: Selektion von Flächen über ID (API) (4142 mal gelesen)
|
stevieda Mitglied Dipl.-Ing.
 
 Beiträge: 138 Registriert: 21.11.2003 Pro/E Wildfire 3.0 M080 SolidWorks Premium 2007 SP 5.0 CATIA V5 R17 Inventor Pro 12 NX 4.0.0.25 WinXP SP2
|
erstellt am: 01. Aug. 2008 08:53 <-- editieren / zitieren --> Unities abgeben:         
Hallo zusammen, ich habe folgendes Problem: Ich möchte gerne eine Fläche über ihre ID selektieren. Der Hintergrund ist folgender: Ich gehe mit GetFirstFace und GetNextFace alle Flächen meines Bauteils durch. Dabei wird jeweils der Normalenvektor, der Flächeninhalt, die Eckpunkte sowie die Flächen-ID in einem großen Array gespeichert. Die Flächen-ID vergebe ich vorher mit swFace.SetFaceId z wobei z eine Laufvariable ist. Nachdem ich alle Flächen durchgegangen bin mache ich ein paar Berechnungen. Dafür brauche ich dann vorübergehend nicht mehr auf irgendwelche SWX -Objekte zuzugreifen (Performance!). Nachdem ich meine Berechnungen abgeschlossen habe, erhalte ich eine Menge von IDs. Nun möchte ich also jeweils die Flächen mit meiner ausgegebenen ID selektieren. Hat jemand eine Idee wie man das anstellen könnte? In der API-Hilfe steht ja extra, dass man mit SetFaceId seine Flächen mit einer benutzerdefinierten ID versehen kann, um sie zu einem späteren Zeitpunkt wieder gezielt selektieren zu können. Leider ist aber kein Beispiel dabei. Ich bin wie immer dankbar für jede Form der Anregung! ------------------ Gruß, Stevie 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: 01. Aug. 2008 09:43 <-- editieren / zitieren --> Unities abgeben:          Nur für stevieda
Hallo wie ich das in der Online-Hilfe lese ist SetFaceId für importierte Teile zu verwenden "This method sets the face ID on an imported body. This ID is used for tracking the specific faces of imported bodies; for example, IGES imports." Versuch es ev. mal mit ModelDoc2::SelectedFaceProperties damit kannst Du Deinen Flächen einen Namen geben und dann mit einer kleinen Funktion selektieren Ich hab so eine Funktion verwendet um benannte Flächen von Teilen innerhalb einer Baugruppe zu selektieren Es sollte kein Problem sein das so anzupassen, dass Du damit Flächen innerhalb eines Teiles selektieren kannst Public Function SelectComponentFaceByName(ByVal Comp As SldWorks.Component2, ByVal FaceName As String) As SldWorks.Face2 Dim Body As Object Dim Face As SldWorks.Face2 Dim CurFaceName As String Dim retval As Boolean
Const swSelCOMPONENTS = 20 Set Body = Comp.GetBody() ' Get the Component Body Set Face = Body.GetFirstFace Comp.DeSelect ' Traverse thru all body faces Do While Not Face Is Nothing CurFaceName = assdoc.GetEntityName(Face) If (CurFaceName = FaceName) Then Face.Select (0) ' Select the face Set Body = Nothing Set SelectComponentFaceByName = Face Exit Do End If Set Face = Face.GetNextFace Loop End Function
------------------ Grüße Heinz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
stevieda Mitglied Dipl.-Ing.
 
 Beiträge: 138 Registriert: 21.11.2003 Pro/E Wildfire 3.0 M080 SolidWorks Premium 2007 SP 5.0 CATIA V5 R17 Inventor Pro 12 NX 4.0.0.25 WinXP SP2
|
erstellt am: 01. Aug. 2008 10:29 <-- editieren / zitieren --> Unities abgeben:         
Hallo Heinz, also bei meinem Bauteil handelt es sich um ein importiertes STL-File (Entschuldigung, hätte ich vielleicht direkt dazu schreiben sollen). Das mit ModelDoc2.SelectedFaceProperties funktioniert insofern, als dass ich tatsächlich die Eigenschaften wie z.B. die Farbe ändern kann. Aber ich kann die Fläche nachher nicht mehr mit SelectByID2 selektieren. GetEntityName() funktioniert nur für Flächen in Baugruppen. Für Flächen in Bauteilen steht das leider nicht zur Verfügung. Aber davon abgesehen habe ich immer noch das Performance-Problem. Ich habe in meinem Bauteil extrem viele Flächen, so dass ich es mir nicht leisten kann mehrmals durch alle Flächen (GetFirstFace --> GetNextFace) zu gehen. Deshalb auch die Idee dies einmal zu tun, um dann gezielt auf spezielle Flächen zugreifen zu können. ------------------ Gruß, Stevie Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jens_oliver Mitglied Softwareentwickler
 
 Beiträge: 114 Registriert: 28.06.2005
|
erstellt am: 01. Aug. 2008 10:54 <-- editieren / zitieren --> Unities abgeben:          Nur für stevieda
|
stevieda Mitglied Dipl.-Ing.
 
 Beiträge: 138 Registriert: 21.11.2003 Pro/E Wildfire 3.0 M080 SolidWorks Premium 2007 SP 5.0 CATIA V5 R17 Inventor Pro 12 NX 4.0.0.25 WinXP SP2
|
erstellt am: 01. Aug. 2008 11:13 <-- editieren / zitieren --> Unities abgeben:         
Hallo Oliver, na klar! Hatte mir schon die ganze Zeit so etwas gedacht aber irgendwie habe ich den Wald vor lauter Bäumen wohl nicht gesehen. Vielen Dank für den Hinweis. Wenn ich den Zeiger jeder Fläche (ca. 10.000 Flächen) in meinem Array abspeicher dann sollte das doch von der Performance her gesehen kein Problem darstellen, oder? Ein Pointer ist doch auch nichts anderes als eine Adressenvariable, oder? ------------------ Gruß, Stevie Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jens_oliver Mitglied Softwareentwickler
 
 Beiträge: 114 Registriert: 28.06.2005
|
erstellt am: 01. Aug. 2008 11:48 <-- editieren / zitieren --> Unities abgeben:          Nur für stevieda
wird zwar etwas mehr sein als ein Pointer, da die Objekte ja erzeugt und dann nicht gelöscht werden, aber solange du nicht mit riesigen teilen arbeitest sehe ich da keine probleme. wer weiß schon wann der Garbage-Collector diese aufräumt. gruß ------------------ Software nach Maß für Ihr CAD-System www.ib-knepper.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
stevieda Mitglied Dipl.-Ing.
 
 Beiträge: 138 Registriert: 21.11.2003 Pro/E Wildfire 3.0 M080 SolidWorks Premium 2007 SP 5.0 CATIA V5 R17 Inventor Pro 12 NX 4.0.0.25 WinXP SP2
|
erstellt am: 01. Aug. 2008 12:21 <-- editieren / zitieren --> Unities abgeben:         
Ja stimmt. War jetzt gerade ein bisschen mehr bei C als bei VB. In diesem Fall schlepp ich ja die Objekte mit. Der Idealfall ist es also noch nicht. Meine Idee war halt, dass ich am Anfang, wenn ich alle Flächen einmal durchlaufe, eine ID oder meinetwegen auch ein Attribut oder ähnliches setze um dann später zu einem beliebigen Zeitpunkt wieder gezielt auf diese spezielle Fläche zugreifen zu können. Vielleicht diesbezüglich noch eine Idee? ------------------ Gruß, Stevie Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
stevieda Mitglied Dipl.-Ing.
 
 Beiträge: 138 Registriert: 21.11.2003 Pro/E Wildfire 3.0 M080 SolidWorks Premium 2007 SP 5.0 CATIA V5 R17 Inventor Pro 12 NX 4.0.0.25 WinXP SP2
|
erstellt am: 01. Aug. 2008 13:27 <-- editieren / zitieren --> Unities abgeben:         
Hallo Oliver, ich habe es noch einmal getestet. So wird das leider bei mir nichts. Die Performance ist absolut inakzeptabel. Er schleppt einfach zu viel Ballast mit. Ich halte ja immer noch ein wenig an der Lösung mit den Flächen-IDs fest. Wenn es laut API-Hilfe die Möglichkeit gibt IDs zu vergeben, dann müssen sie doch auch irgendwie genutzt werden können. ------------------ Gruß, Stevie Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jens_oliver Mitglied Softwareentwickler
 
 Beiträge: 114 Registriert: 28.06.2005
|
erstellt am: 01. Aug. 2008 15:17 <-- editieren / zitieren --> Unities abgeben:          Nur für stevieda
hi, denke aber nicht, dass es am speicher liegt. habe mal eine kleines testmakro geschrieben. leider habe ich kein bauteil mit 15000 flächen, daher die for-schleife. bei 70000 flächen war das makro aber innerhalb einer sekunde fertig. Code: Sub main() Dim swFaceArr() As SldWorks.Face2Dim count As Long Dim i As Integer Set swApp = Application.SldWorks ReDim swFaceArr(0) count = 0 Set swModel = swApp.ActiveDoc Set swPart = swModel Set swSelMgr = swModel.SelectionManager Set swSelData = swSelMgr.CreateSelectData vBodies = swPart.GetBodies2(swAllBodies, True) Set swBody = vBodies(0) Set swFace = swBody.GetFirstFace swModel.ClearSelection2 True MsgBox "start" For i = 1 To 300 Set swFace = swBody.GetFirstFace Do While Not swFace Is Nothing count = count + 1 Set swEnt = swFace Set swFaceArr(UBound(swFaceArr)) = swFace ReDim Preserve swFaceArr(UBound(swFaceArr) + 1) Set swFace = swFace.GetNextFace Loop Next i MsgBox Str(count) + " " + Str(UBound(swFaceArr)) End Sub
Gruß Oliver ------------------ Software nach Maß für Ihr CAD-System www.ib-knepper.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
stevieda Mitglied Dipl.-Ing.
 
 Beiträge: 138 Registriert: 21.11.2003 Pro/E Wildfire 3.0 M080 SolidWorks Premium 2007 SP 5.0 CATIA V5 R17 Inventor Pro 12 NX 4.0.0.25 WinXP SP2
|
erstellt am: 01. Aug. 2008 15:25 <-- editieren / zitieren --> Unities abgeben:         
Hallo Oliver, Du hast Recht! Ich habe das gerade auch noch mal gegengetestet. Das Objekt (Face) selber abzuspeichern dauert überhaupt nicht lange. Das geht wirklich sehr schnell. Mein Fehler lag irgendwo in einer Schleife, so dass der ganze Prozess langsam wurde. Hab ich aber behoben und läuft es ziemlich fix. Vielen Dank für den Hinweis und für die Mühe! ------------------ Gruß, Stevie 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: 04. Aug. 2008 09:00 <-- editieren / zitieren --> Unities abgeben:          Nur für stevieda
Hallo Stevie ich weiß nicht ob das für Dich von Bedeutung ist aber, in der Online-Hilfe steht bei SetFacID noch The face ID is a persistent ID that is not saved with the document d.h. meiner Meinung nach, dass Du jedes mal nach dem Öffnen des Teils die Id´s neu vergeben musst oder ist eine permanente ID nicht notwendig für Dich? ------------------ Grüße Heinz P.S. wobei ich es nicht ganz verstehe (weil lt. Wörterbuch persistent=ständig/bleibend) [Diese Nachricht wurde von nahe am 04. Aug. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
stevieda Mitglied Dipl.-Ing.
 
 Beiträge: 138 Registriert: 21.11.2003 Pro/E Wildfire 3.0 M080 SolidWorks Premium 2007 SP 5.0 CATIA V5 R17 Inventor Pro 12 NX 4.0.0.25 WinXP SP2
|
erstellt am: 04. Aug. 2008 09:12 <-- editieren / zitieren --> Unities abgeben:         
Hallo Heinz, danke für diese Info. Hatte ich auch schon gelesen. Das ist für mich nicht so tragisch, denn es geht um eine einmalige Berechnung, die nicht mit dem Originalbauteil gespeichert werden soll. Aber Du hast Recht: warum heißt das persistent, wenn es doch gar nicht beständig ist. Wahrscheinlich handelt es sich vielmehr um eine "beständige" ID innerhalb der Sitzung. Naja, wehe dem, der eine echte permanente ID benötig. Da bleibt wohl nichts anderes übrig als mit angehängten Attributen zu arbeiten. ------------------ Gruß, Stevie Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Jochen Renz Mitglied Dipl.Ing. Dipl.Wirt.-Ing.
 
 Beiträge: 127 Registriert: 25.10.2001
|
erstellt am: 05. Aug. 2008 08:28 <-- editieren / zitieren --> Unities abgeben:          Nur für stevieda
Hallo Zusammen, vielleicht wäre es eine Hilfe statt der Face-IDs, die nicht so wirklich verlässlich aussehen, die Persistent-IDs zu verwenden. Diese Ids lassen sich von prinzipiell jedem SolidWorks-Objekt ermitteln. Viele Grüße Jochen Renz ------------------ Jochen Renz, MaxxSoft GmbH, Riedheimerstrasse 6, 89129 Langenau, Tel: 07345 9617 0, Fax: 07345 9617 99, E-Mail: renz@maxxsoft.de , Web: www.maxxsoft.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
stevieda Mitglied Dipl.-Ing.
 
 Beiträge: 138 Registriert: 21.11.2003 Pro/E Wildfire 3.0 M080 SolidWorks Premium 2007 SP 5.0 CATIA V5 R17 Inventor Pro 12 NX 4.0.0.25 WinXP SP2
|
erstellt am: 05. Aug. 2008 11:14 <-- editieren / zitieren --> Unities abgeben:         
Hallo Jochen, also die Persistent-IDs würde ich ja auch gerne mal ausprobieren. Leider habe ich noch nicht ganz durchgeblickt, wie ich die ermitteln und verwenden kann. Bisher löse ich das Problem, indem ich das Face-Objekt in einem Array mitnehme. Dabei stellt die Position in meinem Feld auch meien eigene Face-ID dar. Sprich: die 2. Face steht an Position 2 in meinem Feld. Das Blöde ist aber natürlich, dass ich somit jede einzelne Fläche mitschleppen muss. Vom Speicherbedarf her nicht gerade elegant. Besser wäre sicherlich einmalig eine ID jeder Fläche zuweisen. So müsste ich doch zu jedem Zeitpunkt über diese Persistent-ID eine bestimmte Fläche wiederfinden, oder? Hat da schon einmal jemand Erfahrungen mit sammeln können? Ich bin von der API-Programmierung nicht so tief drin, dass ich da Erfahrungen vorweisen könnte. ------------------ Gruß, Stevie Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |