| |  | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für CATIA & Co. | | |  | KISTERS 3DViewStation: Germar Nikol - Der Visionär hinter der Erfolgsgeschichte, eine Pressemitteilung
|
Autor
|
Thema: Coincidence Constraint erzeugen über COM R18 (2348 mal gelesen)
|
MarcDe Mitglied
 
 Beiträge: 137 Registriert: 11.10.2006 CATIA R18 SP2, BN 18, HF 162 Win 7 64Bit
|
erstellt am: 07. Aug. 2013 14:31 <-- editieren / zitieren --> Unities abgeben:         
Hallo zusammen, ich versuche seit Tagen über die Methode "CreateReferenceFromName" innerhalb eines Produktkontext eine Referenz für die Erzeugung von eines Coincidence-Constraints zu bilden. Von der Theorie her müsste dies so funktionieren: Code: Sub CATMain()Dim documents1 As Documents Set documents1 = CATIA.Documents Dim productDocument1 As ProductDocument Set productDocument1 = documents1.Item("Product3.CATProduct") Dim product1 As Product Set product1 = productDocument1.Product Dim constraints1 As Constraints Set constraints1 = product1.Connections("CATIAConstraints") Dim reference1 As Reference Set reference1 = product1.CreateReferenceFromName("Product3/Part1.1/!Absolute Axis System") Dim reference2 As Reference Set reference2 = product1.CreateReferenceFromName("Product3/Part2.1/!Absolute Axis System") Dim constraint1 As Constraint Set constraint1 = constraints1.AddBiEltCst(catCstTypeOn, reference1, reference2) End Sub
Ich entwickle in C# (early binding) über das COM. Interessant ist jetzt die Methode CreateReferenceFromName. Wie das Argument aussieht bzw. aussehen muss ist mir klar. Ich habe jetzt folgende Erkenntnisse gemacht: - Starte ich obiges Script mit R18 erscheint das Coincidence-Constraint (kurz Constraint) mit einem gelben Ausrufungszeichen - Starte ich obiges Script mit R18 und öffne Product3 in einem separaten Fenster (so dass Produkt3 als Root fungiert und nicht Product1), dann erzeugt er das Constraint einwandfrei - Starte ich das obige Script mit R19 kann er nicht einmal die Reference bilden (gleicher Code) => Objekt=nothing - Programmiere ich obiges Script in C# nach mit den COM-Libs von R18, schlägt die Methode CreateReferenceFromName generell fehl (obwohl die VBA Variante wie im zweiten Spiegelstrich beschrieben einwandfrei funktioniert im Fall, wenn Produkt3 separat geöffnet ist) - R20, R21 und R22 weisen ein ähnlich konfuses Verhalten auf, welches sich gegen jegliche Umsetzung und portierung in C# sträubt - Verändere ich den Path zum kompletten Root-Node für die Methode CreateReferenceFromName, bekomme ich teilweise dieselbe falsche Reference (nur bis zum Part aber nicht zum Axis-System und das ist der Grund für das gelbe Ausrufungszeichen) oder die Methode schlägt ebenfalls fehl. Eigentlich ist das aber auch nicht nötig das Argument zu verändern, sofern ich die Methode CreateReferenceFromName von dem richtigen Node/Product aus aufrufe. Es reicht ihm dann "abwärts" zu gehen. Mein Ziel ist es das ganze in C# über COM für R18 zum laufen zu bringen und zwar egal in welcher Produktebene die Constraints erzeugt werden sollen. Das schlimmste kommt aber jetzt :  Ich habe in den Catia Changelogs (Program Directories) in den Closed Issue Lists von Dassault für R21 und R20 folgende Einträge gefunden: -Object Manager BR10000071296 HD86265 The script API CreateReferenceFromName doesn't deliver the right reference -CAA - Data Model Customizer BR10000097632 HE00186 The Product.CreateReferenceFromName of Automation API makes a Reference of Object different from Object specified by the argument of this API Meine Idee war jetzt mir die Reference über die Selection zu holen direkt über die Property "Reference" von der Klasse "SelectedElement", aber diese Property schlägt im Produktkontext mit einer Ausnahme fehl. Gemäß den Einträgen in der Issue List von Dassault sieht das ganze ziemlich aussichtslos aus, es sei denn jmd. kennt noch einen Trick wie ich die Referenz im Produktkontext für die Constraints erzeugen kann. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
       
 Beiträge: 12054 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 07. Aug. 2013 14:47 <-- editieren / zitieren --> Unities abgeben:          Nur für MarcDe
