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

Kopírování odečtových tělěs z více instancí do jednoho Partu/Productu

Kompletní přehled příspěvků v tématu Kopírování odečtových tělěs z více instancí do jednoho Partu/Productu řazený podle data jejich publikace na fóru.

UživatelPříspěvek
Josef Kuna

Poslat zprávu | Profil
Datum: 8.6. 2010 | Zobrazeno: 11334x
Konfigurace CATIA:

Text dotazu:
Dobrý den,

mám sestavu, která obsahuje více instancí jednoho Partu/Productu (např. "Sroub 1.1", "Sroub 1.2", "Sroub 1.3"...) a potřebuji z každé této instance vykopírovat stejné Body (např. "Dira pro sroub") do jednoho Partu/Productu (např. "Otvory pro srouby.1") tak, aby si po zkopírování tyto solidy zachovaly stejnou polohu jako mají v sestavě. Pokud sestava obsahuje tři různé šrouby (např. "Sroub 1.1", "Sroub 2.1", "Sroub 3.1"...) tak je vše v pořádku. Problém nastává v případě, kdy sestava obsahuje jeden šroub, který má právě více instancí s různou polohou. Vždy se mi zkopíruje "Dira pro sroub" se stejnou polohou resp. ze stejného Partu/Productu. Zkoušel jsem vše možné od ReferenceProduct až po GetMasterShapeRepresentative, ale bezúspěšně. Můžete mi, prosím, někdo poradit jak na to (pokud to má ovšem řešení).

Děkuji moc.

J.K.



Ing Jan Cinert

