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

Prochazeni sestavy

Kompletní přehled příspěvků v tématu Prochazeni sestavy řazený podle data jejich publikace na fóru.

UživatelPříspěvek
Pavel Krsek

Poslat zprávu | Profil
Datum: 2.8. 2012 | Zobrazeno: 16316x
Konfigurace CATIA:

Text dotazu:
Ahoj,
uz 3. den (ve volnych momentech) bojuji s makrem, kde mam script:

  Dim MyProduct As Product

Set MyProduct = CATIA.ActiveDocument.Product
Dim MyParams As Parameters
Set MyParams = MyProduct.UserRefProperties
Dim strParam1 As StrParam
Dim c As Integer
c = MyParams.Count
Dim attrArray()

If c > 0 Then
For j = 1 To c
ReDim Preserve attrArray(j)
attrArray(j - 1) = MyParams.Item(j).Name
'Debug.Print attrArray(j - 1)
Next
End If

c = 0
On Error Resume Next
c = UBound(attrArray)
Debug.Print c

If c > 0 Then
For i = 0 To UBound(attrArray) - 1
If InStr(attrArray(i), "EBS") = 0 Then
MyParams.Remove (attrArray(i))
End If
Next
End If

Toto makro funguje OK - vymaze v aktivnim partu, productu vsechny parametry az na definovane vyjimky.
Nyni potrebuji makro upravit tak, aby proslo celou sestavu a vymazalo dane parametry u vsech partu a productu - to se mi vubec, ale nedari.

Mohl by nekdo poradit?
Koukal jsem na tuto diskuzi (http://www.catia-forum.cz/forum/topic.php?topic_id=628), ale i kdyz zkousim modifikovat dane priklady, tak to stejne nejede.

Ing Jan Cinert

Poslat zprávu | Profil
[#3126] | Publikováno: 02.08. 2012 - 09:45
Na procházení sestavy stačí opravdu jednoduchá rekurze, jde jen o to, co bude parametrem funkce. Buď to může být produkt (top sestava) nebo kolekce (produkty v top sestavě). Každý způsob má svoje pro i proti.

V každém případě potřebujete dvě funkce. První získá objekt top sestavy (nebo kolekci jejích podproduktů) a pak zavolá vlastní rekurzivní funkci, např takhle.

' hlavni fce

Sub Main()

Set oProduct = CATIA.ActiveDocument.Product

Explore oProduct

End Sub

' rekurzivni prochazeni
Sub Explore (oProduct)

For Each oSubProduct in oProduct.Products

' vlastni skript

' pokud ma podsestava potomky, zavolame prochazeni znovu
If oSubProduct.Products.Count > 0 Then

Explore oSubProduct

End If

Next

End Sub


Při tomto způsobu se musí buď v hlavní fci nebo v rekurzi s nějakou podmínkou zpracovat hlavní u sestava, kterou rekurze nezahrne.

A to je celé, nic víc k procházení nepotřebujete. Kam si budete ukládat názvy nebo celé objekty a jejich počty už je na Vás.

Struktura se dá i načíst do TreeView a pak se s ní dá pracovat, viz obrázek.

Přiložené obrázky:

Pavel Krsek

Poslat zprávu | Profil
[#3129] | Publikováno: 02.08. 2012 - 10:57
Diky moc za pomoc,
ale stejne na to koukam jako na prvni makro pred casem.
1) opravdu staci muj script doplnit na oznacene misto? (porad nerozumim jak funguje prikaz "explore" - to postupne aktivuje v sestave vsechny party a produkty?)
2) jak se necha osetrit vynechani hlavni sestavy v dane rekurzy?
Ing Jan Cinert

Poslat zprávu | Profil
[#3130] | Publikováno: 02.08. 2012 - 12:35
ad 1) To samozřejmě nestačí. Deklarace se musí přesunout do funkce Explore, pak bz to mělo fungovat. Explore neí příkaz, ale procedura (Sub), která v okamžiku, kdy právě procházená sestava obsahuje podstastavy, volá sama sebe - tomu se právě říká rekurze.

ad 2) buď se dá do rekurzivní fce část kódu, která stejným způsobem jako oSubProduct zpracuje i oProduct, ale jen za podmínky, že je počet produktů rovný 1 (první procházený produkt se top sestava. Nebo se top sestava zpracuje v hlavním programu a rekurze se nemění..
Pavel Krsek

Poslat zprávu | Profil
[#3133] | Publikováno: 03.08. 2012 - 06:43
Diky za pomoc.
Zkousel jsem zkousel, ale nakonec se nezdarilo.
Nakonec jsem jeste zkusil uplne jednoduchy kod bez rekurze a volani podprocedury:

Set LocDocs = CATIA.Documents


 For i = 1 To LocDocs.Count


Set LocDoc = LocDocs.Item(i)
Set oPart = LocDoc.Product.ReferenceProduct
Set MyParams = oPart.UserRefProperties

' ........pokracovani meho scriptu
Next


a to udela presne co jsem potreboval - tj. vymaze ve vsech parts a products parametry.
Muzete mi prosim rici, jaky teda pak rozdil mezi timto a rekurzy?
Diky.
Ing Jan Cinert

Poslat zprávu | Profil
[#3134] | Publikováno: 03.08. 2012 - 08:33
Tímto Vaším způsobem projdete všechny dokumenty a dostanete se na jejich User Defined properties (ale třeba už na na parametry). Rekurze prochází celou sestavu podle její struktury, tj. projde popořadě každou jednotlivou instanci partu a productu. Používá se třeba při sjednocení PartNumber a InstanceName (pak je to např. Soucast(Soucast.1) atd.)

Klasický příklad na rekurzi je třeba vytvoření kusovníku, kdy potřebujete počty jednotlivých instancí a jejich názvy. To jinak udělat nejde.
Josef Landa

Poslat zprávu | Profil
[#4752] | Publikováno: 25.09. 2014 - 18:47
Dobrý den,
v příspěvku [#3126] máte náhled na načtenou strukturu do TreeView.
Je možné sem dát jednoduchý příklad pro VB.NET?
Děkuji.
Ing Jan Cinert

Poslat zprávu | Profil
[#4753] | Publikováno: 26.09. 2014 - 15:38
Tohle vytvoří strom s načtenými produkty. Stačí přidat rekurzi na procházení sestavy a předávat jí současně i příslušný Node.

Předpokládá komponent TreView a v něm vložený top node.

' nacte seznam otevrenych sestav

Public Sub Iniciate() Handles MyBase.Load
Dim Parts()
Dim oNode As TreeNode
' spojeni
oConnection = New Connection ' tohle jsou moje knihovny - musite nahradit
CATIA = oConnection.Connection ' tohle jsou moje knihovny - musite nahradit
' vycistime strom
AssyTree.Nodes.Item(0).Nodes.Clear()
' prochazime dokumenty a sestavy vkladame Do stromu
For Each oDocument As Document In CATIA.Documents()
Parts = oDocument.Name.Split(".")
If Parts(UBound(Parts)) = "CATProduct" Then
' vytvorime novy uzel
oNode = New TreeNode(oDocument.Product.PartNumber, 0, 0)
oNode.Tag = oDocument.Name
' vlozime ho Do stromu
AssyTree.Nodes.Item(0).Nodes.Add(oNode)
End If
Next
' rozbalime strom
AssyTree.ExpandAll()
End Sub


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.