VB.Net detekovanie viacerých Catí
Uživatel | Příspěvek |
Peter Žonda ![]() ![]() Poslat zprávu | Profil |
Datum:
9.8. 2018
| Zobrazeno:
8812x Konfigurace CATIA: R26 Text dotazu: |
Ing Jan Cinert ![]() ![]() Poslat zprávu | Profil |
[#6530]
| Publikováno:
10.08. 2018 - 14:46 Dobrý den,
o tohle jsem se pokoušel již několikrát a zatím bez úspěchu. Zdaleka to není tak snadné, jak si představujete. Použitím metody GetObject() si makro vždy chytí v pořadí první běžící Catii (jako COM object). Catia je (doufám že to píšu správně) tzv. multi-instance application, tj. pokud spustíte více Catií, vidíte je jako samostatné procesy. Naopak u single-instance, můžete spustit program kolikrát chcete, ale pořád se tváří jako jeden proces, pouze má více oken s dokumenty. Poměrně dlouho jsem hledal řešení a poprvé narazil na možnost dostat se ke konkrétní instance přes tzv. ROT - running object table. V principu se instance chytala přes CLSID, ale i v tomto případě je tento identifikátor pokaždé totožny. Po chvíli laborování se snippetem se mi podařilo tuto možnost rozjet, ale se stejným výsledkem - vždy se mi vrátila prvně spuštěná instance. To jsem si nakonec potvrdil při dalším hledání na netu, kde tuto možnost jako řešení též zavrhli. Ptal jsem se i kamarádů programátorů, nikdo mi nebyl schopen říct, jak by se na to dalo jít (resp. nechtěli se úplně nezištně pouštět do práce s nejistým výsledkem) Ale...přesto existuje tohle video, ve které prezentují aplikaci CATIA Session manager, která umí ovládat instance jednotlivě, takže možnost určitě existuje. Princip by měl být v "uložení COM objektu do souboru" a následnou identifikací (převedení) do root objektu CATIA, se kterým už se dá pracovat. K tomu bylo třeba vytvořit / použít nějaké knihovny v C...a zde jsem to tenkrát vzdal. K videu na youtube jsem psal komentář s dotazem na dostupnost CS manageru, ale nikdo se neozval. PS: Pokud by se vám to podařilo, byl bych ochotný řešení koupit. |
Ing Jan Cinert ![]() ![]() Poslat zprávu | Profil | [#6531] | Publikováno: 10.08. 2018 - 14:59 |
Josef Kuna ![]() ![]() Poslat zprávu | Profil |
[#6532]
| Publikováno:
10.08. 2018 - 15:48 Dobrý den,
jeden způsob existuje, ale je pracný a v případě, že makra budete spouštět ve více vláknech tak se nebudou muset chovat korektně. Jde o to, že makro nepíšete jako klasickou WinForm aplikaci, ale jako .dll knihovnu, kterou musíte následně zaregistrovat do systému windows. Takovéto makro následně spouštíte vbs skriptem tak, že nejprve vytvoříte nový objekt z .dll a poté voláte příslušnou vstupní metodu s tím, že ji jako argument předáváte celou catii. Tento způsob jsem používal posledních 10let a postupně ho opouštím neb je velmi pracný na ladění (při ladění totiž musíte mít spuštené druhé VisualStudio s pomocným spouštěcím projektem do kterého je nareferencovaná vámi vytvořená dll knihovna) a navíc takto psaná makra v určitých specifických případech padají. Pokud byste měl zájem tak bych mohl napsat podrobný návod jak na to. |
Břeťa Doležal ![]() ![]() Poslat zprávu | Profil |
[#6533]
| Publikováno:
13.08. 2018 - 09:13 Získat jednotlivé instance programu CATIA by mělo jít přes WinAPI. Osobně zatím jen zjišťuji na začátku běhu makra, kolikrát je spuštěn process a vyžaduji od uživatele, aby měl puštěnou jen jedenkráte.
Už několik měsíců (možná i let) se chystám vrhnout na tuto ukázku kódu, jak získat všechny Excely: https://stackoverflow.com/questions/13807102/find-all-open-excel-workbooks a případně přepracovat pro CATIAi. Fce AccessibleObjectFromWindow by měla být opravdu schopna předat object z okna, pokud je přístupný. A přístupný by měl být, protože k němu přistupujeme. http://www.pinvoke.net/default.aspx/oleacc.AccessibleObjectFromWindow |
Břeťa Doležal ![]() ![]() Poslat zprávu | Profil | [#6534] | Publikováno: 13.08. 2018 - 09:13 |
Ing Jan Cinert ![]() ![]() Poslat zprávu | Profil |
[#6535]
| Publikováno:
13.08. 2018 - 09:21 Uživatel odpovídá na příspěvek #6532:Díky za reakci. Předpokládám ale, že i v tomhle případě je nutné mít pro spuštění integrovanou ikonu makra přímo v Catii, jinak se zase zavolá první instance.
Pokud tedy budu mít pro spouštění maker jinou externí aplikaci, nedá se to použít. Chci se za každou cenu vyhnout nutnosti pří každém ugrade prostředí Catia zdlouhavému a pracnému vytváření toolbarů s ikonami maker - když může existovat jeden nezávislý toolbar (který ale zatím neumí rozlišit více Catií...). PS: Úskalí makra jako dll znám, mám takhle několik pomocných knihoven a ladění je přesně tak příšerné jak říkáte :-) |
Ing Jan Cinert ![]() ![]() Poslat zprávu | Profil |
[#6536]
| Publikováno:
15.08. 2018 - 15:46 Update informací...
Vyzkoušel jsem funkci AccessibleObjectFromWindow, bohužel bez výrazného úspěchu. Přikládám použitý kód. DllImport("Oleacc.dll")> _ Kód je až do posledního řádku funkční. Podle popisů na webu se mi skutečně podařilo zachytit okno Catie, ale objekt je typu IAccessible, kde jsou jen omezené metody - nic čím by se dal zachytit COM objekt. Ve všech popisech (příkladu jsou na MS Excelu) se z tohoto objektu zavolá vlastnost .Application, což vrací kořenový COM objekt CATIA. Bohužel mě se nic podobného nepodařilo - v objektu iAccessible samozřejmě taková vlastnost neexistuje. Jediné pojítko s oknem Catie je vlastnost accName, kde se objevuje caption okna Catie. Vidím hned několik neznámých: 1) deklarace 4. parametru funkce, kde je typ UnmanagedType.IDispatch - co by to mělo správně být??? 2) Giud - typ INFTIF. Window má Guid v zakomentovaném řádku - když to ale použiju, funkce vrátí prázdný objekt Pokud by tohle mělo fungovat, bylo by to úžasné, ale jeví se mi to jako až moc jednoduché. Pořád doufám, že je mezi konstruktéry i jeden co umí trochu víc programovat ... |
Josef Kuna ![]() ![]() Poslat zprávu | Profil |
[#6540]
| Publikováno:
17.08. 2018 - 08:10 Uživatel odpovídá na příspěvek #6536:
Dobrý den, ano, je to přesně tak jak říkate. V catii musíte mít pomocný spouštěcí skript, díky kterému ".dll makro" nejen spouštíte, ale hlavně pomocí něho získáte konkrétní catii. Tento postup je tedy nepoužitelný pro externí aplikace, která spouští makra. |
Jakub Dědík ![]() ![]() Poslat zprávu | Profil |
[#6839]
| Publikováno:
26.09. 2020 - 10:35 Dobrý den,
udělal jsem stejný průzkum už dřív jako je zde popsaný a dospěl jsem ke stejnmu konci - je to náročné :D. Je to vlastně způsobené samotným Dassaultem, a mám pocit, že tuten problém se šíří dál i na 3DExperience :D. Chtěl jsem to řešit už několikrát ale vždy to okládám, protože na to není čas. |
Ing Jan Cinert ![]() ![]() Poslat zprávu | Profil |
[#6841]
| Publikováno:
26.09. 2020 - 10:58 Uživatel odpovídá na příspěvek #6839:
Na jednu stranu jsem rád, že i někdo jiný mám stejný názor, na druhou stranu by se to sem tam hodilo. Případy, kdy mají konstruktéři spuštěné dvě catie, a makro potřebují zrovna u té druhé, není málo.... Integraci VS u 3DExp jsem viděl naposled u V6R2014 a nějak moc se mi to nelíbilo. Už to, že je celý projekt uložený v databázi a není tak jednoduše přenositelný a tím pádem nezávislý je špatně. |
Josef Kuna ![]() ![]() Poslat zprávu | Profil |
[#7115]
| Publikováno:
06.04. 2023 - 23:02 Uživatel odpovídá na příspěvek #6530:
Dobrý den, Princip "uložení COM objektu do souboru" má novojíčínská firma Dytron a řešení je plně funkční. Používám cca 2 roky a funguje dobře. Zkuste se zeptat zda by produkt prodali. |
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.