Poslat zprávu | Profil
[#576] | Publikováno: 08.06. 2010 - 07:32
Předpokládám, že kopírujete makrem. Aby se vám udržela poloha body v rámci sestavy, musíte použít kombinaci Selection.Copy() a Selection.PasteSpecial("CATPrtResult") anebo Selection.PasteSpecial("CATPrtResultWithoutLink"). Pokud budete používat jenom Paste, zachová se původní poloha Body vůči souřadnému systému modelu, odkud kopírujete (případ který popisujete).
První z výše uvedených případů vytvoří "mrtvé" Body, druhý Body s externím linkem. Jak pracovat se Selection je popsáno v sekci Makra a Programování.
Pokud byste chtěl Body živé, musel byste nejprve zjistit polohu partu v hlavní sestavě (což celkem snadno lze) a po vložení toto Body napolohovat v modelu (to už není tak snadné, dokonce pokud je Body svázané s některou z hlavních rovin, je to nemožné).
Josef Kuna

Poslat zprávu | Profil
[#578] | Publikováno: 08.06. 2010 - 23:39
Uživatel odpovídá na příspěvek #576:


Postup, který popisujete používám relativně často (především Selection.PasteSpecial "CATPrtResult") a funguje dobře, avšak za předpokladu, že sestava obsahuje různé Party. Problém nastává v případě, kdy do sestavy vložím jeden Part a metodou Copy-Paste (As specified in Product Structure) vytvořím jeho identické kopie (instance) a kompasem napolohuji do požadovaných míst. V tomto případě mám veliký problém dostat se na požadová Body ve všech těchto instancích. Vždy se mi vykopíruje Body pouze z jedné a té samé instance (v konkrétním případě vždy Part 1.2)a to i přes to, že myší vybírám instanci jinou (Part 1.1). Myslím si, že problém je v tom, že k požadovanému Body se dostanete pouze přes kolekci CATIA.Documents (CATIA.Documents.Item("Part.CATPart").Part.Bodies.Item...), kde je pouze jeden .CATPart (společný pro všechny instance) , jenž představuje daný Part, avšak k jednotlivým instancím přes kolekci CATIA.ActiveDocument. Z této kolekce je ovšem velký problém (alespoň pro mě) se dostat do požadovaného Partu.

Zkoušel jsem jak Part 1.1.ReferenceProduct.Parent.Part.Bodies.Item... tak i Part 1.1.GetMasterShapeRepresentation (True).Part.Bodies.Item..., ale vysledek byl vždy stejný (vykopírovalo se vždy Body z instance Part 1.2 - viz.výše).

Chtěl jsem poslat i zdrojový kód makra a nějakou prezentaci pro názornost, ale dnes jsem se nedostal na PC, kde toto makro mám.
Pokud výše uvedený popis problému není příliš srozumitelný pokusím se to zítra napravit makrem a nějakými obrázky.

Děkuji.
Ing Jan Cinert

Poslat zprávu | Profil
[#579] | Publikováno: 09.06. 2010 - 00:06
Teď jsem zkoušel celý postup "ručně", přímo v Catii - zjistěním je, že pokud jsem vybral všechny Body najednou, zkopíruje se opravdu jen Body z první instance. To samé se stane v makru, takže první podmínkou je, kopírovat postupně z jedné instance po druhé.
Problémem zůstává jak píšete jediný catpart pro všechny instance. Myslím že by to šlo následovně:
Rekurzí procházet sestavou a jakmile narazím na hledaný part (na začátku ho zadám např. výběrem), zaktivuju ho a přes selection.search() s parametrem "in" vyhledám požadované Body - jinak to asi opravdu nepůjde. Pak už by to mělo být jen Copy - Paste.
Selekce to určitě znatelně zpomalí, ale když to bude fungovat...
Josef Kuna

Poslat zprávu | Profil
[#691] | Publikováno: 17.06. 2010 - 20:15
Uživatel odpovídá na příspěvek #579:


Děkuji za dobrý tip. Tento postup se zdá velmi slibný. Zkoušel jsem to tak, že jsem vybral požadovaný part přes Selection.SelectElement2 a poté ho zaktivoval a vše fungovalo tak jak má. Problémem pro mě ale zůstává příkaz Selection.SelectElement2, který vyžaduje manuální výběr partu. Makro, které se snažím napsat by tuto selekci mělo provádět samočinně. Pokud by jste totiž měl v sestavě postupně vybírat několik desítek popř. stovek partů tak by to byla příšerná práce. Bohužel nemám vůbec představu, jak ze známé instance (ke které se mohu dostat např.přes rekurzi - jak jste doporučil) vybrat příslušný part. Zkoušel jsem vše možné, ale bez výsledku. Už z toho začínám pomalu šílet.

JK

PS: zkoušel jsem i kopírovat konkrétní Body z dané instance pomocí metody CreateReferenceFromName, ale buď tuto metodu používám špatně nebo je pro tyto případy nepoužitelná. Vždy se Body vykopírovalo tak, jako by jeho part byl otevřený v samostatném okně, takže po nakopírování ztratilo informace o své poloze v sestavě.
Ing Jan Cinert

Poslat zprávu | Profil
[#693] | Publikováno: 18.06. 2010 - 00:14
Zkusil jsem se na to podívat. Kouknětě na videoukázku do přílohy, jestli by to splňovalo vaši představu. Umí to kopírovat v podstatě cokoliv, stačí zadat název feature. Chvíli jsem se s tím trápil, místo parametru "in" se musí použít "sel", sám sebe jsem mystifikoval.
V podstatě to ale jde, samozřejmě by se to muselo doošetřit a dalo by se to uživatelsky zpříjemnit.

Přiložené soubory:
insert_with_position.zip

Josef Kuna

Poslat zprávu | Profil
[#698] | Publikováno: 18.06. 2010 - 10:10
Uživatel odpovídá na příspěvek #693:


To vypadá fantasticky! Mě se to nakonec povedlo vyřešit přes CreateReferenceFromName, ale zdá se mi, že je to pomalé a trochu těžkopádné z hlediska programování. Chtěl jsem Vás poprosit, zda by jste mohl uvést alespoň část kódu Vašeho makra. S metodou Selection.Search totiž nemám dosud žádné zkušenosti a velice rád bych Váš způsob porovnal s tím mým, zda je rychlejší a jednodušší. Pokud by jste měl zájem mohl bych připravit a uveřejnit kód mého makra.

děkuji

JK
Ing Jan Cinert

Poslat zprávu | Profil
[#705] | Publikováno: 19.06. 2010 - 20:04
Tak tedy, nejprve nadeklarujeme proměnné:
Dim oActiveDocument As Document

Dim oTargetPart As Part
Dim oTargetProduct As Product
Dim iOType(0)
Dim oSelection As Selection
Dim QueryString As String
Dim Status As String
Pak přijde na řadu hlavní program. V něm určíme název feature, které se budou kopírovat. Zatít to není nijak ošetřené, budou se kopírovat všechny feature s tímto názvem ze všech Partů (pokud tam budou). Dále vybereme cílový Part a zkontrolujeme prostředí (workbench).
Pak spustíme vlastní kopírování s rekurzí a nakonec Part updatujeme.
Set oActiveDocument = Catia.ActiveDocument

Set oSelection = oActiveDocument.Selection

'filtr pro selekci - je mozne vybrat jen Part
iOType(0) = "Part"

BodyName = InputBox("Zadejte nazev Body pro kopirovani", "Vstup", "")

'sestavime retezec pro vyhledavani - hledame podle nazvu pouze uvnitr vyberu
QueryString = "Name = '" & BodyName & "', sel"

'vlastni vyber Partu
Status = oSelection.SelectElement2(iOType, "Vyberte cilovy Part", false)

'vytvorime instanci ciloveho Partu a odpovidajiciho Produktu
Set oTargetPart = oSelection.Item(1).Value
Set oTargetProduct = oTargetPart.Parent


'funkce pro kopirovani
Explore oActiveDocument.Product

oTargetPart.Update()



A teď funkce Explore s kopírováním a rekurzí, parametrem je rodičovský produkt:
Sub Explore(oProduct)

Set oProducts = oProduct.Products

For Each oProduct In oProducts
oSelection.Clear()
'vybereme aktualne prochazeni Part
oSelection.Add(oProduct)
'a zkusime v nem najit vse, co se jmenuje "PartBody"
oSelection.Search(QueryString)
'pokud jsme neco nasli (a nehledame to v cilovem Partu), probehne vlastni kopirovani
If oSelection.Count > 0 And Not oProduct Is oTargetProduct Then
oSelection.Copy()
oSelection.Clear()
oSelection.Add(oTargetPart)
oSelection.PasteSpecial("CATPrtResultWithOutLink")
oSelection.Clear()
End If

If oProduct.Products.Count > 0 Then
Explore oProduct
End If
Next
End Sub

Tak jsem to vysvětlil vskutku polopatě. POZOR, před spuštěním by měla být aktivní sestava, jinak funkce Paste nebude fungovat. I to ale jde ošetřit a na začátku aktivovat hlavní sestavu.


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.