Autor
|
Thema: 3D Annotations, zugehöriges Element finden (3220 mal gelesen)
|
MarcDe Mitglied
Beiträge: 137 Registriert: 11.10.2006 CATIA R18 SP2, BN 18, HF 162 Win 7 64Bit
|
erstellt am: 13. Mrz. 2013 16:36 <-- editieren / zitieren --> Unities abgeben:
Hallo Profis, ich bin gerade dabei die zugehörige Linie einer 3D Annotaion zu finden. Wenn ich mir da mal die Klassenstrukturen anschaue, dann wäre das hier ja ideal: Code:
Sub catmain()Dim partDocument1 As PartDocument Set partDocument1 = CATIA.ActiveDocument Dim part1 As Part Set part1 = partDocument1.Part Dim annotationSets1 As AnnotationSets Set annotationSets1 = part1.AnnotationSets Dim annotationSet1 As AnnotationSet Set annotationSet1 = annotationSets1.Item("Annotation Set.1") Dim anno As Annotation Set anno = annotationSet1.Annotations.Item(1) Dim dt As DrawingText Set dt = anno.Text.Get2dAnnot Dim el As AnyObject Set el = dt.AssociativeElement MsgBox el.Name End Sub
Leider ist die Property "AssociativeElement" => failed. VBA stellt sich auch an und gibt Interface-Warnungen raus. Das ganze Funktioniert also irgendwie nicht oder ich bin zu blöd Die Aufgabe ist es zu der richtigen Linie (beliebig viele) die zugehörige 3D Annotation bzw. den darauf befindlichen Text zu speichern. Hat da jmd. einen Tipp? Meine andere Idee ist es über Code: dt.Leaders.Item(1).GetPoint(1, x, y)
zu gehen, aber die Koordinaten haben keinen wirklichen Bezug zu meinen Koordinaten der Linie (Anfangs + Endpunkt zum Beispiel). Ich kann diese also nicht wirklich zu den 3D-Koordinanten zuordnen, weil die Koordinaten, die GetPoint zurückliefert zwar von der Spitze des Leaders ist, welche sich unmittelbar an der Linie befindet), jedoch diese auf die FrontView der Annotations bezogen sind. Grüße Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HoBLila Mitglied Dipl.-Ing. (BA) praktische Informatik - Senior Entwickler CAx
Beiträge: 1118 Registriert: 29.05.2008 DELL PRECISION T3500 Intel(R) Xeon(R) CPU W3540 @ 2.93GHz 12285 MB RAM NVIDIA Quadro FX 1800 Microsoft Windows 7 Enterprise Service Pack 1 CATIA V5 R19 SP09 HF69 VB6.5 CAA RADE CDC
|
erstellt am: 14. Mrz. 2013 11:13 <-- editieren / zitieren --> Unities abgeben: Nur für MarcDe
Hallo MarcDe, vielleicht hilft Dir das schon weiter: Grundbedingung für das beispiel: Annotation ist bereits selektiert. Code:
Public Sub CATMain() Dim annoWork As AnnotationTypeLib.Annotation Dim arrVarSurf() As Variant Dim objAnnoWork As Object Dim selWork As INFITF.Selection Dim sName As String Set selWork = CATIA.ActiveDocument.Selection Set annoWork = selWork.Item2(1).Value Set objAnnoWork = annoWork ReDim arrVarSurf(annoWork.GetSurfacesCount - 1) Call objAnnoWork.GetSurfaces(arrVarSurf) Call MsgBox(arrVarSurf(0)) sName = CStr(arrVarSurf(0)) Call selWork.Search("Name=" & Right(sName, Len(sName) - InStrRev(sName, "/"))) End Sub
Edit: Code um die Suche erweitert. Das ist aber noch nicht die Lösung schlechthin, da es mehrere Elemente mit dem namen gibt. In sName steht aber die komplette Struktur, weshalb man sich durchhangeln könnte. Eventuell solltest Du ein neues Thema starten, wie man am besten vom kompletten pfad einer Geometrie zu dessen Objekt kommt. Eventuell über die .Find-Methode des Part. ------------------ Mit freundlichen Grüßen, Henry Schneider alias Lila Es gibt einen ewigen Wettkampf zwischen der Natur und den Ingenieuren: Die Ingenieure versuchen, immer idioten-sicherere Systeme zu bauen, die Natur versucht, immer bessere Idioten zu bauen Xing [Diese Nachricht wurde von HoBLila am 14. Mrz. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MarcDe Mitglied
Beiträge: 137 Registriert: 11.10.2006 CATIA R18 SP2, BN 18, HF 162 Win 7 64Bit
|
erstellt am: 15. Mrz. 2013 09:58 <-- editieren / zitieren --> Unities abgeben:
Hallo Henry, erstmal mega vielen Dank für den Code, das ist ja wirklich schon fast die Lösung . Ich teste gerade damit und es klappt gut, zumindest solange die Annotation erstellt wurde, indem auf ein Element geklickt und diese nicht bezugslos erstellt wurde (logisch). Ich habe mir in C# schon mal eine Linq-Erweiterungsmethode geschrieben, die genau diesen Pfad, der in "arrVarSurf(0)" drin steht als Parameter bekommt und mir gleich das Objekt zurückliefert, damit ich nicht so viel schreiben muss :-) a la "HybridBodies.Item(x).Hybrid.... Allerdings wie du bereits gesagt hast, gibt es diesbezüglich ein Problem, wenn es Namen doppelt gibt. Das ist dann aber so. Es wäre natürlich schöner, wenn man irgendwie aus der Annotation ohne Umwege das Objekt an sich bekommen würde ohne es sich noch suchen zu müssen Ich hab aber noch ein viel blöderes Problem und zwar: Teilweise sind die Annotations auf einen Punkt referenziert, welcher sich in einer Skizze befindet und ich bekomme dann so einen Pfad: ../Inner Spar Upper Bolting Layouts/Bay 10 Upr/Sketch_BAY-10/Vertex Jetzt muss ich irgendwie an die Koordinaten von diesem Vertex herankommen, um mein ursprüngliches Problem weiter verfolgen zu können Unterhalb der Skizze im Baum ist z. B. dieser Vertex in "Geometry" als "Point.14" aufgelistet, aber das kriege ich natürlich aus dem zurückgelieferten String von GetSurfaces nicht raus. Ich befürchte fast hier ist Endstation? Viele Grüße Marc Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HoBLila Mitglied Dipl.-Ing. (BA) praktische Informatik - Senior Entwickler CAx
Beiträge: 1118 Registriert: 29.05.2008 DELL PRECISION T3500 Intel(R) Xeon(R) CPU W3540 @ 2.93GHz 12285 MB RAM NVIDIA Quadro FX 1800 Microsoft Windows 7 Enterprise Service Pack 1 CATIA V5 R19 SP09 HF69 VB6.5 CAA RADE CDC
|
erstellt am: 15. Mrz. 2013 15:14 <-- editieren / zitieren --> Unities abgeben: Nur für MarcDe
Das würde ich generell über die SPAWorkbench machen und dann davon .GetMeasurable() und dann das messen. http://ww3.cad.de/foren/ubb/Forum137/HTML/004946.shtml#000001 Denke, das sollte schon helfen, ansonsten wird's etwas kniffeliger, aber sollte auch Lösungen dafür geben. Oder ist das Problem, dass Du aus dem Pfad kein Objekt bekommst? Dann müssen wir schauen, ob wir daraus vielleicht eine Referenz bilden können, sieht mir aus wie eine, und diese dann messen können oder zur Not über die Selection selektieren und dann das Objekt dort wieder raus holen.
Ja das FTA-Modul sieht mir so aus, als hätte es ein Praktikant geschrieben, wie ich immer sage, da passt nix zusammen und keine Schnittstelle ist gut und auch nichts richtig dokumentiert... Ich würde mir als Unternehmen auch eher das Geld dafür sparen und lieber eine eigene Workbench bauen… - leider ist die Welt nicht so einfach… :-( Über die .GetTopologicalObject() und .GetItem() Methoden lässt sich oft noch was rausholen, aber dafür muss man wissen wie die Klassen heißen… :-( Mit doppelten Namen sollte es kein problem geben, wenn Du eine Methode / Funktion hast, die sich anhand des Pfades durch die Struktur hangelt. Habe nur noch keine Funktion dafür geschrieben, ist ja auch nicht ganz trivial, aber nützlich. Edit: Noch ne Idee - vielleicht lässt sich aus den UserProfiles etwas rausholen, die muss man, glaube ich, vor der Annotation aus der Geometrie erzeugen um dann die Annotation darauf zu referenzieren. ------------------ Mit freundlichen Grüßen, Henry Schneider alias Lila Es gibt einen ewigen Wettkampf zwischen der Natur und den Ingenieuren: Die Ingenieure versuchen, immer idioten-sicherere Systeme zu bauen, die Natur versucht, immer bessere Idioten zu bauen Xing [Diese Nachricht wurde von HoBLila am 15. Mrz. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MarcDe Mitglied
Beiträge: 137 Registriert: 11.10.2006 CATIA R18 SP2, BN 18, HF 162 Win 7 64Bit
|
erstellt am: 15. Mrz. 2013 15:52 <-- editieren / zitieren --> Unities abgeben:
Hey zurück, naja ich kann ja erst etwas messen, wenn ich das Objekt besitze und aus dem String: "../Inner Spar Upper Bolting Layouts/Bay 10 Upr/Sketch_BAY-10/Vertex" kann ich kein Objekt bilden bzw nur bis zur Skizze, aber "Vertex" sagt nichts aus, außer dass es ein Punkt/Vertex ist. Aber welcher Punkt in der Sketch ist nicht klar, es gibt da mehrere. Ich glaube ich muss etwas ausholen und das Problem etwas im Detail beschreiben. Dazu habe ich mal das Bild angehängt. Ich möchte herausfinden zu welcher Linie die Annotation gehört. Die Annotation klebt jedoch an dem Punkt einer Sketch und in der Sketch gibt es mehrere Punkte und GetSurfaces liefert mir den String (s. oben) zur Sketch bzw. zu einem Vertex in der Sketch, aber welcher das ist, ist nicht klar. Der Punkt der Sketch liegt jedoch direkt auf der Linie! Die Lösung oder besser gesagt eine Lösung wäre, wenn ich an die Koordinaten des Vertex herankommen könnte d.h. daraus ein Objekt erstellen könnte, dann könnte ich den Punkt und die Linie messen und wenn Abstand=0mm+Toleranz, dann hätte ich meine Zuordnung zur Linie und der Annotation und damit gewonnen. Zitat:
Mit doppelten Namen sollte es kein problem geben, wenn Du eine Methode / Funktion hast, die sich anhand des Pfades durch die Struktur hangelt. Habe nur noch keine Funktion dafür geschrieben, ist ja auch nicht ganz trivial, aber nützlich.
Wieso sollte es da kein Problem geben? Wenn der Pfad mich als Beispiel zu einem Geoset bringt und darunter das Element "ABC" heißt und es zufällig in dem Set zwei oder mehrere Elemente mit "ABC" gibt, dann bekomme ich über Hybridshapes.Item("ABC") natürlich nur das erste und nicht u. U. das zweite oder dritte, was möglicherweise gemeint war. Es sei denn ich hab die Nummer/Position des Elements innerhalb des Sets, aber diese liefert mir "../Inner Spar Upper Bolting Layouts/Bay 10 Upr/Sketch_BAY-10/Vertex" ja nicht, sondern nur den Namen. Oder versteh ich da etwas falsch? BTW: Ich kann meine C# Linqmethode gerne demnächst mal publizieren, sieh ist echt geil und erleichtert einem die Zugriffe auf Sets und Elemente in verschachtelten und tiefen Strukturen erheblich, denn alles kann in einer Zeile mit "\\" getrennt angegeben werden und außerdem bekommt man eine vernünftige Meldung (und nicht "Mitglied nicht gefunden", wenn ein Set oder Element nicht gefunden wurde, weil der Konstrukteur es umbenannt hat (das alte Problem, jeder kennt es). Und diese Methode integriert sich automatisch ins Intellisense, d.h. sie ist an der richtigen Stelle nämlich als Api-Extension der Klasse "HybridBodies" verfügbar und verhält sich so, als wäre sie von DS selbst dort implementiert. Sehr angenehm :) Zitat: Noch ne Idee - vielleicht lässt sich aus den UserProfiles etwas rausholen, die muss man, glaube ich, vor der Annotation aus der Geometrie erzeugen um dann die Annotation darauf zu referenzieren.
Das sagt mir jetzt mal gar nichts Ich habe nur eine View "Front View" und die Notes unter dem Hauptknoten "Annotation" im Baum. Ich sag mal so: Das Problem der Zuordnung wäre unter der Bedingung, dass es keine Elemente mit doppeltem Namen gibt und die Annotation im Bild nicht auf den Punkt der Sketch sondern direkt auf die Linie bezogen wäre gelöst, da GetSurfaces dann den String bis zum Element zurückgibt und ich mich zum Element mit dem Namen durchhangeln kann. Aber dieser Fall ist hier anders. Mit der Selektion eine Referenz bilden klingt gut ja, aber wie aus dem obigen String von GetSurfaces eine Referenz bilden, also in diesem Fall aus dem Vertex? Wenn das gehen würde, dann könnte ich ja auch messen und/oder Koordinaten zum Vergleich heranziehen, ob der Punkt auf der Linie liegt oder nicht. Vielen Dank nochmal für deine Tips. Vielleicht kriegen wirs ja noch hin Grüße Marc Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|