Autor
|
Thema: C# / Mehrere Instanzen? (5073 mal gelesen)
|
Helmut Steeg Mitglied Programmierer
Beiträge: 19 Registriert: 30.05.2007 Catia V5R16
|
erstellt am: 13. Dez. 2007 19:39 <-- editieren / zitieren --> Unities abgeben:
Hi. Ich glaube, die Frage in ähnlicher Form ist schonmal hier aufgetaucht, aber ich hab noch nicht gesehen, ob es eine Lösung dafür gab. Das Problem aktuell ist eine Anwendung in C#/Net2.0, die Skripte auflistet und über das SystemService.ExecuteScript() an Catia übergibt und ausführt. Das funktioniert soweit auch einwandfrei - allerdings nur, wenn der Anwender nur ein CATIA geöffnet hat. Sind mehrere Fenster geöffnet, erhalte ich immer nur das erste als Ergebnis von System.Runtime.InteropServices.Marshal.GetActiveObject("CATIA.Application"); zurück. Ein Versuch mit System.Runtime.InteropServices.Marshal.BindtoMoniker() hat auch nicht wirklich ein Ergebnis gebracht. Ein Dateiname als Übergabe (z.b. D:\Catia\test\test.catpart) wie das z.B. in Excel funktioniert, erzeugt in Catia nur eine Fehlermeldung (E_NOINTERFACE, Schnittstelle wird nicht unterstützt). Hat jemand eine Lösung oder eine Idee, wie ich da weiterkomme? Ein GetActiveObject() sollte mir ja eigentlich das zuletzt aktive Objekt liefern... Helmut Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Jens Hansen Mitglied Senior Consult
Beiträge: 1055 Registriert: 05.08.2000 Win7 CATIA V5 R19 VB.Net C#
|
erstellt am: 14. Dez. 2007 09:30 <-- editieren / zitieren --> Unities abgeben: Nur für Helmut Steeg
Hallo, liefert System.Runtime.InteropServices.Marshal ein Array als Ergebnis? (Habs noch nie kontrolliert) Wenn ein Array zurück kommt, dann kann man ja über die Instanzen auf die jeweiligen CATIA-Sitzungen zugreifen. Mal kurz nachgefragt: Warum sind denn mehrere Instanzen von CATIA offen ??? SG Jens Hansen Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Helmut Steeg Mitglied Programmierer
Beiträge: 19 Registriert: 30.05.2007 Catia V5R16
|
erstellt am: 14. Dez. 2007 10:00 <-- editieren / zitieren --> Unities abgeben:
Effektiv sieht es so aus: Verweise: INFITF;
Code:
INFITF.Application oCatia;oCatia = (INFITF.Application) Marshal.GetActiveObject("CATIA.Application");
das liefert dir ein Catia Objekt zur sofortigen Verwendung, das du dann wie in VB/VBA/VB.NET ansprechen kannst. also z.B.Code:
string sWbID; sWbID = oCatia.GetWorkbenchId();
oder Code:
INFITF.SystemService oSysServ; object[] aParams = { };oSysServ = oCATIA.SystemService; ... oSysServ.ExecuteScript( ref sPath, INFITF.CatScriptLibraryType.catScriptLibraryTypeDirectory, ref sFile, ref sFunc, aParams );
Wie gesagt, dieser Teil des Codes liefert wunderbare Ergebnisse zurück - solange nur ein Catia offen ist. Wenn zwei Catias offen sind, wird immer nur das erste angesprochen - oder es gibt eine ComException. Catia oder .NET scheint hier ein bisschen zu würfeln oder ist einfach nur zickig Warum 2 Catias offen sein müssen, ist mir selber nicht klar. Die Leute verwenden das halt so. Ich kanns den Leuten aber nicht verbieten. Naja, können eventuell schon, aber ich werde dann vermutlich einfach ignoriert Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Jens Hansen Mitglied Senior Consult
Beiträge: 1055 Registriert: 05.08.2000 Win7 CATIA V5 R19 VB.Net C#
|
erstellt am: 14. Dez. 2007 14:13 <-- editieren / zitieren --> Unities abgeben: Nur für Helmut Steeg
Hm..... klingt verfahren ... ich würde es dann gf. so handhaben, dass mittels Process nachgeschaut wird, wie oft CATIA als Prozess da ist. Bei mehr als einmal würde eine entsprechende meldung rausgeben und das Programm wieder schließen. SG Jens Hansen Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
noir333 Mitglied Ingenieur
Beiträge: 148 Registriert: 27.01.2004 Dell Precision 450 Dual Xeon, 2MB RAM, XP SP2, NX3 V5R17SP3
|
erstellt am: 06. Feb. 2009 19:38 <-- editieren / zitieren --> Unities abgeben: Nur für Helmut Steeg
Hallo zusammen, Der Beitrag ist zwar schon älter, aber ich denke immer noch aktuell. Ich habe ich in den letzten Tagen mit dem Problem beschäftigt und bin etwas weitergekommen, leider noch nicht zum endgültigen Erfolg. Unter .Net sollte das ansprechen mehrere Instanzen über die "Running Object Table" geschehen. Dazu haben ich den Code unten geschrieben. Dabei wird die ROT ausgelesen. Catia taucht dabei auch mit allen Instanzen auf (ist VB.Net Code, aber prinzipiell gleich): Code:
Public Declare Function CreateBindCtx Lib "ole32.dll" (ByVal reserved As Integer, ByRef ppbc As IBindCtx) As IntegerSub Catiaholen Dim ctx As IBindCtx = Nothing Dim bindinfo As IBindCtx = Nothing Dim pprot As IRunningObjectTable = Nothing Dim monikerlist As IEnumMoniker = Nothing Dim iError As Long Dim monikercontainer(10) As IMoniker Dim mc(100) As IMoniker Dim pointerFetchedMonikers As IntPtr = IntPtr.Zero Dim displayname As String = "" Dim Namlist(10000), astring As String Dim punk as Object Dim CATIA as INFITF.Application iError = CreateBindCtx(0, ctx) ctx.GetRunningObjectTable(pprot) pprot.EnumRunning(monikerlist) i = -1 monikerlist.Reset() While monikerlist.Next(1, monikercontainer, pointerFetchedMonikers) = 0 i = i + 1 monikercontainer(0).GetDisplayName(ctx, Nothing, displayname) monikercontainer(0).GetClassID(pCId) pprot.GetObject(monikercontainer(0), punk) If displayname = "!{87FD6F40-E252-11D5-8040-0010B5FA1031}" Then CATIA = punk CATIA.Caption = CStr(i) End If displayname = CStr(i) + "<|>" + displayname + "<|>" + pCId.ToString + "<|>" + TypeName(punk) Namlist(i) = displayname mc(i) = monikercontainer(0) End While End sub
In der Schleife sollte in der Caption jeder Catia-Sitzung die Nummer des Eintrags in der ROT erscheinen. Leider bekomme ich auch hier aus dem pprot.GetObject immer nur die erste Catia-Sitzung. Weiß jemand, ob das so sein muss, oder mache ich was falsch? ------------------ ----------- Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Adamewin Mitglied
Beiträge: 6 Registriert: 14.04.2014 CATIA V5 R21 SP2 HF 57, Programmierung in C#
|
erstellt am: 24. Nov. 2014 17:27 <-- editieren / zitieren --> Unities abgeben: Nur für Helmut Steeg
Hallo zusammen, der Beitrag ist ja schon etwas älter. Aber ich stehe trotzdem noch vor dem gleichen Problem. Hat jemand hierfür inzwischen eine Lösung gefunden oder ist es nach wie vor nicht möglich auf weitere Instanzen von CATIA zuzugreifen? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
noir333 Mitglied Ingenieur
Beiträge: 148 Registriert: 27.01.2004 Dell Precision 450 Dual Xeon, 2MB RAM, XP SP2, NX3 V5R17SP3
|
erstellt am: 25. Nov. 2014 08:13 <-- editieren / zitieren --> Unities abgeben: Nur für Helmut Steeg
Hallo Adamewin, meines Wissens nach nicht möglich. Ich habe in einer Firma schon mal eine Lösung dafür gesehen. Dazu muss aber beim Start von Catia eine Zusatzsoftware ausgeführt werden, die eine Identifizierung über die ROT möglich macht. Vielleicht gibt es aber auch mit den neueren .NET Versionen mehr Möglichkeiten. Weiß da jemand anders mehr? ------------------ ----------- Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Nelson Munz Mitglied Dipl.-Ing.
Beiträge: 24 Registriert: 14.07.2009 Windows 7 Catia V5 R18-R24
|
erstellt am: 19. Sep. 2017 21:07 <-- editieren / zitieren --> Unities abgeben: Nur für Helmut Steeg
|