| |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
 | PNY wird von NVIDIA zum Händler des Jahres gewählt – zum dritten Mal in Folge, eine Pressemitteilung
|
Autor
|
Thema: getReferenceKey (2165 mal gelesen)
|
yamaha Mitglied Konstrukteur
 
 Beiträge: 384 Registriert: 19.05.2004 Autocad/Inventor 2022, Windows 10 Pro 64Bit
|
erstellt am: 03. Jul. 2004 17:26 <-- editieren / zitieren --> Unities abgeben:         
Hallo Leute, eine Frage zum ReferenceKey. Ich wollte per VBA abfragen ob eine ebene Fläche bereits als Abhängigkeit benutzt wird, und dachte der ReferenceKey ist dafür wie geschaffen. Leider bekommen ich von der Fläche keinen ReferenceKey, jedoch von dem Proxy-Objekt der Fläche kann ich den ReferenceKey abfragen. Frage: Wird der ReferenceKey erst vergeben, wenn man das Objekt auch benutzt? Hat eine Fläche keinen ReferenceKey, oder? (evtl. Fehler in meinem Code?) Danke für eure Hilfe ------------------ Gruß Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
PaulSchuepbach Moderator Programmierer
   

 Beiträge: 1005 Registriert: 01.10.2003
|
erstellt am: 03. Jul. 2004 18:48 <-- editieren / zitieren --> Unities abgeben:          Nur für yamaha
Hallo Joern, ReferenceKeys sind was anderes. Wenn Du eine Flaeche referenzierst, um irgendwas zu machen, dann weisst Du nach dem Schliessen und wiedser Oeffnen des PartDocs nicht mehr, welche Flaeche es war. Du kannst z.B. einen ReferenceKey (mittels Code) an eine Flaeche anbringen. Zu einem Spaeteren Zeitpunkt wirst Du (via Code) genau diese Flaeche wiederfinden - so aehnlich wie ein AttributeSet. Der Untersvchied ist, dass ein AttributeSet - bzw. das Attribut darin - dauerhaft angebracht wird. Du kannst also das File schliessen, IV beenden und Deine Applikation beenden. Nach einem Neustart findest Du die Flaeche wieder. Der ReferenceKey allerdings ueberdauert das Schliessen und wieder Oeffnen des IV-Files - nicht aber das Beenden Deiner Applikation. Okay, nun sollten die letzten Klarheiten beseitigt sein... Die Frage ist eigentlich: WAS willst Du genau vom ReferenceKey ? Du willst Abhaengigkeiten suchen. Das Proxy-objekt hat natuerlich ReferenceKeys - auf jeder Flaeche, an jeder Kante usw. Warum? Das Proxy-Objekt ist ja 'nur' ein Abbild (instanz) der entsprechenden Flaeche auf dem Bauteil. So arbeiten Assemblys. Diese ReferenceKeys werden von IV vergeben. Du kannst somit von der Proxy-Flaeche aus dem Assembly auf die Originalflaeche des Parts schliessen. Das hat aber nichts mit den Abhaengigkeiten zu tun. Du findest ueber die Costraints-Collection fuer jede Costraint die zugehoerigen Elemente. ReferenceKeys sind der falsche Weg. Ich hoffe, das hilft. Gruesse,
Paul Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
yamaha Mitglied Konstrukteur
 
 Beiträge: 384 Registriert: 19.05.2004 Autocad/Inventor 2022, Windows 10 Pro 64Bit
|
erstellt am: 03. Jul. 2004 20:39 <-- editieren / zitieren --> Unities abgeben:         
Hallo Paul, genau eine solche Erklärung habe ich gesucht. wiedermal vielen Dank.  Ich möchte die Information nutzen um automatisiert, an die Flächen ein anderes Bauteil anzuhängen. Jetzt hat das Ursprungsbauteil nur zwei dieser Flächen und wenn ich raus kriegen könnte ob die andere Fläche bereits verwendet wird, wüßte ich welche der beiden Flächen ich nehmen kann. Die Information müßte das Schließen und Wiederöffnen des Datei eigentlich nicht überstehen, von daher könnte ich mit dem ReferenceKey leben. Deshalb nochmal folgende Fragen: Gibt es nach dem Öffnen keinen ReferenceKey mehr oder ist der dann einfach für die "aktuelle Sitzung" ein anderer? Hat eine Fläche selbst auch einen RefenceKey oder wird der ReferenceKey nur an das Proxy-Objekt gehängt? Ich habe das Problem das ich mit meinem Code von der Original-Fläche keinen ReferenceKey bekomme (aber vom abgeleiteten Proxy-Objekt). Also ich bräuchte einen eindeutigen Schlüssel von der Original-Fläche. Ich dachte das Inventor intern einen solchen Schlüssel hat. Wenn nicht muß ich mir wohl mit der Attrbut-Funkltion selber einen an dei Original-Fläche hängen. P.S. Auf der Heimfahrt diese Woche habe viele neue Ideen entwickelt. Ich weiß jetzt ja was alles möglich ist, nur ich muß es noch bei Zeiten umsetzten.  ------------------ Gruß Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
drcmda Mitglied
 
 Beiträge: 176 Registriert: 10.07.2002
