Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de
  CATIA V5 Programmierung
  Coincidence Constraint erzeugen über COM R18

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
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



Sehen Sie sich das Profil von MarcDe an!   Senden Sie eine Private Message an MarcDe  Schreiben Sie einen Gästebucheintrag für MarcDe

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities


Baum.jpg

 
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


Sehen Sie sich das Profil von bgrittmann an!   Senden Sie eine Private Message an bgrittmann  Schreiben Sie einen Gästebucheintrag für bgrittmann

Beiträge: 12054
Registriert: 30.11.2006

CATIA V5R19

erstellt am: 07. Aug. 2013 14:47    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für MarcDe 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von MarcDe an!   Senden Sie eine Private Message an MarcDe  Schreiben Sie einen Gästebucheintrag für MarcDe

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von crow73 an!   Senden Sie eine Private Message an crow73  Schreiben Sie einen Gästebucheintrag für crow73

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für MarcDe 10 Unities + Antwort hilfreich

Ich habe leider (oder Gott sei dank) kein R18 mehr installiert
aber ich habe das mit den Referenzen und Constraints in R18
nie hinbekommen obwohl es in R16,17,19,20 und 21 läuft!

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

MarcDe
Mitglied



Sehen Sie sich das Profil von MarcDe an!   Senden Sie eine Private Message an MarcDe  Schreiben Sie einen Gästebucheintrag für MarcDe

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2025 CAD.de | Impressum | Datenschutz