| Uživatel | Příspěvek | 
                      Ing Jan Cinert   
                        
                      Poslat zprávu |
                      Profil 
                    | 
                        
                        Datum:
                        19.4. 2010
                         | Zobrazeno:  
                        12476xKonfigurace CATIA: Text dotazu: Vznáším dotaz spíše pro ty, kdo mají větší zkušenosti s programováním maker. Pracuju na makru (nebo spíše menší aplikaci), která dokáže načíst hierarchický strom Catie a pak lze jednoduchým způsobem editovat názvy jednotlivých uzlů. (Je to pro dodržování jisté metodiky). No a k problému: Nevím jak efektivně načíst strom přesně tak, jak je vytvořen ve skutečnosti. Lze načíst sety, body a jejich geometrii, ale vždy nejdříve jednu a pak další skupinu objektů (např. nejdřív sety, pak body atd.) Jedinný způsob, který jakž takž funguje, je selection, ale ta se s rostoucím počtem feature nehorázně zpomaluje. Věděl by někdo jestli to lze udělat jinak?
 
 V příloze screenshot, jak to potom vypadá.  Přiložené obrázky: 
                                     
                           
                        
                                      | 
 | 
                           
                           Jan Svoboda   
                             
                           Poslat zprávu |
                           Profil 
                         | 
                            [#438]
                             | Publikováno: 
                            19.04. 2010 - 19:06Mrkni na tohle funguje to rychle a načítá to i to co potřebuješ...
 Třeba ti to nějak pomůže.
 Private void Form1_Load(object sender, EventArgs e)
         {
             Object CATIA = Marshal.GetActiveObject("CATIA.Application");
             catiaapp = ( INFITF.Application)CATIA;
 
             //Fenster-Titel auslesen -------------------------
             this.textBox1.Text = catiaapp.get_Caption();
             //-------------------------------------------------------
 
             //Teilenummer des aktiven Dokumentes auslesen----------
             try
             {
                 activedocpart = (MECMOD.PartDocument)catiaapp.ActiveDocument;
                 product1 = activedocpart.Product;
                 Doctyp = "Part";
             }
             catch
             {
                 try
                 {
                     activedocproduct = (ProductStructureTypeLib.ProductDocument)catiaapp.ActiveDocument;
                     product1 = activedocproduct.Product;
                     Doctyp = "Product";
                 }
                 catch
                 {
                     MessageBox.Show("Teilenummer konnte nicht ermittelt werden", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
                     return;
                 }
             }
             this.textBox2.Text = product1.get_PartNumber();
             //----------------------------------------------------------------------
 
             //Strukturbaum nachbilden--------------------------
             TreeNode tn0 = new TreeNode(product1.get_PartNumber());
             switch(Doctyp)
             {
                 Case "Part":
                     getbodies(tn0, activedocpart.Part);
                     gethybridbodies(tn0, activedocpart.Part.HybridBodies);
                     break;
                 Case "Product":
                     ProductStructureTypeLib.Products products1 = activedocproduct.Product.Products;
                     For (int i = 1; i <= products1.Count; i++)
                     {
                         object index = i;
                         ProductStructureTypeLib.Product product_Sub = products1.Item(ref index);
                         TreeNode tn_product = new TreeNode(product_sub.get_Name());
                         tn0.Nodes.Add(tn_product);
                         If (product_sub.Products.Count == 0)
                         {
                             try
                             {
                                 MECMOD.PartDocument Part_sub_doc = (MECMOD.PartDocument)product_sub.ReferenceProduct.Parent;
                                 getbodies(tn_product, Part_sub_doc.Part);
                                 gethybridbodies(tn_product, Part_sub_doc.Part.HybridBodies);
                             }
                             Catch { }
                         }
                     }
                     break;
             }
             this.treeView1.Nodes.Add(tn0);
             //-------------------------------------------------
         }
         //-------------------------------------------------------
         Private void getbodies(TreeNode tn0,MECMOD.Part Part1)
         {
             MECMOD.Bodies bodies1 = Part1.Bodies;
             For (int i = 1; i <= bodies1.Count; i++)
             {
                 object index = i;
                 MECMOD.Body body1 = bodies1.Item(ref index);
                 If (body1.InBooleanOperation == false)
                 {
                     TreeNode tn_body = new TreeNode(body1.get_Name());
                     tn0.Nodes.Add(tn_body);
 
                     MECMOD.Shapes shapes1 = body1.Shapes;
                     getshape(tn_body, shapes1);
                 }
             }
         }
         //-------------------------------------------------------
         Private void getshape(TreeNode tn_body, MECMOD.Shapes shapes1)
         {
             For (int m = 1; m <= shapes1.Count; m++)
             {
                 object index = m;
                 try
                 {
                     PARTITF.BooleanShape shape1 = (PARTITF.BooleanShape)shapes1.Item(ref index);
                     TreeNode tn_body_bool = new TreeNode(shape1.Body.get_Name());
                     tn_body.Nodes.Add(tn_body_bool);
                    
                     MECMOD.Shapes shapes_bool = shape1.Body.Shapes;
                     getshape(tn_body_bool, shapes_bool);
                 }
                 catch
                 {
                     MECMOD.Shape shape1 = shapes1.Item(ref index);
                     tn_body.Nodes.Add(shape1.get_Name());
                 }
             }
         }
         //-------------------------------------------------------
         Private void gethybridbodies(TreeNode tn0, MECMOD.HybridBodies hbodies1)
         {
             For (int i = 1; i <= hbodies1.Count; i++)
             {
                 object index = i;
                 MECMOD.HybridBody hbody1 = hbodies1.Item(ref index);
 
                 TreeNode tn_body = new TreeNode(hbody1.get_Name());
                 tn0.Nodes.Add(tn_body);
 
                 If (hbody1.HybridBodies.Count > 0)
                     gethybridbodies(tn_body, hbody1.HybridBodies);
 
                 MECMOD.HybridShapes hshapes1 = hbody1.HybridShapes;
                 getshybridhape(tn_body, hshapes1);
             }
         }
         //-------------------------------------------------------
         Private void getshybridhape(TreeNode tn_body, MECMOD.HybridShapes hshapes1)
         {
             For (int m = 1; m <= hshapes1.Count; m++)
             {
                 object index = m;
 
                 MECMOD.HybridShape hshape1 = hshapes1.Item(ref index);
                 tn_body.Nodes.Add(hshape1.get_Name());
             }
         }
         //-------------------------------------------------------
         Private void button1_Click(object sender, EventArgs e)
         {
             string titel = this.textBox1.Text;
             catiaapp.set_Caption(ref titel);
         }
         //---------------------------------------------------
         Private void button2_Click(object sender, EventArgs e)
         {
             string partnumber1 = textBox2.Text;
             product1.set_PartNumber(ref partnumber1);
         }
 
         Private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)  | 
                           
                           Ing Jan Cinert   
                             
                           Poslat zprávu |
                           Profil 
                         | 
                            [#440]
                             | Publikováno: 
                            19.04. 2010 - 21:29 Díky za inspiraci, já mám v podstatě to samé. Můj problém to stejně neřeší. Zkusím ještě jednou upřesnit na příkladu. Mám set a v něm další dva sety a dvě funkce v pořadí:
 Set1
 Funkce1
 Set2
 Funkce2
 Výsledek ale bude
 Set1
 Set2
 Funkce1
 Funkce2
 Hierarchie stromu bude OK, ale nejdřív budou vypsány sety a pak teprv funkce. Buhužel právě to pořadí je pro zmiňovanou metodiku důležité. Kdyby se daly vylistovat všechny potomci setu, šlo by to, ale HybridShape a HybridBody je každé jiná třída. Proto používám selekci s filtrem na tyto dvě třídy a hlídám rodiče nalezených feature. No a čím více potomků má uzel, tím je to delší.  | 
                           
                           Jan Svoboda   
                             
                           Poslat zprávu |
                           Profil 
                         | 
                            [#441]
                             | Publikováno: 
                            20.04. 2010 - 18:44 Hm rozumim, takže nejdřív projíždí HybridBody a pak HybridShape, je to tak?  | 
                           
                           Ing Jan Cinert   
                             
                           Poslat zprávu |
                           Profil 
                         | 
                            [#442]
                             | Publikováno: 
                            20.04. 2010 - 19:56 Přesně tak. Všechny feature spadají víceméně do skupin Body, Shape, HybridBody, HybridShape a HybridSketches, takže se dají načítat vždy po jednotlivých skupinách, ale nidky tak jak jsou doopravdy za sebou. Zbývá jenom ta nešťastná selekce... 
 Ještě jsem zkoušel experimentovat s HSOSynchronized, ale to je velká magie. V Catscriptu se to zrychlilo, ale ve VB2008 (exe soubor) to dělalo neplechu.
 Kdyby šlo něco jako 
 For Each Feature In Part.AnyObjects ...
 a pak filtrovat podle TypeName  |