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

Spojitost mezi objekty Product a Document?

Kompletní přehled příspěvků v tématu Spojitost mezi objekty Product a Document? řazený podle data jejich publikace na fóru.

UživatelPříspěvek
Břeťa Doležal

Poslat zprávu | Profil
Datum: 6.6. 2012 | Zobrazeno: 10850x
Konfigurace CATIA:

Text dotazu:
Pomocí objektu Product si načítám jednotlivé položky sestavy Rekurzivní načtení všech součástí v sestavě. Potom následně potřebuji rozlišit co je podsestava a co je part, což se dá ošetřit pomocí zjištění počtu produktů v produktu, nicméně potřebuji následně i aktivovat díly Párty a v jednotlivách Partech vyhledávat nějaké další věci.

Dá se nějakým způsobem z objektu Product přejít na Part?

Mé krkolomné řešení je zatím takto:
Zatím jsem zjistit, že se dá z objektu Document aktivovat Part a následně s ním pracovat. Jen ještě potřebuji nějaké bezpečné pojítko mezi objekty Product a Document.

Vypadá to, že pro nalezení objektu Document odpovádající objektu Product bych mohl
používat porovnávání...

Product.PartNumber = Document.Product.Name


ale nejsem si jist. Pokud má někdo s tímto zkušenost, prosím o radu?

V rámci makra, chci procházet všechny Party v sestavě a vyčíst si hmotnosti, hustoty a polohy těžišť jednotlivých Body, s tím že sestava může mít i několik v různém počtu podsestav a třeba i v několika úrovních. Pokud by už někdo měl podobný problém vyřešený a byl ochoten poskytnou makro *.catvba byl bych velice rád a ušetřil si práci.

Jen část kódu:

Public Sub ProduktExplorer(Produkt1 As Product, Podprodukty)
'Dim Pole() As Product
'ProduktExplorer CATIA.ActiveDocument.Product, Pole
Dim Produkty As Products 'Kolekce produktù uvnitø produktu Produkt1
Dim Produkt As Product 'Produkt z kolekce Produkty
Dim i As Long 'Indexovací promìnná
Dim LocDocs As Documents
Dim LocDoc As Document

nolevel = nolevel + 1
Set Produkty = Produkt1.Products
'If Produkt1.Products.Count > 0 Then nolevel = nolevel + 1
'If Produkt1.Products.Count <= 0 Then nolevel = nolevel - 1


Set LocDocs = CATIA.Documents

' §strFileName

For Each Produkt In Produkty
ReDim Preserve Podprodukty(UBound(Podprodukty) + 1)
ReDim Preserve level(UBound(Podprodukty))
ReDim Preserve strFileName(UBound(Podprodukty))
level(UBound(Podprodukty)) = nolevel

For i = 1 To LocDocs.Count
Set LocDoc = LocDocs.Item(i)
If TypeName(LocDoc) = "PartDocument" Or TypeName(LocDoc) = "ProductDocument" Then
If Produkt.PartNumber = LocDoc.Product.Name Then strFileName(UBound(Podprodukty)) = LocDoc.FullName
End If
Next i


Set Podprodukty(UBound(Podprodukty)) = Produkt
ProduktExplorer Produkt, Podprodukty 'Rekurzivní volání
Next 'Produkt
nolevel = nolevel - 1
End Sub 'ProduktExplorer

Ing Jan Cinert

Poslat zprávu | Profil
[#2975] | Publikováno: 06.06. 2012 - 09:21
Ahoj,
obecně asi takto: Dokument je buď typu PartDocument nebo ProductDocument, objekt (jejich vlastnost) Product lze použít u obou. Vlastnost Part má jen PartDocument.

To porovnání co píšete není správně, PartNumber není to co Name, Name je v sestavě název instance.

Objekt Document je zdrojový soubor daného Objektu a jeho nalezení závisí na tom, kde se právě nacházíme. V sestavě se dá použít:
Document = Product.ReferenceProduct.Parent ' instance v sestave

Document = Part.Parent ' samostatny part

Pokud to potřebujete obráceně, tj. nalézt objekt Part při procházení sestavy, použijete jednoduše:
Part = Document.Part

nebo
Part = Product.ReferencedProduct.Part

ale samozřejmě si musíte být jistý, že se opravdu jedná o PartDocument, jinak to shoří.

Makro na rekurzivní procházení sestavy mám, poměrně vychytané, ale v .NET.
Břeťa Doležal

Poslat zprávu | Profil
[#2976] | Publikováno: 06.06. 2012 - 10:37
Už používám toto porovnání
Product.PartNumber = Document.Product.PartNumber


Můj problém je hlavně v tom, jak z Product objektu pro Part vyzískat referenci na ten objekt Part a následně s tím pracovat.

Toto by bylo ideální, ale nefunguje to.
Part = Product.ReferencedProduct.Part


Toto funguje, ale musím právě vyzjišťovávat který object Document odpovídá objektu Product.
Part = Document.Part



Hurá!!!
...už to asi mám z tvé rady, jen spojit více řádků... (doplnil jsem ještě .Parent.)

Part = Product.ReferenceProduct.Parent.Part 


Jinak .NET není problém. Už používám Visual Basic 2010Express, ale to až když mám doladěný základ pro Catii. VB 6 v Catii mi ukazuje strukturu objektů. VS2010 mi ukazuje jen že se jedná o COM instanci a nevidím struktůru objektu. Možná jen nevím jak to zapnout, ale spíš předpokládám, že to ani nejde. Každopádně veliké dík za radu.
Ing Jan Cinert

Poslat zprávu | Profil
[#2977] | Publikováno: 06.06. 2012 - 11:59
Já používám VS 2008 Expres pro V5 a VS 2008 FULL pro Catii V6 (kvůli kompilaci do 32bit aplikace). Možnosti řádkové nápovědy (nebo jak se tomu správně říká, prostě ten rozpad objektu na vlastnosti a metody) u VS 2008 je daleko lepší než u VB6, nedá se to srovnat, asi to máš nesprávně nareferencované nebo něco není nastavené.

PS: Jo, chybělo tam Parent, protože Part je vlastnost Documentu, ale z té definice předtím to vyplývá.
Ing Jan Cinert

Poslat zprávu | Profil
[#2978] | Publikováno: 06.06. 2012 - 12:01
Ještě ukázka z VS 2008 jak to napovídá...

Přiložené obrázky:

Břeťa Doležal

Poslat zprávu | Profil
[#2983] | Publikováno: 06.06. 2012 - 12:34
Špatně jsem se vyjádřil. U VS2010 Expres mi vadí, že nevidím v Locals na obsah Catiovských objektů při ladění. Ale jak jsem již psal...část programu si udělám v Catii VB6 a potom si to přenesu do VS. Dá se to přežít.
karel koupelna

Poslat zprávu | Profil
[#2985] | Publikováno: 06.06. 2012 - 12:43
Tohle funguje ale je to šílenost.


Private Sub Command3_Click()
On Error GoTo chyba


If Spusteni_Catie = False Then Exit Sub

Me.MousePointer = 11

Text1 = ""

pocet_sestav = 0
pocet_partu = 0

stat "Cekam na Catii"

Dim pr_catia As Application

Set pr_catia = CreateObject("Catia.application")
Dim doc_dokument As Document
Set doc_dokument = pr_catia.ActiveDocument

If InStr(1, doc_dokument.Name, ".CATProduct", vbTextCompare) Then

Dim stromProduct As Product
Set stromProduct = doc_dokument.Product

zapsat "0" & vbTab & stromProduct.PartNumber
OtevreniStromu stromProduct, stromProduct.PartNumber
Else
Me.MousePointer = 0
stat "Neni aktivni CATProduct"
Exit Sub
End If

stat "Sestav: " & pocet_sestav & " Partu: " & pocet_partu

Command5_Click
Me.MousePointer = 0
Exit Sub

chyba:

ee = Err.Number & " " & Err.Description
Me.MousePointer = 0
stat ee
End Sub

Sub OtevreniStromu(stromProductTMP As Product, otec)

hloubka_tree = hloubka_tree + 1
DoEvents

pocet_sestav = pocet_sestav + 1

For ff = 1 To stromProductTMP.Products.Count

poc = stromProductTMP.Products.Item(ff).Products.Count

stat "Product: " & stromProductTMP.PartNumber & " Part: " & stromProductTMP.Products.Item(ff).PartNumber

If poc = 0 Then
poc = ""
pocet_partu = pocet_partu + 1
Else
poc = TreeView1.PathSeparator
End If

If poc = "" Then
zapsat hloubka_tree & vbTab & poc & stromProductTMP.Products.Item(ff).PartNumber & vbTab & otec
Else
zapsat hloubka_tree & vbTab & stromProductTMP.Products.Item(ff).PartNumber & vbTab & otec & vbTab & otec & "|||||" & stromProductTMP.Products.Item(ff).PartNumber & "*" & pocet_sestav & "*"
End If

If stromProductTMP.Products.Item(ff).Products.Count > 0 Then
OtevreniStromu stromProductTMP.Products.Item(ff), otec & "|||||" & stromProductTMP.Products.Item(ff).PartNumber & "*" & pocet_sestav & "*"
End If

Next ff

hloubka_tree = hloubka_tree - 1


End Sub

Ing Jan Cinert

Poslat zprávu | Profil
[#2986] | Publikováno: 06.06. 2012 - 14:31
Uživatel odpovídá na příspěvek #2983:
To je divné, tohle taky funguje spolehlivě. Při krokování se dá každý objekt rozkliknout až do konce a jsou k dispozici všechny hodnoty vlastností.
Možná nějaká anomálie VS 2010...
Břeťa Doležal

Poslat zprávu | Profil
[#3098] | Publikováno: 19.07. 2012 - 08:18
Zdravím ještě jednou k tomuto tématu. Potřeboval bych vyzjistit, jak v sestavě nějak bezpečně rozpoznat když mám seznam produktů, co je model z Catie V4. Part a Product rozeznat už umím, tím že přetypuji Product na Document a zněj už se ptám na typ. Ale přetypování z Productu na Document nefunguje u V4 modelu. Je nějaká vlastnost či funkce u Produktu co by mi řekla, že se jedná o V4 model. Minimálně mohu rozeznat podle jména, páč máme všechny V4 modely s počátečním prefixem, ale nezdá se mi to moc bezpečné a univerzální pro kohokoliv jiného mimo naší firmu.
Děkuji za případnou radu. Snad jsem to vysvětlil dostatečně


Public Sub ProduktExplorer(ByVal iProdukt As Product, ByVal iPodprodukty As System.Collections.Generic.List(Of cls_SubComponent))
'Prozkoumá sestavu iProdukt Do hloubky a případné nalezené produkty přidá Do ArrayListu iPodprodukty
'Příklad:
'Dim Pole As ArrayList
'ProduktExplorer (CATIA.ActiveDocument.Product, Pole)

Dim locProdukty As Products 'Kolekce produktů uvnitř produktu iProdukt
Dim locProdukt As Product 'Produkt z kolekce Produkty
Dim locDocument As Document
Dim locSubKomp As New cls_SubComponent
Dim locPart As Part

intAssyLevel += 1
locProdukty = iProdukt.Products
For Each locProdukt In locProdukty

locDocument = CType(locProdukt.ReferenceProduct.Parent, Document)
'pokud je V4 model tak neprovede přetypování a locDocument je referencí na předchozí úspěšné přetypování, nutno před tímto ověřit co je V4 model,
' ale jak zjistit je locProduct je V4 model


If TypeName(locDocument) = "PartDocument" Then
locPart = CType(locProdukt.ReferenceProduct.Parent.Part, Part)
locSubKomp = StorePartInfo(locPart, intAssyLevel)
iPodprodukty.Add(locSubKomp)
'ještě projít jednotlivá Body
For Each iBody As Body In locPart.Bodies
If iBody.InBooleanOperation = False Then
locSubKomp = StoreBodyInfo(locPart, iBody, intAssyLevel + 1)
iPodprodukty.Add(locSubKomp)
End If
Next
ElseIf TypeName(locDocument) = "ProductDocument" Then
locSubKomp = StoreProductInfo(locProdukt, intAssyLevel)

'If locDocument.FullName.Contains("model") Then 'TOTO ZATIM NEFUNGUJE NUTNO OPRAVIT !!!!!!!!!!!!!!!!
' locSubKomp.Type = cls_SubComponent.SubComponentType.Model
'End If
iPodprodukty.Add(locSubKomp)
Else
'dokument není ani Part ani Product, neznámý object
locSubKomp.Name = locDocument.FullName
locSubKomp.Type = cls_SubComponent.SubComponentType.Unknown
iPodprodukty.Add(locSubKomp)
End If
ProduktExplorer(locProdukt, iPodprodukty) 'Rekurzivní volání
Next locProdukt
intAssyLevel -= 1
End Sub 'ProduktExplorer



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.