Kopírování odečtových tělěs z více instancí do jednoho Partu/Productu
| Uživatel | Příspěvek |
Josef Kuna ![]() ![]() Poslat zprávu | Profil |
Datum:
8.6. 2010
| Zobrazeno:
12015x Konfigurace CATIA: Text dotazu: |
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. |
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 DocumentPak 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 A teď funkce Explore s kopírováním a rekurzí, parametrem je rodičovský produkt: Sub Explore(oProduct) 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.