|
erstellt am: 06. Jul. 2004 22:01 <-- editieren / zitieren --> Unities abgeben:          Nur für yamaha
hi jedes objekt hat einen ref-key, bei b-rep objekten brauchst du einen context den du via "oPart.ReferenceKeyManager.CreateKeyContext" leicht erstellen kannst. mal zur struktur des ref-keys - ich versuche soetwas wie den inventor browser nachzubasteln da jener ja nicht in der API abgebildet ist. an position 8 im ref-key befindet sich ein long welches ein time-stamp zu sein scheint (siehe attachment). leider wird dieser timestamp von inventor immer nur einmal bei der erstellung generiert - verschiebe ich im browser die features bleibt er erhalten und somit bin ich wieder am ziel vorbei... gibt es einen weg die timestamps zu aktualisieren? hier mal ein bsp. skizze1 - timestamp: 1 extrusion1 - timestamp: 2 rundung1 - timestamp: 3 rundung2 - timestamp: 4 vertausche ich jetzt die verrundungen bleiben die timestamps erhalten OBWOHL sich der inventor browser ändert... wie läßt sich das aktualisieren? --------------------------------------------------------------------- beim vb-projekt einfach in inventor ein bauteil laden und mal laufen lassen vielen dank, paul(2) [Diese Nachricht wurde von drcmda am 06. Jul. 2004 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
yamaha Mitglied Konstrukteur
 
 Beiträge: 384 Registriert: 19.05.2004 Autocad/Inventor 2022, Windows 10 Pro 64Bit
|
erstellt am: 07. Jul. 2004 14:33 <-- editieren / zitieren --> Unities abgeben:         
Hallo drcmda, vielen Dank für deine Erläuterung, ich muß mir deinen Code nochmal anschauen befürchte aber das ich dir dabei nicht wirklich helfen kann. Habe mittlerweile aber trotzdem folgendes Dokument zum ReferenceKey gefunden: http://inventor.cad.de/university/pdf_zip/MA42-4.pdf ich habe trotzdem noch folgendes Problem Ich habe das Problem das ich mit meinem Code von der Original-Fläche keinen ReferenceKey bekomme. Liegt das evtl. daran, das ich die Fläche von einem Bautteil nehme. Ich arbeite aber in einer baugruppe: folgenden Code benutzte ich: Public Sub Teile_verbinden() Dim oApp As Inventor.Application Dim oDoc As Inventor.Document Set oApp = ThisApplication Set oDoc = oApp.ActiveDocument ' Set a reference to the assembly component definintion. Dim oAsmCompDef As AssemblyComponentDefinition Set oAsmCompDef = oDoc.ComponentDefinition ' Set a reference to the select set. Dim oSelectSet As Inventor.SelectSet Set oSelectSet = oDoc.SelectSet ' Validate the correct data is in the select set. If oSelectSet.Count <> 2 Then MsgBox "You must select the two entities valid for mate." Exit Sub End If ' Get the two entities from the select set. Dim oSelect As Inventor.PartDocument Dim oTeil1 As Inventor.Face Dim oTeil2 As Inventor.Face Dim oSurfaceBody As Inventor.SurfaceBody Dim oCompDef As Inventor.ComponentDefinition Dim oFace As Inventor.Face Dim oRef() As Byte For s = 1 To 2 Set oSelect = oSelectSet.Item(s).Definition.Document Set oCompDef = oSelect.ComponentDefinition For Each oSurfaceBody In oCompDef.SurfaceBodies For Each oFace In oSurfaceBody.Faces If oFace.SurfaceType = kPlaneSurface Then Puffer_RefKey RefKey_holen(oFace) = "" Then If not Puffer_RefKey = "" Then Msgbox(“Puffer_RefKey”) GoTo Ende: End If Next oFace Next oSurfaceBody Nächstes_Teil: Next s Ende: Function RefKey_holen(oFace As Inventor.Face) As String Dim oApp As Inventor.Application Dim oDoc As Inventor.Document Dim oRef() As Byte Set oApp = ThisApplication Set oDoc = oApp.ActiveDocument RefKey_holen = "" On Error GoTo Ende oFace.GetReferenceKey oRef(), oDoc.ReferenceKeyManager.CreateKeyContext For s = 0 To UBound(oRef) RefKey_holen = RefKey_holen & (oRef(s)) Next Ende: Call oDoc.ReferenceKeyManager.BindKeyToObject(oRef(), oDoc.ReferenceKeyManager.CreateKeyContext, oFace) End Function
End Sub
------------------ Gruß Jörn Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
waldi Mitglied Softwerker
 
 Beiträge: 272 Registriert: 07.08.2001
|
erstellt am: 07. Jul. 2004 14:49 <-- editieren / zitieren --> Unities abgeben:          Nur für yamaha
Hi, wenn ich dich richtig verstehe, willst du doch nur eine bestimmte Fläche eindeutig identifizieren. Ich nehm dazu immer einen Punkt (z.B. den Mittelpunkt des uv-Space der Fläche) auf der Fläche und den Normalenvektor der Fläche. Dann brauchst du die Refkeys nicht, und diese Werte sind eindeutig, auch nach dem Speichern und öffnen eines Teiles. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
yamaha Mitglied Konstrukteur
 
 Beiträge: 384 Registriert: 19.05.2004 Autocad/Inventor 2022, Windows 10 Pro 64Bit
|
erstellt am: 07. Jul. 2004 16:43 <-- editieren / zitieren --> Unities abgeben:         
Hallo Waldi, 1. hört sich gut an. Hats du mal ein Beispiel? 2. Wie schon oben erwähnt möchte in den Abhängigkeiten der Baugruppe nachschauen ob die Fläche schon verwendet wird. Geht das auch mit deiner Methode?
------------------ Gruß Jörn Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
waldi Mitglied Softwerker
 
 Beiträge: 272 Registriert: 07.08.2001
|
erstellt am: 07. Jul. 2004 20:02 <-- editieren / zitieren --> Unities abgeben:          Nur für yamaha
Hi, hier ein Beispiel, wie du an einen Punkt auf einer Fläche und den Normalenvektor in diesem Punkt kommst: --------------------------------- Sub getFaceData() Dim faceNormal As UnitVector Dim facePoint As point ' get active part doc Dim myDoc As PartDocument Set myDoc = ThisApplication.ActiveDocument ' get selection set Dim selSet As SelectSet Set selSet = myDoc.SelectSet ' get selected object If (selSet.Count > 0) Then Dim myFace As Face Set myFace = selSet.Item(1) ' get surface evaluator Dim surfEval As SurfaceEvaluator Set surfEval = myFace.Evaluator ' get param range Dim paramRange As Box2d Set paramRange = surfEval.ParamRangeRect ' get normal at min point (may be any other point in the patram range) Dim normal(2) As Double Dim point(2) As Double Dim params(1) As Double paramRange.MinPoint.GetPointData params surfEval.GetNormal params, normal ' get 3d point at param values surfEval.GetPointAtParam params, point ' create point and unit vector object Set facePoint = ThisApplication.TransientGeometry.CreatePoint(point(0), point(1), point(2)) Set faceNormal = ThisApplication.TransientGeometry.CreateUnitVector(normal(0), normal(1), normal(2)) End If End Sub ---------------------------------------------- UnitVector und Point haben jeweils eine Methode IsEqualTo, damit kannst du dann auf Gleichheit prüfen. Wenn du über die AssemblyConstraints gehts, hat jedes Constraint die Properties GetGeometryOne und GetGeometryTwo. Dann hast du die Face/FaceProxy. Beim Proxy noch mit GetNativeObject, dann hast du die Face. Dann jeweils die Normalenvektoren/Punkte mit deiner selektierten Fläche vergleichen, das sollte es gewesen sein.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
yamaha Mitglied Konstrukteur
 
 Beiträge: 384 Registriert: 19.05.2004 Autocad/Inventor 2022, Windows 10 Pro 64Bit
|
erstellt am: 18. Aug. 2004 10:36 <-- editieren / zitieren --> Unities abgeben:         
Hallo Waldi, tschuldigung nochmal für meine Nicht-Reaktion. Danke für den Code, ein paar Units habe ich natürlich auch vergeben. Muß jetzt aber auch gestehen, das ich mit diesem Problem jetzt auch bisschen zurück bin, da ich Urlaub hatte und die Programmiererei auch nur nebenbei betreibe, so das ich manchmal nicht dazu komme. Ich werde das aber auf jeden Fall testen und dir dann nochmal meine Ergebnisse berichten, falls erzählenswert. Kann nur noch etwas dauern bei mir. ------------------ Gruß Jörn Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |