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:
11736x 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.