Servus Bei mir funktioniert dein Beispielcode unter VBA (R19) wenn ich die "Pfade" verändere: Code: Set reference1 = product1.CreateReferenceFromName("Product3/Part1.1/Part1/!Absolute Axis System")
Unabhängig davon ob ich das Product3 in einem eigenen Fenster geöffnet habe. Geht es mit diesem Code auch in R18 bis R21? Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. 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: 07. Aug. 2013 16:01 <-- editieren / zitieren --> Unities abgeben:         
Moin Bernd, also ich versuche mich gerade auf R18 zu konzentrieren, da ich Probleme habe auf meinem System Catia so oft mit -regserver laufen zu lassen und dann neuzustarten. Und dann alle Versionen zu prüfen, da sitze ich noch Wochen dran, wenn man alle Kombinationen von VBA und COM sowie von R18 bis R21 bedenkt Deine Ergänzung funktioniert bei mir mit R18, allerdings funktioniert (ich habe neugestartet und R18 nochmal mit -regserver laufen lassen) auch plötzlich die ursprüngliche Version von mir (erster Post VBA Variante) OHNE, dass ich Product 3 separat aufmachen muss. Das ist echt merkwürdig, als würde Catia machen, was es will (was ja nichts neues wäre ). Jetzt aber das dubiose: Diese Variante portiert nach C# COM (early B.) hat noch nie funktioniert, weder im separaten Fenster mit Product3 noch mit Product1 als root. Allerdings habe ich jetzt mal deine Variante und meine ursprüngliche über Reflection per Late-Binding in C# portiert und nun funktioniert es (beide Varianten) in C# Erklären kann ich mir das aber nicht wirklich! Mir ist auch aufgefallen, dass Catia teils sehr UNempfindlich bei der Methode CreateRefFromName ist. Da kann man teilweise Schrott reinschreiben und er findet trotzdem die Referenz. Teilweise bekommt man aber merkwürdige Fehler. Diese Methode wird aber vermutlich, wenn sie jetzt schon so seltsame Verhaltensweisen auf den Tisch legt, früher oder später noch weitere Probleme machen insbesondere abhängig von der Produktstruktur Hier mal ein Auszug von meinen Methoden: Code: public void Snap() { Product srcP = (Product)_src.LeafProduct; Product tarP = (Product)_tar.LeafProduct; Product ctxSrc = srcP.GetContextProduct(); Product ctxTar = tarP.GetContextProduct(); Debug.WriteLine("Src Context: " + ctxSrc.get_Name() + "(PN=" + ctxSrc.get_PartNumber() + ")"); Debug.WriteLine("Tar Context: " + ctxTar.get_Name() + "(PN=" + ctxTar.get_PartNumber() + ")"); ProductDocument rootCtx = ctxSrc.GetRootContext(); Debug.WriteLine("Root Context: " + rootCtx.get_Name()); if (ctxSrc.get_Name() == ctxTar.get_Name()) { // Same Level. Product commonCtx = ctxSrc; string refNamePathSrc = srcP.GetPathUpwardsToProduct(commonCtx) + "/!" + ((AnyObject)this._src.Value).get_Name(); string refNamePathTar = tarP.GetPathUpwardsToProduct(commonCtx) + "/!" + ((AnyObject)this._tar.Value).get_Name(); Reference refSrc = null, refTar = null; //! Is not functional with early binding, unknown reason! //refSrc = commonCtx.ReferenceProduct.CreateReferenceFromName(refNamePathSrc); oMethod(commonCtx.ReferenceProduct, "CreateReferenceFromName", new object[1] { refNamePathSrc }); refSrc = (Reference)oResult; //! Is not functional with early binding, unknown reason! //refTar = commonCtx.ReferenceProduct.CreateReferenceFromName(refNamePathTar); oMethod(commonCtx.ReferenceProduct, "CreateReferenceFromName", new object[1] { refNamePathTar }); refTar = (Reference)oResult; Constraints constraints = (Constraints)commonCtx.ReferenceProduct.Connections("CATIAConstraints"); Constraint coinConstraint = constraints.AddBiEltCst(CatConstraintType.catCstTypeOn, refSrc, refTar); } else throw new Exception("Both Products are not in the same Level."); }
Hilfsmethode: Code: /// <summary> /// Returns the complete Path upwards within the Product Structure Tree (PST) to the desired Product e.g. "Product6/Product1.1/Product2.1/Product2.1/Part4.1".<para> /// Note: This Path Structure is very important for using the 'CreateReferenceFromName' Method wihin a Product Document Context.</para> /// </summary> /// <param name="p"></param> /// <param name="prod">Product to which the path shall be built.</param> /// <returns></returns> /// <exception cref="System.Exception">Will be thrown, if the Fullpath to the Root could not be get.</exception> public static string GetPathUpwardsToProduct(this Product p, Product prod) { try { // Define empty string List for all Nodes. List<string> namesTo = new List<string>(); // Define anonym Action. Action<AnyObject> recursiveScan = null; // Define Action in Detail. recursiveScan = new Action<AnyObject>(anyObj => { if (anyObj.get_Name().StartsWith("CATIAAnalyze")) throw new Exception("Recursive error: CATIAAnalyze type found."); if (anyObj.get_Name().Equals(prod.get_Name())) { // Add the Node Name. namesTo.Add(prod.get_PartNumber()); // Reaching the destination Product, means we are on the end of the search. return; } else { // Add the Node Name. namesTo.Add(anyObj.get_Name()); // Recursive call - try to find parents of the current parent. recursiveScan.Invoke((AnyObject)anyObj.Parent); } }); // Start the Action. recursiveScan.Invoke(p); // Inverse the Names. namesTo.Reverse(); // Returning the whole Path. return namesTo.Aggregate((a, b) => a + "/" + b); ; } catch (Exception ex) { throw new Exception(string.Format("Error while getting the Fullpath to the target Product from Product \"{0}\".", p.get_Name()), ex); } }
und Code: /// <summary> /// Returning the Context Product of this Product. /// </summary> /// <param name="p"></param> /// <returns></returns> public static Product GetContextProduct(this Product p) { try { // Define anonym Action. Func<AnyObject, Product> recursiveScan = null; // Define Action in Detail. recursiveScan = new Func<AnyObject, Product>(anyObj => { if (anyObj is Product) { // Reaching a Product, means we are on the end of the search. return (Product)anyObj; } else { // Recursive call. return recursiveScan.Invoke((AnyObject)anyObj.Parent); } }); // Start the Action and returning the Result. return recursiveScan.Invoke((AnyObject)p.Parent); } catch (Exception ex) { throw new Exception(string.Format("Error while getting the Context Product of \"{0}\".", p.get_Name()), ex); } }
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
crow73 Mitglied Maschinenbauingenieur

 Beiträge: 64 Registriert: 07.04.2003 CATIA V5R19 SP9 Hotfix 69 Core i7 16 GB RAM W7
|
erstellt am: 14. Aug. 2013 13:31 <-- editieren / zitieren --> Unities abgeben:          Nur für MarcDe
|
MarcDe Mitglied
 
 Beiträge: 137 Registriert: 11.10.2006 CATIA R18 SP2, BN 18, HF 162 Win 7 64Bit
|
erstellt am: 14. Aug. 2013 17:44 <-- editieren / zitieren --> Unities abgeben:         
Hey, wie gesagt bei mir funktioniert es jetzt, jedoch nur per Late-Binding, wie in dem Code ersichtlich! Funktioniert aber sicher nicht stabil, da in dem Changelog - wie ich oben im ersten Post berichtete - offensichtlich Fehler in der Methode existieren, die offiziell eingeräumt wurden. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
 |