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

VB.Net detekovanie viacerých Catí

Kompletní přehled příspěvků v tématu VB.Net detekovanie viacerých Catí řazený podle data jejich publikace na fóru.

UživatelPříspěvek
Peter Žonda

Poslat zprávu | Profil
Datum: 9.8. 2018 | Zobrazeno: 812x
Konfigurace CATIA: R26

Text dotazu:
Dobrý deň, už dlhšiu dobu sa pokúšam zistiť ako by bolo možné ovládať viacerých Catí.
Skúšal som:
.....
Dim Catia1 AS Application
Dim Catia2 AS Application
....

Catia1 = Object(“Catia.Application.1”)
Catia2 = Object(“Catia.Application.2”)
...
Avšak to nefunguje.
Do teraz som vytváral macrá iba v prostredí CATIE, kde s tym nieje problem. Avšak Visual Studio poskytuje oveľa väčšie možnosti
ako samotné prostredie CATIE. Avšak pri praci s Catiov používam väčšinou viac ako jednu CATIU. Našiel by sa niekto kto by mi
vedel s týmto pomôcť ?
Za odpoveď velmi pekne ďakujem.

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
Přidávám ještě link s návodem:

http://www.coe.org/p/fo/et/thread=26825
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.


'kolik běží procesů Catie
locProc = Process.GetProcessesByName("CNEXT")
If locProc.Count > 1 Then 'pokud běží více CATII najednou, nutno ošetřit


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")> _

Private Shared Function AccessibleObjectFromWindow(ByVal hwnd As Int32, ByVal dwObjectID As UInt32, ByVal riid As Byte(), <MarshalAs(UnmanagedType.IDispatch)> ByRef ppvObject As Object) As Int32
End Function

Private Sub COMFromWindow(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim CATIAWindow As Object
Dim CATIAProcess As Process = Process.GetProcessesByName("cnext").FirstOrDefault()
Dim hWnd As Int32 = CATIAProcess.MainWindowHandle
Const OBJID_NATIVEOM As Int32 = 0
Dim IID_IDispatch As Guid = New Guid("618736E0-3C3D-11CF-810C-00AA00389B71")
' Dim IID_IDispatch As Guid = New Guid("7FBD9AB0-6840-0000-0280-030BA6000000") '
Dim Result As Int32 = AccessibleObjectFromWindow(hWnd, OBJID_NATIVEOM, IID_IDispatch.ToByteArray, CATIAWindow)

CATIA = CATIAWindow.Application
End Sub


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.


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.