Autor
|
Thema: Object auslesen, auf welches eine Reference zeigt (3789 mal gelesen)
|
tomtom1972 Mitglied dipl ing maschinenbau
Beiträge: 605 Registriert: 22.03.2005 NVidia Quadro K4000 Intel Xeon E5-1620, 64GB RAM Windows10 64bit R30 <= CATIA V5 > =R19
|
erstellt am: 06. Sep. 2011 14:37 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, gibt es eine Möglichkeit das Object auszulesen, auf welches eine Reference zeigt, ohne über die Selection zu gehen (dauert zu lange)? Also die Umkehrung von .CreateReferenceFromObject? Danke & Gruß ------------------ tomtom1972 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
meisterlumpi Mitglied
Beiträge: 118 Registriert: 15.04.2011 Intel Core2 Quad Q6600 2.40 GHz | 4 GB RAM | Win7x64
|
erstellt am: 06. Sep. 2011 16:58 <-- editieren / zitieren --> Unities abgeben: Nur für tomtom1972
|
tomtom1972 Mitglied dipl ing maschinenbau
Beiträge: 605 Registriert: 22.03.2005 NVidia Quadro K4000 Intel Xeon E5-1620, 64GB RAM Windows10 64bit R30 <= CATIA V5 > =R19
|
erstellt am: 07. Sep. 2011 06:54 <-- editieren / zitieren --> Unities abgeben:
Hallo meisterlumpi, Danke für deine Antwort. Funktioniert aber zum einen leider nicht, da der Displayname der Referenz anders aufgebaut ist als der String, welchen das .FindObjectByName verwendet. Zum anderen habe ich das Problem, das unterschiedliche Objekte den gleichen Namen haben können und damit der Zugriff über denselben nicht eindeutig ist. Ich will alle Elemente in einem GeoSet veröffentlichen. Folgende Randbedingungen: a) es ist nicht bekannt, ob sie schon veröffentlicht sind b) falls sie schon veröffentlicht sind ist es möglich, das der Name der Publikation nicht dem Name des veröffentlichten Elementes selbst entspricht c) Ich kann nicht ausschließen, das Elemente im GeoSet den gleichen Namen haben (z.B. mehrere "Point.1") d) der Name der Publikation sollte (wenn a-c nicht dagegensprechen) dem des zu veröffentlichten Elementes entsprechen, ansonsten wird eine Unterscheidung geschaffen durch Anhang der kleinst möglichen Zahl > 1. Also wie bei händischer Vorgehensweise, aus Point.1 wird Point.11 (falls Point.1 schon da) oder Point.12 (falls Point.11 auch schon da) Das Script geht rekursiv über die Publications, liest die Referenz zum publizierten Element aus und schreibt sie in eine Collection A (nur die ist eindeutig wegen c, der DisplayName hilft nix). Das Script liest alle Elemente im GeoSet aus und schreibt deren InternalName in eine Collection B. Nun steht der Vergleich aus. Dazu habe ich zwei Möglichkeiten: 1) mit Hilfe der Selection. Also die Ref aus A in die Selection und über den Sel.Item(1).Value bekomme ich den InternalName und kann vergleichen. Dauert aber zu lange (Selection.Add) und ich versuche immer grundsätzlich ohne Selections auszukommen, da instabil. 2) nicht den InternalName in B schreiben sondern ebenfalls eine Referenz (ebenfalls eindeutig). Und dann die 2 Referenzen vergleichen. Sollte eigentlich irgendwie gehen, aber wie? Mit der Methode .ComposeWith der Referenz? Oder über Objektvergleich (If XX Is XY ..)? Will mir auch nicht gelingen. Deshalb suche ich nach einer Möglichkeit, von der Ref direkt auf das Objekt zu kommen, auf welches die Ref verweist. Da eine Referenz ja per Definition ein Zeiger auf ein Objekt ist, sollte das doch irgendwie gehen? Vielen Dank erst mal & Gruß ------------------ tomtom1972 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
meisterlumpi Mitglied
Beiträge: 118 Registriert: 15.04.2011 Intel Core2 Quad Q6600 2.40 GHz | 4 GB RAM | Win7x64
|
erstellt am: 07. Sep. 2011 08:06 <-- editieren / zitieren --> Unities abgeben: Nur für tomtom1972
Zitat: Funktioniert aber zum einen leider nicht, da der Displayname der Referenz anders aufgebaut ist als der String, welchen das .FindObjectByName verwendet.
keine ahnung wie du deine referenzen erstellst, aber bei mir funktioniert das. aber wenn namen mehrfach verwendet werden ist es natürlich nicht mehr eindeutig. Zitat: 2) nicht den InternalName in B schreiben sondern ebenfalls eine Referenz (ebenfalls eindeutig). Und dann die 2 Referenzen vergleichen. Sollte eigentlich irgendwie gehen, aber wie? Mit der Methode .ComposeWith der Referenz? Oder über Objektvergleich (If XX Is XY ..)?
die ist ganz und gar nicht eindeutig! wie du schon sagtest, die referenz ist ein zeiger auf ein objekt, bzw. auf eine bestimmte adresse im speicher. die referenz selbst hat natürlich auch eine speicheradresse. 2 (verschiedene) referenzen auf das selbe objekt haben immer verschiedene adressen, daher klappt das mit dem If XX Is XY ... auch nicht (das object, welches referenziert wird ist gleich, nicht aber die refs selbst). ich würde mir den internal name der objekte auslesen und den vergleichen, dann kannst du dir das ganze mit den referenzen sparen. Code:
Set Shape1 = ... < Punkt, Linie, etc..Dim ModelElement1 As Object Set ModelElement1 = Shape1.GetItem("ModelElement") Dim InternalName1 As String InternalName1 = ModelElement1.InternalName
siehe http://ww3.cad.de/foren/ubb/Forum137/HTML/002077.shtml#000000
Code:
Dim object1 as Object Set object1 = part1.FindObjectByName(InternalName1)
funktioniert übrigens auch.Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tomtom1972 Mitglied dipl ing maschinenbau
Beiträge: 605 Registriert: 22.03.2005 NVidia Quadro K4000 Intel Xeon E5-1620, 64GB RAM Windows10 64bit R30 <= CATIA V5 > =R19
|
erstellt am: 07. Sep. 2011 08:34 <-- editieren / zitieren --> Unities abgeben:
Hallo, Danke für deine Antwort. Die Referenzen stammen wie schon beschrieben aus den Publications in einem Part (oPublications.Item(i).Valuation). Und die sind dann der Art: Part/!Skizze.1 und eignen sich (ohne String-Manipulation) eben nicht für das .FindObjectByName. Das beschriebene Problem habe ich auch nicht mit Geometrieelementen selbst (da werder mit den Refs noch mit den InternalNames) sondern eben mit den Publications. Also explizit: Wie komme ich von einer Publication auf das publizierte Element? Ich bekomme entwerde a)den DisplayName des selbigen heraus (der hilf mir nix, weil eben nicht eindeutig) oder b) eine Referenz auf das publizierte Elemenet. Ein ... .GetItem("ModelElement") und auslesen des .InternalName der Referenz liefert einen CONNECTOR.irgendwas und hilft mir nicht weiter. Bleibt also die Referenz, die ich aus der Publication zurück bekomme. Gruß
------------------ tomtom1972 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
meisterlumpi Mitglied
Beiträge: 118 Registriert: 15.04.2011 Intel Core2 Quad Q6600 2.40 GHz | 4 GB RAM | Win7x64
|
erstellt am: 07. Sep. 2011 09:19 <-- editieren / zitieren --> Unities abgeben: Nur für tomtom1972
|
tomtom1972 Mitglied dipl ing maschinenbau
Beiträge: 605 Registriert: 22.03.2005 NVidia Quadro K4000 Intel Xeon E5-1620, 64GB RAM Windows10 64bit R30 <= CATIA V5 > =R19
|
erstellt am: 07. Sep. 2011 09:35 <-- editieren / zitieren --> Unities abgeben:
Hallo, erster kleiner Schritt weiter. es gibt eine (leider undokumentierte) Methode der HybridShapeFactory namens .GSMGetObjectFromReference, welche direkt das Object einer Referenz (auf ein GSM-Object, aber das reicht mir) zurückgibt, also Code: Set oObjFromRef = oPart.HybridShapeFactory.GSMGetObjectFromReference(oRef1)
Leider funktioniert das (momentan) bei mir nur für Referenzen deren String der Art ist, das er auch für das .FindObjectByName taugen würde (wie in deinem Beitrag weiter oben). Stammt die Ref aus einer Publikation (und ist damit der Art: Part/!Skizze.1) bekomme ich einen Err zurück. Jetzt stelle ich mir die Frage: ist die Valuation einer Pub (oPublications.Item(i).Valuation) überhaupt eine "echte" Referenz? Zumindest gibt mir der Watch von VB das Teil als Typ Variant/Object/Reference an. Gruß ------------------ tomtom1972 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
meisterlumpi Mitglied
Beiträge: 118 Registriert: 15.04.2011 Intel Core2 Quad Q6600 2.40 GHz | 4 GB RAM | Win7x64
|
erstellt am: 07. Sep. 2011 20:39 <-- editieren / zitieren --> Unities abgeben: Nur für tomtom1972
|
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 07. Sep. 2011 21:22 <-- editieren / zitieren --> Unities abgeben: Nur für tomtom1972
Servus Tom Ist die Verwendung einer Selection für dich auch zu langsam, wenn du zuvor CATIA.HSOSynchronized=False setzt? (ich vermute dass du dies schon zuvor gesetzt hast) Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tomtom1972 Mitglied dipl ing maschinenbau
Beiträge: 605 Registriert: 22.03.2005 NVidia Quadro K4000 Intel Xeon E5-1620, 64GB RAM Windows10 64bit R30 <= CATIA V5 > =R19
|
erstellt am: 08. Sep. 2011 10:14 <-- editieren / zitieren --> Unities abgeben:
Hallo, nochmals Danke für die Antworten. Ich gehe jetzt wohl oder übel doch über die Selection, da mir nix anderes einfallen will. Das .HSOSynchronized = False bringt nix, da ich ja jeweils nur ein Element in die Selection übergebe. Ich wüsste auch nicht, wie man die Selection schneller machen könnte, (wobei "langsam" ja auch relativ ist). Es ist halt fehleranfällig sofern der Anwender beim Ausführen des Scripts die Finger nicht still halten kann und im CATIA-Fenster rumfuhrwerkt; deshalb vermeide ich gerne Selections. Der Code (VB6.0): Code: Function FUNC_IntNameBySel(oPub As Variant) As Variant On Error GoTo Err_FUNC_IntNameBySel Dim oVal, oProd, oItem, oModEl As Variant Dim oTestRef As Reference Dim sIntName, sRef As String Dim cRefs As Collection Set cRefs = New Collection Set oVal = oPub.Valuation Set oProd = oPub.Parent.Parent oSelection.Clear oSelection.Add (oVal) Set oItem = oSelection.Item(1).Value oSelection.Clear Set oModEl = oItem.GetItem("ModelElement") sIntName = oModEl.InternalName If InStr(1, sIntName, "gsm", vbTextCompare) Then sIntName = Mid(sIntName, 4) Else GoTo Err_FUNC_IntNameBySel End If '--- Test-Ref mit dem Int.Name des Objektes sRef = Left(oVal.DisplayName, InStr(1, oVal.DisplayName, "!", vbTextCompare)) & sIntName Set oTestRef = oProd.CreateReferenceFromName(sRef) If oTestRef.DisplayName = oVal.DisplayName Then cRefs.Add oVal, sIntName Set FUNC_IntNameBySel = cRefs Else GoTo Err_FUNC_IntNameBySel End If Exit Function Err_FUNC_IntNameBySel: On Error GoTo 0 Set FUNC_IntNameBySel = Nothing End Function
wobei oPub (welches an die func übergeben wird) die Publikation selbst ist (... .Publications.Item(n)) Der Rückgabewert ist eine Referenz (der Art, wie sie zum Erzeugen einer Publication benötigt wird) sowie der InternalName des pub. Elements) oSelection ist global gedimmt (Public). Gruß ------------------ tomtom1972 [Diese Nachricht wurde von tomtom1972 am 08. Sep. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tomtom1972 Mitglied dipl ing maschinenbau
Beiträge: 605 Registriert: 22.03.2005 NVidia Quadro K4000 Intel Xeon E5-1620, 64GB RAM Windows10 64bit R30 <= CATIA V5 > =R19
|
erstellt am: 08. Sep. 2011 10:18 <-- editieren / zitieren --> Unities abgeben:
edit: Dim aRefs(2) Set aRefs(0) = oVal aRefs(1) = sIntName aRefs(2) = sRef cRefs.Add aRefs, sIntName Set FUNC_IntNameBySel = cRefs [Diese Nachricht wurde von tomtom1972 am 08. Sep. 2011 editiert.] [Diese Nachricht wurde von tomtom1972 am 08. Sep. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
meisterlumpi Mitglied
Beiträge: 118 Registriert: 15.04.2011 Intel Core2 Quad Q6600 2.40 GHz | 4 GB RAM | Win7x64
|
erstellt am: 08. Sep. 2011 14:27 <-- editieren / zitieren --> Unities abgeben: Nur für tomtom1972
nochmal zu deiner frage Zitat: Also explizit: Wie komme ich von einer Publication auf das publizierte Element?
mein vorschlag
Code:
Function GetObjectFromPublication(iPublication As Publication, Optional iDocument As Document) As Object On Error Resume Next Dim reference1 As Reference Set reference1 = iPublication.Valuation If iDocument Is Nothing Then _ Set iDocument = CATIA.ActiveDocument With iDocument.Selection .Clear .Add reference1 Set GetObjectFromPublication = .Item(1).Value End With If Err.Number <> 0 Then Set GetObjectFromPublication = Nothing End If End Function
Code:
Function GetInternalNameFromObject(iObject As Object) As String On Error Resume Next Dim ModelElement1 As ModelElement Set ModelElement1 = iObject.GetItem("ModelElement") GetInternalNameFromObject = ModelElement1.InternalName If Err.Number <> 0 Then GetInternalNameFromObject = vbNullString End If End Function
zum Testen in einem Part Dokument...
Code:
Sub CATMain() Dim partDocument1 As PartDocument Set partDocument1 = CATIA.ActiveDocument Dim product1 As Product Set product1 = partDocument1.GetItem("Part1") Dim publications1 As Publications Set publications1 = product1.Publications Dim object1 As Object Dim i As Integer For i = 1 To publications1.Count Set object1 = GetObjectFromPublication(publications1.Item(i)) MsgBox "Objektname: " & object1.Name & Chr(10) & _ "Internal Name: " & GetInternalNameFromObject(object1) Next i End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tomtom1972 Mitglied dipl ing maschinenbau
Beiträge: 605 Registriert: 22.03.2005 NVidia Quadro K4000 Intel Xeon E5-1620, 64GB RAM Windows10 64bit R30 <= CATIA V5 > =R19
|
erstellt am: 08. Sep. 2011 16:33 <-- editieren / zitieren --> Unities abgeben:
Hallo, das ist ja nun im Prinzip das Gleiche, was ich auch mache. Die ursprüngliche Frage Zitat: Also explizit: Wie komme ich von einer Publication auf das publizierte Element
bezog sich ja auf eine Möglichkeit ohne die Sel. Wie gesagt, für den moment werd ich mit der Sel leben müssen. Nochmals Danke & Gruß ------------------ tomtom1972 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |