| | |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS |
| | |
 | SolidWorks Kurs mit IHK-Zertifzierung , ein Kurs (bis zu 100% förderbar mit Bildungsgutschein)
|
|
Autor
|
Thema: API: Wie ein face2 auswählen (select) ? (3713 mal gelesen)
|
sebhad Mitglied Student

 Beiträge: 20 Registriert: 04.05.2004 SolidWorks 2003 Visual C# .NET
|
erstellt am: 13. Okt. 2004 16:00 <-- editieren / zitieren --> Unities abgeben:         
Hallo, ich durchlaufe ein bel. Bauteil und speichere habe dann Zeiger zu einigen unterschiedlichen face2-Objekten, d.h. Flächen. Nun meine Frage: Wie kann ich später anhand einer face2-Referenz (diese kann ich unter C# ganz normal mit z.B. face.GetFaceId() verwenden) diese Fläche auswählen, so dass diese in SolidWorks 2003 grün angezeigt wird, als ob man sie direkt angeklickt hätte? Vielen Dank für die Mühe, Sebastian
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
u.clemens Mitglied Konstrukteur
  
 Beiträge: 964 Registriert: 04.07.2000 engineer's law o cheap o fast o good check only two !
|
erstellt am: 13. Okt. 2004 16:53 <-- editieren / zitieren --> Unities abgeben:          Nur für sebhad
|
sebhad Mitglied Student

 Beiträge: 20 Registriert: 04.05.2004 SolidWorks 2003 Visual C# .NET
|
erstellt am: 13. Okt. 2004 17:13 <-- editieren / zitieren --> Unities abgeben:         
Danke, aber face sowie face2 hat keine Methode .select() Das ist ja das Problem... jetzt mache ich einen Versuch, es mit face2.GetClosestPointOn(x,y,z) zu versuchen. Auswahl dann mit ModelDoc2.SelectByID(...,x,y,z,...) Mal sehen... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
u.clemens Mitglied Konstrukteur
  
 Beiträge: 964 Registriert: 04.07.2000 engineer's law o cheap o fast o good check only two !
|
erstellt am: 13. Okt. 2004 17:32 <-- editieren / zitieren --> Unities abgeben:          Nur für sebhad
... aber das Object Entity hat eine solche Methode. Außerdem gibts ein Bsp. in der API  -Hilfe "Select Component Face By Name Example (VB)" - das solltest Du Dir mal anschauen. ------------------ mfg uc Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
u.clemens Mitglied Konstrukteur
  
 Beiträge: 964 Registriert: 04.07.2000 engineer's law o cheap o fast o good check only two !
|
erstellt am: 13. Okt. 2004 17:58 <-- editieren / zitieren --> Unities abgeben:          Nur für sebhad
hier noch einkleines Beispiel: Sub main() Set swApp = Application.SldWorks Set Part = swApp.ActiveDoc Set Feature = Part.FirstFeature While Feature.IsBase = False Set Feature = Feature.GetNextFeature Wend FeatureName = Feature.Name vFaces = Feature.GetFaces FaceNum = Feature.GetFaceCount Set Face = vFaces(0) Face.Select True End Sub Zumindest bei mir wird damit die erste Fläche des Basisfeatures grün gefärbt ...
------------------ mfg uc Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
sebhad Mitglied Student

 Beiträge: 20 Registriert: 04.05.2004 SolidWorks 2003 Visual C# .NET
|
erstellt am: 13. Okt. 2004 19:26 <-- editieren / zitieren --> Unities abgeben:         
Erstmal vielen Dank! Hab einfach nicht richtig hingesehen in der Hilfe und nicht erkannt, dass Face2 von Entity abgeleitet ist. Bin zwar schon geübt im lesen von VisualBasic-Code, muss aber genau hinschauen, weil man da ja für alles den Typ "object" verwenden kann. Das geht in C# nicht, ist sehr streng. (In Visual C# ist es sehr wichtig welchen Objekttyp man verwendet, und komischerweise zeigt Face2 keine Methode Select() an, erst wenn man einen Typecast macht "(face as Entity).Select(false)") # Jetzt gehts... # Super Hilfe! Respekt und Danke nochmal, Sebastian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
sebhad Mitglied Student

 Beiträge: 20 Registriert: 04.05.2004 SolidWorks 2003 Visual C# .NET
|
erstellt am: 13. Okt. 2004 19:37 <-- editieren / zitieren --> Unities abgeben:         
Erstmal vielen Dank! Hab einfach nicht richtig hingesehen in der Hilfe und nicht erkannt, dass Face2 von Entity abgeleitet ist. Bin zwar schon geübt im lesen von VisualBasic-Code, muss aber genau hinschauen, weil man da ja für alles den Typ "object" verwenden kann. Das geht in C# nicht, ist sehr streng. (In Visual C# ist es sehr wichtig welchen Objekttyp man verwendet, und komischerweise zeigt Face2 keine Methode Select() an, erst wenn man einen Typecast macht "(face as Entity).Select(false)") # Jetzt gehts... # Super Hilfe! Respekt und Danke nochmal, Sebastian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
stucki Mitglied Ingenieur

 Beiträge: 73 Registriert: 30.04.2004
|
erstellt am: 02. Nov. 2004 00:13 <-- editieren / zitieren --> Unities abgeben:          Nur für sebhad
Zitat: Original erstellt von sebhad:
Wie kann ich später anhand einer face2-Referenz (diese kann ich unter C# ganz normal mit z.B. face.GetFaceId() verwenden) diese Fläche auswählen, so dass diese in SolidWorks 2003 grün angezeigt wird, als ob man sie direkt angeklickt hätte?
Hallo Sebastian, Habe selber das gleiche Problem. Nur fängt das Problem schon früher an. Bei GetFaceId() bekomme ich überall 0 zurück. In der API steht auch dass diese ID an Flächen von importierten Köpern vergeben wird. (This method gets the face ID of an imported body) Wie also bekomme ich einen eindeutigen Bezeichner einer Fläche, welchen ich zu einem späteren Zeipunkt wieder verwenden kann um Beispielsweise diese Fläche über die API zu selektieren ? (Ohne dass ich selber die Flächen alle bezeichnen muss) liebe Grüsse Tom Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
sebhad Mitglied Student

 Beiträge: 20 Registriert: 04.05.2004 SolidWorks 2003 Visual C# .NET
|
erstellt am: 02. Nov. 2004 09:46 <-- editieren / zitieren --> Unities abgeben:         
Hallo Tom, Hast Du denn importierte Körper? (Ich weiß eigentlich gar nicht, wann man diese genau hat.) Aber prinzipiell kannst Du es vermutlich genauso machen, wie ich: Nämlich statt eine Fläche mit der ID (und dann ja wohl im endeffekt mit SelectByID() ) auszuwählen, kannst Du Dir einfach den Zeiger auf die Fläche in einer Variable merken (das Face2-Objekt ist der Zeiger) und später z.B. mit der von entity geerbten Methode .Select2() selektieren oder sonst was machen mit dem Face2-Objekt. Das setzt natürlich voraus, dass Du vorher irgendwie an das Face2-Objekt gekommen bist, sei es mit dem SelectionManager, über feature.GetFaces() oder sonst wie. Viele Grüße, Sebastian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
stucki Mitglied Ingenieur

 Beiträge: 73 Registriert: 30.04.2004
|
erstellt am: 02. Nov. 2004 11:10 <-- editieren / zitieren --> Unities abgeben:          Nur für sebhad
Hallo Sebastian, Importierte Körper sind welche, die in anderen CAD Systemen erzeugt wurden und dann beispielsweise als im IGES-Format in SW eingelesen werden. Das mit den Zeigern funktioniert für meinen Bedarf nicht. Ich muss für eine Fläche, Linie, Punkt, etc. ein eindeutiges Merkmal ermitteln, welches ich so in eine Datei abspeichern kann. Damit bei einer nächsten Session mit SW über dieses Merkmal das Element wieder ermittelt werden kann. Kennst Du da was brauchbares ? gruss tom Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
sebhad Mitglied Student

 Beiträge: 20 Registriert: 04.05.2004 SolidWorks 2003 Visual C# .NET
|
erstellt am: 02. Nov. 2004 15:42 <-- editieren / zitieren --> Unities abgeben:         
Hallo Tom, was mir noch dazu einfällt: Du kannst einer Fläche einen Namen geben, entweder in SWX /Flächeneigenschaften oder mit PartDoc::SetEntityName(). SetEntityName geht aber nur in Bauteil-Dokumenten. In einer Baugruppe oder auch Bateil kannst Du dann alle Faces durchlaufen und mit ModelDoc2::GetEntityName() überprüfen, ob die aktuelle Fläche die Fläche mit dem vorher vergeben Namen ist. Weiß Du, wie Du in Bauteilen oder Baugruppen alle Flächen ermittelst? (Body2::GetFirstFace() usw...) Allerdings weiß ich jetzt nicht, ob das für Edges, Points usw. auch geht. Wäre aber möglich, wenn diese alle vom Typ Entity (geerbt) sind. Vielleicht hilft Dir das ja weiter. Viele Grüße, Sebastian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
stucki Mitglied Ingenieur

 Beiträge: 73 Registriert: 30.04.2004
|
erstellt am: 11. Nov. 2004 22:21 <-- editieren / zitieren --> Unities abgeben:          Nur für sebhad
Hallo Sebastian, Wenns Dich interessiert, ich löse das Problem der Identität eines Objektes nun auf folgende Weise: Schau in der API Help unter : "persistent reference IDs" nach. Da gibts die Methode: persistId = ModelDocExtension.GetPersistReference ( dispObj) dispObj ist dabei Beispielsweise die Referenz aif eine Fläche. persistID ist ein byte-array, welches sich in einen Unicode-String umwandeln lässt. Dieser ist dann in einem File speicherbar und von da auch wieder abrufbar und kann zurückgewandelt werden in ein persistID über persistID lässt sich dann das eigentliche Objekt wieder ermitteln: *dispObj = ModelDocExtension.GetObjectByPersistReference(persistId) gruss tom PS: machst Du deine Diplomarbeit auf SolidWorks ?
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
sebhad Mitglied Student

 Beiträge: 20 Registriert: 04.05.2004 SolidWorks 2003 Visual C# .NET
|
erstellt am: 15. Nov. 2004 13:15 <-- editieren / zitieren --> Unities abgeben:         
Hallo Tom, ja, ich mache meine Diplomarbeit mit SolidWorks 2003 und Visual C# .NET. Ich muss Kontruktionstools entwickeln, um apparatebauspezifische Baugruppen nach Norm zu erzeugen. So, wie Du Dein Problem jetzt gelöst hast, wäre es unter SWX 2003 gar nicht möglich, da es diese Funktionen noch nicht in der API gibt. Die größten Problem, die ich zuletzt zu lösen hatte, hatten den Grund, dass SWX z.B. folgendes macht: Wenn ich in einer Baugruppe von einem Mate-Objekt, die damit verknüpften Features/Entities mit Mate::GetEntity() hole, zeigen diese nicht auf Features in der Baugruppe, sondern auf Features in dem Dokument, das als Komponente in die Baugruppe eingefügt wurde. Bis ich das entdeckt hatte... Arbeitest Du mit der SolidWorks-API beruflich? Viele Grüße, Sebastian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |