| |
 | CATIA V5 Grundkurs | Einsteiger - 5 Std. 15 Min 48 |
| |
 | KISTERS 3DViewStation: Unterstützung für 3D CAD Kollaboration mit Lieferanten, eine Pressemitteilung
|
Autor
|
Thema: Achsensystem mit Referenz auf bestehendes Achsensystem erstellen (225 / mal gelesen)
|
user7 Mitglied

 Beiträge: 39 Registriert: 26.08.2022
|
erstellt am: 12. Aug. 2025 18:03 <-- editieren / zitieren --> Unities abgeben:         
Hallo zusammen, ich würde gerne in einem Part ein Achsen-System erstellen, welches sich auf ein bestehendes Achsen-System bezieht. Code:
AxisSystem existingAxisSystem = myexistingAxisSystem; AxisSystem myNewAxisSystem = mypart.AxisSystems.Add();
Meine Intuition wäre gewesen, eine Referenz auf das bestehende Achsensystem zu erzeugen und dann mit AxisRotationReference die Referenz zuzuordnen:
Code:
Reference referenceToExistingAxisSystem = myPart.CreateReferenceFromObject(existingAxisSystem); /// myPart enthält beide Achsensysteme myNewAxisSystem.AxisRotationReference = referenceToExistingAxisSystem; /// crash
Hat jemand eine Idee, wie ich diese Referenz programmatisch herstellen kann? Das Ergebnis sollte so aussehen (Reference Axis System enthält die Bezugsachse, und im Baum hat die Achse keine Definition von x,y,z usw.): 
Ist AxisRotationReference der völlig falsche Dampfer, oder habe ich "nur" die falsche Referenz von dem Bezugs-Achsensystem an der Hand?
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
       
 Beiträge: 12099 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 12. Aug. 2025 18:18 <-- editieren / zitieren --> Unities abgeben:          Nur für user7
Servus Du könntest mal versuchen in VBA/CATScript per Makroaufzeichnung schauen ob das aufgezeichnet wird. Kommt da was brauchbares als Einstieg raus? (so schau ich häufig wie was gehen könne (oder per Watch/Local-Fenster bestehende Features zu untersuchen)) (kann es selbst nicht testen, in meinen Catia Release gibt es die Funktion noch nicht bei einem Achsensystem Type: Standard) Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
user7 Mitglied

 Beiträge: 39 Registriert: 26.08.2022
|
erstellt am: 12. Aug. 2025 19:23 <-- editieren / zitieren --> Unities abgeben:         
Hi Bernd, Dieses Mal hab ich das tatsächlich zunächst probiert. Leider kam da nur eine absolute Definition der Achsen raus. Die Magie die das dann per Referenz verknüpft war da leider nicht mit aufgelistet.. ich werd morgen das Makro Mal noch drunter posten. Viele Grüße Matthias Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
user7 Mitglied

 Beiträge: 39 Registriert: 26.08.2022
|
erstellt am: 13. Aug. 2025 08:42 <-- editieren / zitieren --> Unities abgeben:         
Code:
Set partDocument1 = documents1.Item("mypart.CATPart")Set part1 = partDocument1.Part Set axisSystems1 = part1.AxisSystems Set axisSystem1 = axisSystems1.Add() axisSystem1.OriginType = catAxisSystemOriginByCoordinates Dim arrayOfVariantOfDouble1(2) arrayOfVariantOfDouble1(0) = -400.000000 arrayOfVariantOfDouble1(1) = 0.000000 arrayOfVariantOfDouble1(2) = 600.000000 axisSystem1.PutOrigin arrayOfVariantOfDouble1 axisSystem1.XAxisType = catAxisSystemAxisByCoordinates Dim arrayOfVariantOfDouble2(2) arrayOfVariantOfDouble2(0) = 0.000000 arrayOfVariantOfDouble2(1) = 1.000000 arrayOfVariantOfDouble2(2) = 0.000000 axisSystem1.PutXAxis arrayOfVariantOfDouble2 axisSystem1.YAxisType = catAxisSystemAxisByCoordinates Dim arrayOfVariantOfDouble3(2) arrayOfVariantOfDouble3(0) = -0.990268 arrayOfVariantOfDouble3(1) = 0.000000 arrayOfVariantOfDouble3(2) = -0.139173 axisSystem1.PutYAxis arrayOfVariantOfDouble3 axisSystem1.ZAxisType = catAxisSystemAxisByCoordinates Dim arrayOfVariantOfDouble4(2) arrayOfVariantOfDouble4(0) = -0.139173 arrayOfVariantOfDouble4(1) = 0.000000 arrayOfVariantOfDouble4(2) = 0.990268 axisSystem1.PutZAxis arrayOfVariantOfDouble4 part1.UpdateObject axisSystem1 axisSystem1.IsCurrent = False part1.Update Set settingControllers1 = CATIA.SettingControllers
Das ist das aufgezeichnete Makro. Bei Ausführung ist die magische Referenz wie erwartet nicht da. Es wird also kein Link zum Bezugs-Achsensystem hergestellt..
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
       
 Beiträge: 12099 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 13. Aug. 2025 08:50 <-- editieren / zitieren --> Unities abgeben:          Nur für user7
Servus Liefert dir das Watch/Localfenster Hinweise? Gibt es in der Doku zusätzlich zu AxisRotationReference noch weitere Eigenschaften die passend scheinen? Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
user7 Mitglied

 Beiträge: 39 Registriert: 26.08.2022
|
erstellt am: 14. Aug. 2025 07:54 <-- editieren / zitieren --> Unities abgeben:         
Hi Bernd, leider weder noch.. zumindest nichts mit dem ich was anfangen kann.. es gibt "Put" Methoden für origin, axes,... aber da werden nur die Werte hardgecodet. Dazu gibt es noch XAxisDirection etc. mit denen man Referenzen auf einzelne Achsen oder den Ursprung setzen kann (s.u.). Ich habe jetzt einen Work-Around gebastelt, mit dem das Verhalten (Abhängigkeit zu anderem Achsensystem) nachgestellt werden kann. Anstatt direkt eine Referenz auf das Achsensystem zu erstellen, werden Punkte und Linien in Abhängigkeit des Ausgangs-Achsen-Systems erstellt und dann ein neues Achsen-System wiederum in Abhängigkeit zu den Linien erstellt... etwas hässlich... Sollte also jemand jemals einen direkteren Weg kennen, wäre der nach wie vor interessant (:
Code:
AxisSystem asysTarget = <MyExistingAxisIWantToReference> HybridBodies hbs = myPart.HybridBodies; HybridBody axisHelperContainer = myPart.HybridBodies.Add(); axisHelperContainer.set_Name("Axis Helpers"); HybridShapeFactory hsf = (HybridShapeFactory)ppp.HybridShapeFactory; var dirDummy = hsf.AddNewDirectionByCoord(1, 0, 0); dirDummy.RefAxisSystem = ppp.CreateReferenceFromObject(asysTarget);var ptOrigin = hsf.AddNewPointCoord(0, 0, 0); axisHelperContainer .AppendHybridShape(ptOrigin); var refSrcAxis = myPart.CreateReferenceFromObject(asysTarget); var dirX = hsf.AddNewDirectionByCoord(1, 0, 0); dirX.RefAxisSystem = refSrcAxis; // now (1,0,0) means "X of srcAxis" var dirY = hsf.AddNewDirectionByCoord(0, 1, 0); dirY.RefAxisSystem = refSrcAxis; // "Y of srcAxis" var dirZ = hsf.AddNewDirectionByCoord(0, 0, 1); dirZ.RefAxisSystem = refSrcAxis; // "Y of srcAxis" axisHelperContainer.AppendHybridShape(dirX); axisHelperContainer.AppendHybridShape(dirY); axisHelperContainer.AppendHybridShape(dirZ); var lnX = hsf.AddNewLinePtDir(myPart.CreateReferenceFromObject(ptOrigin), dirX, 0.0, 10.0, true); var lnY = hsf.AddNewLinePtDir(myPart.CreateReferenceFromObject(ptOrigin), dirY, 0.0, 10.0, true); var lnZ = hsf.AddNewLinePtDir(myPart.CreateReferenceFromObject(ptOrigin), dirZ, 0.0, 10.0, true); axisHelperContainer.AppendHybridShape(lnX); axisHelperContainer.AppendHybridShape(lnY); axisHelperContainer.AppendHybridShape(lnZ); myPart.InWorkObject = hb; AxisSystem myNewAxis = myPart.AxisSystems.Add(); myNewAxis.set_Name("My new axis with reference"); myPart.Update(); myNewAxis.OriginType = 0; myNewAxis.OriginPoint = myPart.CreateReferenceFromGeometry(ptOrigin); // directions driven by geometry that depends on srcAxis (associative) myNewAxis.XAxisDirection = myPart.CreateReferenceFromGeometry(lnX); myNewAxis.YAxisDirection = myPart.CreateReferenceFromGeometry(lnY); myNewAxis.ZAxisDirection = myPart.CreateReferenceFromGeometry(lnZ); myPart.Update();
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
       
 Beiträge: 12099 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 14. Aug. 2025 08:51 <-- editieren / zitieren --> Unities abgeben:          Nur für user7
Servus Alternativ könntest du auf die Erzeugung der Linien verzichten und per BREP direkt auf die Achsen/Ebenen des "Referenzachsensystems" zugreifen (siehe zB hier) Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
user7 Mitglied

 Beiträge: 39 Registriert: 26.08.2022
|
erstellt am: 14. Aug. 2025 13:05 <-- editieren / zitieren --> Unities abgeben:         
Hi Bernd, wäre eleganter... hab ich direkt mal ausprobiert.. und bin gescheitert -.- ganz doofe Frage - wie komm ich an die BREP Namen von den Achsen und Ursprung, wenn ich nur das Objekt "AxisSystem" an der Hand habe? Bei nem anderen Thema hatte ich über die Selektion Scheitelpunkte und deren BREPNames extrahieren können... aber ich scheitere daran die geeigneten Typen für diesen Fall einzutragen.. Also Line, Edge, Vertex, Point, und noch einige andere hatte ich probiert - jeweils wurde nichts (Selection.count == 0) gefunden. Code:
AxisSystem myExistingAxisSystem = <hab ich schon>; Selection.Add(myExistingAxisSystem); Selection.Search("Type=Vertex,sel"); Reference myRef = (Reference)CatiaSelection.Item(1).Reference; /// darüber kann auch
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
       
 Beiträge: 12099 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 14. Aug. 2025 13:24 <-- editieren / zitieren --> Unities abgeben:          Nur für user7
Servus Du könntest den BREP-String zusammen setzen. Anbei ein CATScrip-Beispiel (den Subtype könne man dann als benutzerdefinierten Enum definieren/übergeben (das geht leider in CATScript nicht geht))
Code: Function GetReferenceOfAxissystemElement(RefAxisSystem as AxisSystem, SubType as String) as Reference Dim oPart as Part Dim InternalName as String Dim BREPString as String Set oPart = RefAxisSystem.Parent.Parent 'fails if Axissystem is located in a hybridbody InternalName = RefAxisSystem.GetItem("ModelElement").InternalName 'to be shure to get the unique name Select Case SubType Case "XAxis" BREPString = "REdge:(Edge:(Face:(Brp:(" & InternalName & ";1);None:();Cf11:());Face:(Brp:(" & InternalName & ";3);None:();Cf11:());None:(Limits1:();Limits2:());Cf11:());WithPermanentBody;WithoutBuildError;WithSelectingFeatureSupport;MFBRepVersion_CXR15)" Case "YAxis" BREPString = "REdge:(Edge:(Face:(Brp:(" & InternalName & ";2);None:();Cf11:());Face:(Brp:(" & InternalName & ";1);None:();Cf11:());None:(Limits1:();Limits2:());Cf11:());WithPermanentBody;WithoutBuildError;WithSelectingFeatureSupport;MFBRepVersion_CXR15)" Case "ZAxis" BREPString = "REdge:(Edge:(Face:(Brp:(" & InternalName & ";3);None:();Cf11:());Face:(Brp:(" & InternalName & ";2);None:();Cf11:());None:(Limits1:();Limits2:());Cf11:());WithPermanentBody;WithoutBuildError;WithSelectingFeatureSupport;MFBRepVersion_CXR15)" Case "XYPlane" BREPString = "RSur:(Face:(Brp:(" & InternalName & ";1);None:();Cf11:());WithPermanentBody;WithoutBuildError;WithSelectingFeatureSupport;MFBRepVersion_CXR15)" Case "XZPlane" BREPString = "RSur:(Face:(Brp:(" & InternalName & ";3);None:();Cf11:());WithPermanentBody;WithoutBuildError;WithSelectingFeatureSupport;MFBRepVersion_CXR15)" Case "YZPlane" BREPString = "RSur:(Face:(Brp:(" & InternalName & ";2);None:();Cf11:());WithPermanentBody;WithoutBuildError;WithSelectingFeatureSupport;MFBRepVersion_CXR15)" End Select Set GetReferenceOfAxissystemElement = oPart.CreateReferenceFromBRepName(BREPString, RefAxisSystem) End Function
Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
user7 Mitglied

 Beiträge: 39 Registriert: 26.08.2022
|
erstellt am: 14. Aug. 2025 15:46 <-- editieren / zitieren --> Unities abgeben:         
 Oo... ich hatte das komplett übersehen, dass in dem Beispiel aus deinem Link variablen in dem String gesetzt wurden und bin davon ausgegangen, dass das Ganze Ding ein dynamischer Blopp ist der jedes mal anders aussieht. Das funktioniert natürlich einwandfrei.. Mit dem Wagnis mich mit der nächsten doofen Frage zu blamieren: Der Origin müsste da ja ebenfalls drin stecken. Kann ich den auf die gleiche Weise fischen? Habe mal versucht mir selbst so einen BREP string zusammenzusetzen... wie es scheint mach ich das falsch.. Code:
string BREP_Origin = "RVertex:(Vertex:(" + "Face:(Brp:(" + InternalName + ";1);None:();Cf11:());" + "Face:(Brp:(" + InternalName + ";2);None:();Cf11:());" + "Face:(Brp:(" + InternalName + ";3);None:();Cf11:());" + "None:();Cf11:());" + "WithPermanentBody;WithoutBuildError;WithSelectingFeatureSupport;MFBRepVersion_CXR15)";myPart.CreateReferenceFromBRepName(BREP_Origin, asysTarget); ///myPart.CreateReferenceFromBRepName(BREP_Origin, myPart); /// gleicher Fehler
Fehlermeldung: "{"Der Wert liegt außerhalb des erwarteten Bereichs."}"
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
       
 Beiträge: 12099 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 14. Aug. 2025 16:14 <-- editieren / zitieren --> Unities abgeben:          Nur für user7
Servus Der Makrorekorder ist in diesem Fall dein Freund. So sieht der String zB dabei aus:
Code: "FVertex:(Vertex:(Neighbours:(Face:(Brp:(" & InternalName & ";2);None:();Cf11:());Face:(Brp:(" & InternalName & ";3);None:();Cf11:());Face:(Brp:(" & InternalName & ";1);None:();Cf11:()));Cf11:());WithPermanentBody;WithoutBuildError;WithSelectingFeatureSupport;MFBRepVersion_CXR15)"
Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
user7 Mitglied

 Beiträge: 39 Registriert: 26.08.2022
|
erstellt am: 14. Aug. 2025 16:55 <-- editieren / zitieren --> Unities abgeben:         
Vielen Dank!! Funktioniert wie gewünscht - ohne Hilfsobjekte. Hab jetzt für ne halbe Stunde mit dem Makrorekorder rumgeklickt... und es nicht hinbekommen dass er mir auch nur ansatzweise infos mit den Brep Namen herausgibt. Könntest du mir bitte kurz beschreiben wie du ihn dazu gebracht hast? Tools > Macro > Start Recording >> was hast du dann in der Gui gemacht, sodass der String mit aufgezeichnet wurde? Spielt das Format MS VBScript oder CATScript eine Rolle? Vielen Dank im voraus! und natürlich für die Lösung (: Aber man will ja auch was dabei lernen.. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
       
 Beiträge: 12099 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 14. Aug. 2025 17:14 <-- editieren / zitieren --> Unities abgeben:          Nur für user7
Servus Der Makrorekorder zeichnet (nur teilweise) auf was du manual erstellst (also über GUI). Bei CATScript/CATvba mit Deklarationen, catvbs ohne. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |