Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  CATIA V5 Programmierung
  C# / Mehrere Instanzen?

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
Autor Thema:  C# / Mehrere Instanzen? (5070 mal gelesen)
Helmut Steeg
Mitglied
Programmierer


Sehen Sie sich das Profil von Helmut Steeg an!   Senden Sie eine Private Message an Helmut Steeg  Schreiben Sie einen Gästebucheintrag für Helmut Steeg

Beiträge: 19
Registriert: 30.05.2007

Catia V5R16

erstellt am: 13. Dez. 2007 19:39    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von Jens Hansen an!   Senden Sie eine Private Message an Jens Hansen  Schreiben Sie einen Gästebucheintrag für Jens Hansen

Beiträge: 1055
Registriert: 05.08.2000

Win7
CATIA V5 R19
VB.Net
C#

erstellt am: 14. Dez. 2007 09:30    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Helmut Steeg 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von Helmut Steeg an!   Senden Sie eine Private Message an Helmut Steeg  Schreiben Sie einen Gästebucheintrag für Helmut Steeg

Beiträge: 19
Registriert: 30.05.2007

Catia V5R16

erstellt am: 14. Dez. 2007 10:00    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von Jens Hansen an!   Senden Sie eine Private Message an Jens Hansen  Schreiben Sie einen Gästebucheintrag für Jens Hansen

Beiträge: 1055
Registriert: 05.08.2000

Win7
CATIA V5 R19
VB.Net
C#

erstellt am: 14. Dez. 2007 14:13    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Helmut Steeg 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von noir333 an!   Senden Sie eine Private Message an noir333  Schreiben Sie einen Gästebucheintrag für noir333

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Helmut Steeg 10 Unities + Antwort hilfreich

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 Integer

Sub 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


Sehen Sie sich das Profil von Adamewin an!   Senden Sie eine Private Message an Adamewin  Schreiben Sie einen Gästebucheintrag für Adamewin

Beiträge: 6
Registriert: 14.04.2014

CATIA V5 R21 SP2 HF 57, Programmierung in C#

erstellt am: 24. Nov. 2014 17:27    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Helmut Steeg 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von noir333 an!   Senden Sie eine Private Message an noir333  Schreiben Sie einen Gästebucheintrag für noir333

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Helmut Steeg 10 Unities + Antwort hilfreich

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



Ausbildung Industriemechaniker Instandhaltung 2024 (m/w/x)

We're on it!
Arvato Supply Chain Solutions bietet dir eine der dynamischsten Arbeitsumgebungen, die du dir vorstellen kannst. Wir wachsen, wir sind innovativ, wir lösen jeden Tag die Herausforderungen unserer Kunden auf der ganzen Welt. Wie schaffen wir das? Mit unserem besonderen Spirit: We're on it. Wir sind ein globales Team aus 17.000 Kolleg:innen an 85 Standorten in über 20 Ländern und ...

Anzeige ansehenMechaniker
Nelson Munz
Mitglied
Dipl.-Ing.


Sehen Sie sich das Profil von Nelson Munz an!   Senden Sie eine Private Message an Nelson Munz  Schreiben Sie einen Gästebucheintrag für Nelson Munz

Beiträge: 24
Registriert: 14.07.2009

Windows 7
Catia V5 R18-R24

erstellt am: 19. Sep. 2017 21:07    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Helmut Steeg 10 Unities + Antwort hilfreich

Hallo,
wie sieht es hier inzwischen aus?
Hat jemand neue Erkenntnisse?

LG

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz