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

CATDUA

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

UživatelPříspěvek
Petr

Poslat zprávu | Profil
Datum: 5.12. 2015 | Zobrazeno: 9529x
Konfigurace CATIA: Catia V5 R24 SP4 HF22

Text dotazu:
Dobry den,
jak nastavit CATDU v utilitach, aby mazala staré linky v desku?? Jde to nějak? Nechci v desku prochazet každý párt a produkt samostatně.

Diky

Ing Jan Cinert

Poslat zprávu | Profil
[#5514] | Publikováno: 05.12. 2015 - 20:37
Dobrý den,

co myslíte tím "staré linky"? Neexistující reference?

To CATDUA asi ani nedovede, protože to souvisí se strukturou sestavy, která není při čištění ovlivněna. CATDUA řeší pouze vnitřní chyby v modelu. Chybějící reference je možné odstranit (pokud to chcete opravdu udělat) pomocí jednoduchého makra, které rekurzivně prochází sestavou, a pokud narazí na instanci s chybějící referencí, odstraní ji.
Petr

Poslat zprávu | Profil
[#5515] | Publikováno: 06.12. 2015 - 10:03
Dobrý den,
ano myslím tím neexistující reference. Myslel jsem si že to CATDUA dokáže, že je to jen otázka nastavení.

Jak by takové makro vypadalo? Na foru jsem žádnou podobnou diskuzi nenašl..

Zkusím se podívat ještě na zahraniční fora.

Děkuji
Petr

Poslat zprávu | Profil
[#5516] | Publikováno: 06.12. 2015 - 10:06
Našel jsme jiné makro, k které dokáže zpětně nalinkovat chybějící díly.

https://www.youtube.com/watch?v=vCcIIgpLPUs

V mém příadě mi ale nepomůže, já potřebuji chybějící linky odstranit.
Ing Jan Cinert

Poslat zprávu | Profil
[#5517] | Publikováno: 06.12. 2015 - 11:50
Zkuste tohle. Je to funkce jedné komplexní utility pro klonování sestav, kdy se musí nejprve chybějící reference odstranit. Vstupem funkce je produkt vrcholové sestavy sestavy.

Je to psané pro VB.NET, pro použití jako CATScript si budete muset nahradit ošetření Try ... Catch pomocí standardního OnError ..., jinak to funguje spolehlivě.

' rekurzivne prochazi sestavu a odebira produkty bez reference

Private Sub RemoveMissingProducts(ByVal oProduct As Product)
Dim oSubProducts As Products
Dim oSubProduct As Product
Dim RefValid As Boolean

' nacteme vsechny instance v sestave
oSubProducts = oProduct.Products

For Each oSubProduct In oSubProducts
RefValid = True
' overime existenci reference
Try
If oSubProduct.ReferenceProduct.Parent Is Nothing Then
RefValid = False
End If
Catch
RefValid = False
End Try

' zkusime odebrat instanci
If RefValid = False Then
Try 'kvuli chybe v API to produkt odebere, ale shori
' odebereme instanci
oProduct.Products.Remove(oSubProduct.Name)
Catch ex As Exception
End Try

Else
' rekurze
If oSubProduct.Products.Count > 0 Then
RemoveMissingProducts(oSubProduct)
End If
End If
Next
End Sub

Petr

Poslat zprávu | Profil
[#5518] | Publikováno: 06.12. 2015 - 13:41
Děkuji hned to vyzkouším.
Petr

Poslat zprávu | Profil
[#5519] | Publikováno: 06.12. 2015 - 14:52
Upravil jsem kod pro visual basic viz. dole. Když ho ale sputim, tak mě smaže všechny party a produkty...


Sub CATMain()
Dim acDoc
Dim acProd
Set acDoc = CATIA.ActiveDocument
Set acProd = acDoc.Product
acProd.ApplyWorkMode DESIGN_MODE
RemoveMissingProducts acProd
End Sub
Private Sub RemoveMissingProducts(ByVal oProduct As Product)
Dim oSubProducts As Products
Dim oSubProduct As Product
Dim RefValid As Boolean
' nacteme vsechny instance v sestave
Set oSubProducts = oProduct.Products
For Each oSubProduct In oSubProducts
RefValid = True
' overime existenci reference
On Error GoTo ErrHandler1:
If oSubProduct.ReferenceProduct.Parent Is Nothing Then
RefValid = False
End If
ErrHandler1:
RefValid = False
' zkusime odebrat instanci
If RefValid = False Then
On Error GoTo ErrHandler2:
'Try kvuli chybe v API to produkt odebere, ale shori
' odebereme instanci
oProduct.Products.Remove (oSubProduct.Name)
ErrHandler2:
Else
' rekurze
If oSubProduct.Products.Count > 0 Then
RemoveMissingProducts (oSubProduct)
End If
End If
Next
MsgBox ("All missing products have been removing")
End Sub
Ing Jan Cinert

Poslat zprávu | Profil
[#5520] | Publikováno: 06.12. 2015 - 18:14
No jasně, za ErrorHandler1 změníte RefValid na false, proto to pokaždé smaže instanci. Musíte si lépe pohrát s ošetřením chyby. Ta právě vznikne, pokud neexistuje vlastnost parent dané instance (to je vlastní soubor).
Petr

Poslat zprávu | Profil
[#5523] | Publikováno: 08.12. 2015 - 17:47
Dobrý den, jakou funkci přesně plní příkaz
Catch ex As Exception
Děkuji
Petr

Poslat zprávu | Profil
[#5524] | Publikováno: 08.12. 2015 - 18:12
Dobrý den, už se mi to podařilo rozchodit, ale makro mi prochází pouze jednu úroveň. Když mám v produktu další product, tak v něm už chybějící linky na party neodstraní.

Sub CATMain()

Dim acDoc As Document
Dim acProd As Product
Dim acProds As Products
Set acDoc = CATIA.ActiveDocument
Set acProd = acDoc.Product
acProd.ApplyWorkMode DESIGN_MODE
RemoveMissingProducts acProd
End Sub
Private Sub RemoveMissingProducts(ByVal oProduct As Product)
Dim oSubProducts As Products
Dim oSubProduct As Product
Dim RefValid As Boolean
' nacteme vsechny instance v sestave
Set oSubProducts = oProduct.Products
For Each oSubProduct In oSubProducts
RefValid = True
' overime existenci reference
On Error Resume Next
If oSubProduct.ReferenceProduct.Parent Is Nothing Then
RefValid = False
End If
' zkusime odebrat instanci
If Err <> 0 Then
If RefValid = False Then
End If
On Error Resume Next
'Try kvuli chybe v API to produkt odebere, ale shori
' odebereme instanci
oProduct.Products.Remove (oSubProduct.Name)
Else
' rekurze
If oSubProduct.Products.Count > 0 Then
RemoveMissingProducts (oSubProduct)
End If
End If
Next
MsgBox ("All missing product have been removed")

End Sub
Ing Jan Cinert

Poslat zprávu | Profil
[#5525] | Publikováno: 08.12. 2015 - 22:29
Máte to trochu zmatené. Dejte úplně pryč proměnnou RefValid, nebo ji použijte tak jak je myšleno. Na začátku se zjišťuje, jestli je reference platná tím, že se porovnává jeji rodič (soubor), zda je Nothing. To klidně můžete nahradit třeba zjištěním jeho názvu (.Parent.Name). Jenže ve skriptu to shoří, tak tam správně máte On Error...
Pak zjistíte kód chyby, a pokud je <> 0, už můžete odebrat instanci. To je ale třeba znovu ošetřit, protože tam chyba vzniká pokaždé, o když se instance odebere.
Na konci už se jen spouští rekurze, pokud produkt obsahuje podprodukty (= pokud jde o podsestavu).

Podle mě vám to druhé On Error přeskočí zbytek kódu. Dejte si tam message box, abyste zjistit zda se část kódu s rekurzí vykoná.

PS: Try - Catch je běžné ošetření potencionálních chyb.

Try 

- pokusí se vykonat kód, kde očekávám chybu
Catch
- vykoná se, pokud chyba nastane
Finally
- vykoná se pokaždé
End Try


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.