Vítejte !   Přihlášení | Registrace
Hlavní menu
CATIA fórum.cz
Novinky
Seriál CATIA
Obecně o CAD
Novinky ze světa DS
Makra pro CATIA V5
Diskuse
Vytvořit téma
Koncepty
Seznam oblíbených
Soukromé zprávy
Pravidla
Live CHAT
VIP žádost
Základy Catia
Ke stažení
Doporučujeme
Pracovní příležitosti
Reklama a kampaně
O fóru
Nápověda

Hierarchický strom

UživatelPříspěvek
Ing Jan Cinert

Poslat zprávu | Profil
Datum: 19.4. 2010 | Zobrazeno: 11911x
Konfigurace 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:06
Mrkni 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


Uživatel nepřihlášen

Pro zobrazení obsahu stránky / provedení akce (vytvoření nového téma, napsání odpovědi do diskuse apod.) musíte být přihlášeni.