| |
| KISTERS 3DViewStation - Der Schlüssel zur Einsparung von CAD-Lizenzen, eine Pressemitteilung
|
Autor
|
Thema: Abstand zw.2 Elementen in 2 Parts (2755 mal gelesen)
|
Daeumling Mitglied Student
Beiträge: 23 Registriert: 26.01.2009
|
erstellt am: 29. Jan. 2009 14:45 <-- editieren / zitieren --> Unities abgeben:
Hallo an alle, ich lese hier schon seit einiger Zeit mit und habe nun leider ein Problem bei dem ich irgendwie absolut nicht weiter komme. Bei der Suchfunktion wurde ich leider auch nicht so recht fündig darum versuch ich es einfach mal hier. Auch v5automation half mir so recht nicht weiter. Also ich möchte den Abstand zwischen 2 Punkten ermitteln, welche sich je in 2 Parts von einem Product befinden. Diesen Abstand benötige ich dann, um eine Rohrlänge automatisch zu ermitteln und wollte dann halt den Abstand als Parameter der Länge des Rohrs übergeben. Mit dem hier gefundenen Code kann ich (nach minimaler Abwandlung)schonmal auf die Punkte zugreifen: ----------------------------------------------------------- ----------------------------------------------------------- Sub CATMain () Dim TheSPAWorkbench Dim TheMeasurable Dim mySel Dim mySuchStr(0) mySuchStr(0) = "Point" Set mySel = CATIA.ActiveDocument.selection Call mySel.Clear myFeedback = mySel.SelectElement2(mySuchStr, "P. 1", True) Set myRef1 = mySel.Item(1).Reference Set TheSPAWorkbench = CATIA.ActiveDocument.GetWorkbench("SPAWorkbench") Set TheMeasurable = TheSPAWorkbench.GetMeasurable(myRef1) Call mySel.Clear myFeedback = mySel.SelectElement2(mySuchStr, "P. 2", True) Set myRef2 = mySel.Item(1).Reference MinDist = TheMeasurable.GetMinimumDistance(myRef2) MsgBox MinDist ----------------------------------------------------------- ----------------------------------------------------------- Wenn ich 2 Punkte innerhalb eines Parts messe, dann bekomme ich auch einen "guten" Wert bei heraus. Leider gibt er aber nur den Wert "0" aus, wenn ich 2 Punkte aus 2 verschiedenen Parts ermitteln will. Ich denke es liegt daran, dass er es auf das lokale Koordinatensystem bezieht (die Punkte liegen je auf dem Ursprung) und er deshalb den Abstand zueinander nicht ermitteln kann. Kann ich nun diesen Punkt je auf das globale Koordinatensystem des Products beziehen? Oder kann ich irgendwie die 2 Punkte zu einer Linie verbinden (über AddNewLinePtPt oder sowas) und die Länge der Lineie ermitteln? Es müssen auch nicht zwangsläufig Punkte sein. Ich kann auch die Ebenen der Parts nutzen oder was hat dafür gebraucht wird. Zudem würde ich später gern die Parts und deren Punkte von selber aufrufen lassen, sodass die Selection entfällt. Wie stelle ich das am dümmsten an? (Die Parts heißen eh immer gleich und die gesuchten Punkte ändern sich auch nicht)
Es wäre schön, wenn ihr mir weiterhelfen könntet, da ich sonst echt verzweifle. Ich bin für jeden Rat dankbar. Ihr könnt mir auch gern eine andere Vorgehensweise aufzeigen. Nur zu. Ich bin erst vor kurzem bei der Makroprogrammierung eingestiegen und habe deshalb noch viel zu lernen. schöne Grüße Tobias Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
denyo_1 Ehrenmitglied V.I.P. h.c. Manager
Beiträge: 2506 Registriert: 10.08.2005 HP Compaq 8710w, Intel Core Duo T7700, 2,40 Ghz, 3GB RAM, Windows XP Professionel @32bit, Quadro FX 1600M, CATIA V5 R19 SP3
|
erstellt am: 30. Jan. 2009 09:44 <-- editieren / zitieren --> Unities abgeben: Nur für Daeumling
Hallo Tobias, also bei mir funktioniert dein Skript einwandfrei. Kann es sein, das du zufälligerweise zweimal den selben Punkt angeklickt hast. Da müsste noch ein Abfrage rein sonst kann das passieren und der Abstand ist natürlich null. Ich Frage mich aber ob das was du vorhast so sinnvoll ist. Du willst die Messung hernehmen um die Länge eines Rohres zu definieren? Gehen wir mal davon aus, das die 3 Parts in deinem Produkt hast. Im ersten ist der erste Punkt, im zweiten der zweite und im dritten ist die Geometrie für dein Rohr. Publiziere die beiden Punkte und nutze sie zur Definition der Achse (des dritten Parts). So kannst du eine direkte Verbindung (link) herstellen und brauchst dafür kein Makro. Dein Parameter den du sonst erzeugst beruht nämlich auf einer Messung (die nicht im Baum abgelegt wird). Von dem her wird dir der Parameter zwar die Länge anzeigen zur Laufzeit des Makro´s, es kann ja aber sein, das sich die Punkte nochmal verschieben. Dann musst du das Makro nochmal starten um die Länge erneut zu messen und an den Parameter zu übergeben. Oder verstehe ich dich komplett falsch? ------------------ MFG Daniel Die KATJA ist halt doch nur ne zickige Französin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Daeumling Mitglied Student
Beiträge: 23 Registriert: 26.01.2009
|
erstellt am: 30. Jan. 2009 12:24 <-- editieren / zitieren --> Unities abgeben:
Hallo Daniel, danke für deine Hilfe. Nein, das sind 2 verschiedene Punkte welche ich im Strukturbaum ausgewält habe (CENTER_IN aus Part 01 und CENTER_OUT aus Part 2) Beide Punkte liegen auf ihrem Achsenzentrum also (X=0;y=0;z=0) Kann es vllt. daran liegen? Okay. Da könntest du Recht haben. Ich hatte mir das nämlich so gedacht. Ich habe eine Achse an der ich eine Art Schelle anbringen muss. Auf der anderen Seite ist ein Punkt an den er hin muss. Dazwischen wir ein weiteres Part mit einer Schelle eingefügt werden, an der das Rohr und dessen Länge mit integriert ist. Erst wollte ich das Rohr als zu lang einfügen, dann den Abstand der Punkte messen und Abzüglich der Länge bis zu ihren Aufnahmen dann das Rohr halt auf die Länge anpassen. Das Problem ist hier auch, dass ich quasi nicht bis direkt an die Punkte konstruieren kann, sondern in einem gewissen Offset. Ich könnte aber einen Punkt ins Part setzen bis wohin er ran konstruieren soll, oder? Das klingt echt sinnig.. manchmal macht man sich es glaube ich viel zu schwer im Leben.. Ich werde mal sehen das sich machen lässt..danke für den Tip..manchmal ist man glaube ich viel zu versteift auf eine Lösung, sodass man das Einfache nicht mehr sieht. Danke nochmal und bis nachher denke ich Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
denyo_1 Ehrenmitglied V.I.P. h.c. Manager
Beiträge: 2506 Registriert: 10.08.2005 HP Compaq 8710w, Intel Core Duo T7700, 2,40 Ghz, 3GB RAM, Windows XP Professionel @32bit, Quadro FX 1600M, CATIA V5 R19 SP3
|
erstellt am: 30. Jan. 2009 12:40 <-- editieren / zitieren --> Unities abgeben: Nur für Daeumling
Hallo, puh, kannst du mal ein Bild reinstellen? Das sagt manchmal mehr als tausend Worte . ich denke aber dein Problem lässt sich ganz einfach mit den Puplications lössen. ------------------ MFG Daniel Die KATJA ist halt doch nur ne zickige Französin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Daeumling Mitglied Student
Beiträge: 23 Registriert: 26.01.2009
|
erstellt am: 30. Jan. 2009 12:56 <-- editieren / zitieren --> Unities abgeben:
|
Daeumling Mitglied Student
Beiträge: 23 Registriert: 26.01.2009
|
erstellt am: 30. Jan. 2009 13:05 <-- editieren / zitieren --> Unities abgeben:
Ich bins dann nochmal, ich habe versucht das Problem anders anzugehen. AUch wenn es der umständliche Weg ist habe ich noch eine Frage dazu, warum es nicht funktioniert. Hier erstmal der Quelltext: ------------------- ------------------- Sub CATMain() ' Neues CATProduct erzeugen ------------------------------------- Dim aDoc As Documents Set aDoc = CATIA.ActiveDocument Dim Wurzel As Product Set Wurzel = aDoc.Product ' CATPart erzeugen / umbenennen -------------------------- Dim P1 As Product Set P1 = Wurzel.Products.AddNewComponent ("Part", "ROHR") CATIA.ActiveDocument.Product.Products.Item(5).Name = "ROHR_L" 'auf oberster Ebene Hilfspart zur Laengenmessung erstellt (5.Stelle im Ordner) Set docs = CATIA.Documents Set PartDoc = docs.Item("ROHR.CATPart") Set Part1 = PartDoc.Part Set hybridBodies1 = Part1.HybridBodies Set hybridBody1 = hybridBodies1.Add() Set hybridShapeFactory1 = Part1.HybridShapeFactory Set parameters1 = Part1.Parameters
Set product1 = CATIA.Documents.Item("TTM_KONSTR_B1-38D222222.CATProduct").Product
Set reference1 = product1.CreateReferenceFromName("TTM_KONSTR_B1-38D222222/T_VERBINDER_VMR/!CENTER_OUT") Set reference2 = product1.CreateReferenceFromName("TTM_KONSTR_B1-38D222222/KUGELVERBINDER_VMR/!CENTER_IN") Set hybridShapeLinePtPt1 = hybridShapeFactory1.AddNewLinePtPt(reference1, reference2) ' hier Fehler
hybridBody1.AppendHybridShape hybridShapeLinePtPt1 part1.InWorkObject = hybridShapeLinePtPt1 part1.Update End Sub .----------- ------------ Es sollte mir quasi "nur" eine Hilfslinie erstennen in einem neuen Part. Nun sollte er je die Public Punkte aus den anderen Parts direkt als Referenz nehmen. Da meckert er aber rum, dass er das nicht kann. Hat jemand eine Idee warum? Also mich interessiert nur warum dies nicht geht. Weil mit Achsen aus versch. Parts ging es eigetnlich diese als Referenzen für Constrains zu nehmen. Mir gehts nur darum den Fehler meines denkens zu verstehen und nicht den umständlichen Weg weiterzuverfolgen Weil nützlich kann sowas ja immer mal sein, darum Vllt. hat ja jmd. einen Rat? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Daeumling Mitglied Student
Beiträge: 23 Registriert: 26.01.2009
|
erstellt am: 02. Feb. 2009 10:02 <-- editieren / zitieren --> Unities abgeben:
Habe es versucht anders zu lösen: Ich habe nun eine Ebene in den T Verbinder gesetzt und als external Referenz ins Part vom Rohr eingefügt und verschneide es damit. NUN habe ich aber das Problem, dass die T Verbinder 8 mal eingefügt werden sollen und auch dementsprechend immer anders heißen. Weiß jemand wie ich auf deren Namen am besten immer zugreifen kann bzw. ans Part übergeben kann? Also sodass er nach dem Einfügen meiner 8 Rohre auch immer die im zugeordnete Ebene zugewiesen wird mit der er verschnitten werden soll?! Vielen Dank schonmal für die Hilfe.. und Danke an Daniel für den Tip des einfachen Weges! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
denyo_1 Ehrenmitglied V.I.P. h.c. Manager
Beiträge: 2506 Registriert: 10.08.2005 HP Compaq 8710w, Intel Core Duo T7700, 2,40 Ghz, 3GB RAM, Windows XP Professionel @32bit, Quadro FX 1600M, CATIA V5 R19 SP3
|
erstellt am: 02. Feb. 2009 10:44 <-- editieren / zitieren --> Unities abgeben: Nur für Daeumling
Hallo Daeumling, das versteh ich jetzt nicht ganz. Sind deine Rohre immer gleich lang oder hast du 8 verschiedene. Warum willst du auf den Namen zugreifen. Erstell die Ebene in dem T-Verbinder, füg alle zum Produkt hinzu, füg deine 8 Rohre hinzu, und Splitte direkt im Produkt an dein Ebenen. Das sollte doch gehen ------------------ MFG Daniel Die KATJA ist halt doch nur ne zickige Französin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Daeumling Mitglied Student
Beiträge: 23 Registriert: 26.01.2009
|
erstellt am: 02. Feb. 2009 11:36 <-- editieren / zitieren --> Unities abgeben:
Hallo Daniel, danke für deine Hilfe. Also die Rohre werden 8mal reingeladen(das Bild oben stellt quasi das ganze nur einmal von 8 dar!) und umbenannt abgespeichert, sodass auch alle eine unterschiedliche Länge haben können. Mir wurde gesagt, dass es nur geht, wenn ich in dem T Verbinder die Ebene als Publikation veröffentliche und halt beim Rohr als external Ref. reinlade. Ich werde mal sehen, ob und vor allem wie ich es hinbekomme die Ebene da im Produkt zu veröffentlichen. So bewandert bin ich in diesen Parametern leider nicht, welche voneinander abhängig sind... Grüße Tobias Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
denyo_1 Ehrenmitglied V.I.P. h.c. Manager
Beiträge: 2506 Registriert: 10.08.2005 HP Compaq 8710w, Intel Core Duo T7700, 2,40 Ghz, 3GB RAM, Windows XP Professionel @32bit, Quadro FX 1600M, CATIA V5 R19 SP3
|
erstellt am: 02. Feb. 2009 13:06 <-- editieren / zitieren --> Unities abgeben: Nur für Daeumling
Hi, hab hier mal ein kleines Beispielprodukt gemacht wie sowas aussehen könnte. Der Ablauf ist wie folgt: 1. Ebene in den T-Verbindern erstellen (an der gesplittet werden soll). Da du ja immer den selben Verbinder hernimmst, hast du die Ebene in allen Instanzen verfügbar 2. Zurück ins RootProdukt wechseln und dort unter Tools -> Publications alle Ebenen publizieren (das ist aber nicht zwingend notwendig, kommt auf die Einstellungen an) 3. Die Rohre einfügen und positionieren 4. In den Options nachschauen ob folgendes Kästen aktiviert ist: => Tools -> Options -> Infrastructure -> Part Infrastructure -> Generell -> Keep link with selected 5. Die Rohre an den Ebene im PartDesign (also in die Bauteilbearbeitung für jedes Rohr) Splitten ACHTUNG: Falls du irgendein PDM System nutzt, musst du schaun wie die Links dort verwaltet werden. Da aber bei deinem Teil alle Bauteile eine eigene Dok-Nummer haben sollten sollte das kein Problem darstellen. Schau dir einfach mal den Aufbau von dem Beispiel an. ------------------ MFG Daniel Die KATJA ist halt doch nur ne zickige Französin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Daeumling Mitglied Student
Beiträge: 23 Registriert: 26.01.2009
|
erstellt am: 10. Feb. 2009 13:08 <-- editieren / zitieren --> Unities abgeben:
Hallo, hab leider das Probramm erst jetzt Testen können, da sich noch anderen Probleme im Vorfeld aufgetan hatten. Danke erstmal für deine Mühe! Leider geht das Verschneiden leider nicht so wie ich es mir erhofft hatte. Die Ebenen im T Verbinder kann ich und habe dort auch die Public Ebenen zum Verschneiden eingefügt. Bei den Rohren denke ich nicht, dass das so einfach möglich ist, denn jedes Rohr heißt z.B: Kugel_VR, Kugel_VMR, .. Jeder T-Verbinder wird beim EInfügen auch also Adapter_VR. Adapter_VMR, .. umbenannt. Wenn ich im Hauptpart (wodraus Adapter, Kugel genommen, umbenannt und abgespeichert wird) aber eine external Referenze einbinde bezieht sich diese ja genau auf eine bestimmte Ebene. Kann ich irgendwie auf die Zuordnung der ext.Ref. zugreifen? Also den Pfad dazu ändern oder vorm Spliten neu anlegen? Hab auch mal versucht die ganze Prozedur mit dem Makrorekorder aufzuzeichnen.. Nachdem ich alles wieder Rückgängig gemacht habe hat er Makro nicht mehr funktioniert -.- Irgendwie hat Catia auch aotomatisch ext. Referenzes angelegt, diese aber nicht im Makrorecorder aufgenommen. Weil genau das wäre es was ich benötige, sodass es Funktioniert. Kann mir wer helfen? :/ Schöne Grüße Tobi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
denyo_1 Ehrenmitglied V.I.P. h.c. Manager
Beiträge: 2506 Registriert: 10.08.2005 HP Compaq 8710w, Intel Core Duo T7700, 2,40 Ghz, 3GB RAM, Windows XP Professionel @32bit, Quadro FX 1600M, CATIA V5 R19 SP3
|
erstellt am: 10. Feb. 2009 14:25 <-- editieren / zitieren --> Unities abgeben: Nur für Daeumling
Hallo, externe Komponenten legt CATIA automatisch im Hintergrund an falls du Funktion "keep link with selected.." aktiviert ist. Das kann der Makrorekorder nicht mit aufnhmen, da der Makrorekorder keine Paste-Operation kennt. D.h. du musst in deinem Skript erst mal die Ebene von deinem Verbinder in das Part des Rohres mit as Result "with Link" kopieren und anschließend diese Ebene hernehmen. Die refernz erzeugst du dann während des Kopiervorgangs automatisch. ------------------ MFG Daniel Die KATJA ist halt doch nur ne zickige Französin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Daeumling Mitglied Student
Beiträge: 23 Registriert: 26.01.2009
|
erstellt am: 12. Feb. 2009 10:18 <-- editieren / zitieren --> Unities abgeben:
Hallo! Hab es endlich gelöst bekommen..irgendwie Hab es nun doch umständlich über Ausmessen und Vergleichen gemacht und auf die Public-Elemente zugegriffen. Die kann er komischerweise gegeneinander vermessen. Um auch endlich mal etwas zurückzugeben hier der Quelltext: Function Is_On () Set ActivePub = CATIA.ActiveDocument.Product.Publications Set TheSPAWorkbench = CATIA.ActiveDocument.GetWorkbench("SPAWorkbench") Set oPub2 = CATIA.ActiveDocument.Product.Products.Item(4).Products.Item("Ebene") Set oPublic2 = oPub2.Publications.Item("POINT_Name") 'greift auf Publ. der Ebene Set Ref_T = oPublic2.Valuation DIM Drauf 'as boolean Drauf = false For j = 1 To 4 Dim PktName 'As String Dim LaufNr 'As Integer Dim Pkt 'As String Set RefBalkenP1 = ActivePub.Item("PktName1").Valuation 'alle ungeraden Pkt mit Set RefBalkenP2 = ActivePub.Item("PktName2").Valuation 'allen geraden vergleichen Dim Gesamtlength Set Measurable1 = TheSPAWorkbench.GetMeasurable(RefBalkenP1) Gesamtlength = Measurable1.GetMinimumDistance(RefBalkenP2) Dim distanceP1PM Set Measurable1 = TheSPAWorkbench.GetMeasurable(RefBalkenP1) distanceP1PM = Measurable1.GetMinimumDistance(Ref_T) 'MsgBox ("P1PM: " & distanceP1PM & "mm") Dim distancePMP2 Set Measurable1 = TheSPAWorkbench.GetMeasurable(RefBalkenP2) distancePMP2 = Measurable1.GetMinimumDistance(Ref_T) 'MsgBox ("PMP2: " &distancePMP2 & "mm") 'Msgbox ("Gesamt: " &distanceP1PM+distancePMP2) Gesamt = distanceP1PM+distancePMP2 If Gesamt = Gesamtlength then Drauf = true MsgBox ("Der liegt drauf") End If Next If Drauf = false then MsgBox("Liegt nicht drauf") Else MsgBox("Liegt drauf der Wurm!") End If [Diese Nachricht wurde von Daeumling am 12. Feb. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Schorschie Mitglied Student Maschinenbau
Beiträge: 14 Registriert: 28.11.2006
|
erstellt am: 24. Feb. 2009 16:29 <-- editieren / zitieren --> Unities abgeben: Nur für Daeumling
Hallo Forum, Ich hab das letzte Listing nicht ganz begriffen, aber denke, dass das ursrpüngliche Problem: "Wie messe ich den Abstand zweier Punkte in verschiedenen Parts?" nicht gelöst wurde. Ich hab nämlich gerade dasselbe Problem und wäre für einenen Lösungsansatz dankbar. Mein erster Versuch war "dem des Däumlings" ähnlich und auch bei mir liefert das Skript nicht die gewünschten Ergebnisse:
Code:
Set MyOriginElements = MyOriginPart.OriginElements Set RefToYZPlane = MyOriginPart.CreateReferenceFromObject(MyOriginElements.PlaneYZ) Set RefToZXPlane = MyOriginPart.CreateReferenceFromObject(MyOriginElements.PlaneZX) Set RefToXYPlane = MyOriginPart.CreateReferenceFromObject(MyOriginElements.PlaneXY) Set RefToPoint = MyPartOfPoint.CreateReferenceFromObject(MySelectedPoint) Set MyMeasure = MySPAWorkbench.GetMeasurable(RefToPoint) vCoordinates(0) = MyMeasure.GetMinimumDistance(RefToYZPlane) vCoordinates(1) = MyMeasure.GetMinimumDistance(RefToZXPlane) vCoordinates(2) = MyMeasure.GetMinimumDistance(RefToXYPlane)
Das Ergebnis entspricht den Koordinaten des Punktes in seinem Part und nicht im "OriginPart". [Diese Nachricht wurde von Schorschie am 24. Feb. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Daeumling Mitglied Student
Beiträge: 23 Registriert: 26.01.2009
|
erstellt am: 24. Feb. 2009 18:32 <-- editieren / zitieren --> Unities abgeben:
Hallo, bei mir ging es nur, wenn ich die Linien oder Punkte vorhher als Publics (Tools -> Publications) veröffentlicht habe. Dann konnte ich die Punkte aus versch. Parts gegeneinander vermessen Grüße Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CadV5UserR Mitglied Dipl.Ing. Maschinenbau
Beiträge: 79 Registriert: 18.04.2008 Windows 7 x64 Professional SP1 Dell Precision T3500 Intel Xeon CPU W3580 3.33GHz 24Gb Ram NVIDIA Qudro 4000 Catia V5R20 Sp6 SmarTeam V5R20 SP6
|
erstellt am: 26. Feb. 2009 08:44 <-- editieren / zitieren --> Unities abgeben: Nur für Daeumling
Hallo Daeumling, Ich hatte vor einiger Zeit ein ähnliches Problem. Bei mir funktionierte das so auch nicht. Erst nachdem ich den >kompletten Pfad< mit in die Reference speicherte klappte es.
Probier mal folgendes aus: Beispiel: product1.CreateReferenceFromName("Product1/Part2.1/!Punkt.1") Set ref2 = product1.CreateReferenceFromName(PfadName01) Für beide Reference suche. Gruß CadV5UserR Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |