Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  CATIA V5 Programmierung
  Late Binding mit Visual Basic 2008 Express Edition

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:  Late Binding mit Visual Basic 2008 Express Edition (5079 mal gelesen)
INLU
Mitglied
Konstrukteur Automotive


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

Beiträge: 71
Registriert: 01.03.2008

erstellt am: 30. Jan. 2009 23:57    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

Hallo Mitstreiter,

Ich habe mal eine grundsätzliche Frage zum Late Binding mit Visual Basic 2008 Express Edition.
Ich habe versucht das Late Binding wie in Jens Hansen's Buch "Kochbuch- Catia V5 automatisieren" mit Visual Basic Express umzusetzen.
Dort ist beschrieben, das man Objekte über
lb_result = ob.GetType().InvokeMember(Befehl, Reflection.BindingFlags.GetProperty, Nothing, ob, param)
ansprechen kann( Syntax müsste für Visual Express richtig sein, da im Buch ja C# beschrieben ist).
Nun scheint es bei VB Express 2008 aber so zu sein, dass nach dem Befehl
CATIA = System.Runtime.InteropServices.Marshal.GetActiveObject("CATIA.Application")
Der Com-Verweis von Catia angezogen wird, und man die Objekte fast wie im Early Binding ansprechen kann.

Hat jemand da schon Erfahrung gemacht?

MfG
  Lars

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: 31. Jan. 2009 12:52    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 INLU 10 Unities + Antwort hilfreich

Hallo Lars,
was genau meinst du? Hast du ein konkretes Beispiel?

SG

Jens Hansen

------------------
Inoffizielle CATIA-Hilfeseite
Private Seite
Xing
Kochbuch - CATIA V5 automatisieren

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

INLU
Mitglied
Konstrukteur Automotive


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

Beiträge: 71
Registriert: 01.03.2008

erstellt am: 31. Jan. 2009 18: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

Hallo Jens,

Ja, kann ich. In Deinem Buch beschreibst du, dass man beim Late Binding in C# keine Verschachtelung von V5-Anweisungen gemacht werden können z.b. Part1.Bodies.Count . Kann es sein, dass das nicht für VB Express 2008 gilt ?
Ich möchte über ein Macro Veröffentlichte Körper von einem Part in das andere Kopieren. Da ich aber eine Checklistbox für das auswählen der einzelnen Körper verwenden möchte, hab ich mich für VB Express 2008 entschieden. Im VBA-Editor von V5 ist das Element ja so ohne weiteres nicht zu verwenden. Also habe ich den ersten Code im VBA-Editor erzeugt (wegen der Syntax) und ihn ins VB Express kopiert. Und siehe da, es funktioniert. Auch ohne Com-Verweis. In dem Moment, in dem die Zeile :CATIA = System.Runtime.InteropServices.Marshal.GetActiveObject("CATIA.Application") ausgeführt wird, kann man in den Verweisen unter Eigenschaften sehen, das VBE wohl aus der offenen Catiaversion sich die passenden COM Bibiotheken (MecmodInterface und GSMInterface)angezogen hat.

Ist meine Annahme richtig?

Anscheinend kann ich dann Ohne die Unterprogramme lg_get, lb_set und lb_methode arbeiten! Oder habe ich einen Denkfehler?

hier mein kopierter Code:
------------------------------
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        On Error Resume Next

        CATIA = System.Runtime.InteropServices.Marshal.GetActiveObject("CATIA.Application")

        Version = "0.1"
        makroname = "Körper Kopieren"

        Me.Text = makroname + " " + Version

        Document = CATIA.ActiveDocument
        If Err.Number <> 0 Then
            MsgBox("Es ist kein Dokument geöffnet", 16, makroname + " " + Version)

            End

        End If

        txt = Split(Document.Name, ".")

        If Not txt(1) = "CATProduct" Then
            MsgBox("Aktives Dokument ist keine Baugruppe", 16)
            End
        End If

        'Selektion einbau

        Sel = Document.Selection

        InputObject(0) = "Part"

        Usersel = Sel.SelectElement2(InputObject, "Part in das verbaut werden soll selektieren", False)

          If Usersel = ("Cancel") Then
              End
          End If

        oSendepart = Sel.Item(1).Value.Parent

        bodylist = GetPublications(oSendepart)

        If UBound(bodylist) = 0 Then

            Call MsgBox("Es ist keine Veröffentlichung im Part vorhanden" _
                        & vbCrLf & "Makro wird abgebrochen!" _
                        , vbCritical, "Keine Veröffentlichung vorhanden")

            End

        End If

        Dim I
        I = 1
        For I = 1 To (UBound(bodylist) + 1)
            Splits = Split((bodylist(I - 1).Valuation.Displayname), "/!")

            Me.Publiclist1.Items.Add(Splits(UBound(Splits)))

        Next

        Usersel = Sel.SelectElement2(InputObject, "Part das verbaut werden soll selektieren", False)

        If Usersel = ("Cancel") Then
            End
        End If

        oEmpfangspart = Sel.Item(1).Value.Parent

       
    End Sub
Function GetPublications(ByVal MyPart)
        'Gibt ein Array mit allen Publications als Objekte zurück

        Dim MyPubarr()

        For I = 1 To (MyPart.Product.Publications.Count)
            ReDim Preserve MyPubarr(I - 1)
            MyPubarr(I - 1) = MyPart.Product.Publications.Item(I)
        Next

        GetPublications = MyPubarr

    End Function
--------------------------------------------
mfg

  Lars

P.S.: Dein Buch ist mir eine sehr grosse Hilfe Jens!!! Danke, weiter so!!

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: 31. Jan. 2009 22:15    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 INLU 10 Unities + Antwort hilfreich

Hallo Lars,
es wundert mich, dass der Debugger unter C# das mitmacht. Was hast du denn für Einstellungen in deinem C#-Projekt vorgenommen?
Normalerweise gibt der Debugger einen Fehler aus wenn eine Eigenschaft definiert wird, die nicht über IntelliSense verfügbar ist.

SG

Jens Hansen

------------------
Inoffizielle CATIA-Hilfeseite
Private Seite
Xing
Kochbuch - CATIA V5 automatisieren

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

INLU
Mitglied
Konstrukteur Automotive


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

Beiträge: 71
Registriert: 01.03.2008

erstellt am: 01. Feb. 2009 13:03    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

Hallo Jens.

Ich hoffe Du meinst die Einstellungen in meinem Visual Basic Express Projekt (Ich mach es ja nicht in C#).
Ich habe keine besondere Einstellung vorgenommen, also auch keinen Com-Verweis auf die Catia Bibliotheken. Allerdings habe ich für ein anderes Projekt die Com-Verweise für Mecmod und GSMInterface gesetzt. Komischerweise tauchen diese auch auf, wenn ich VBE frisch starte und mir über Projekte->Verweis Hinzufügen->Aktuell  die Bibliotheken anschau. Heißt das, dass der Com Verweis doch existiert? Leider habe ich nur R16 installiert, also kann ich das nicht ausprobieren. Oder werden die Bibliotheken automatisch von XP geladen? Unter den Projektverweisen sind sie aber nicht vorhanden.
Mfg
Lars

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

INLU
Mitglied
Konstrukteur Automotive


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

Beiträge: 71
Registriert: 01.03.2008

erstellt am: 19. Sep. 2010 17:50    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

Hallo nochmal Jens,

der Thead ist zwar schon alt, aber ich habe immer noch keine Lösung für mein Problem über Visual Basic das late binding zu realisieren.

Vielleicht kannst Du oder Jemand anderes mir da doch auf Pferd helfen.
Ich Versuche also über Visual Basic Express das Late Binding auf die laufende Catia-Instanz.

Weis Jemand wie das umzusetzen ist?

mfg
    Lars

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

Tstone
Mitglied
Werkzeugkonstrukteur


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

Beiträge: 163
Registriert: 04.06.2003

Dell Precision 470
Intel Xeon CPU 3,00GHz
2GB Ram
Microsoft Windows XP
Catia V5 R18 SP6
VB2005

erstellt am: 20. Sep. 2010 09:21    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 INLU 10 Unities + Antwort hilfreich

Hallo INLU,
sicher kannst du bei VisualBasic.Net "verschachtelte Anweisungen" trotz LateBinding nutzen. (wie es bei C# aussieht weiß ich nicht).
Bei LateBinding steht dir aber definitiv kein Intellisence zur Verfügung. Wenn du aber die Programmausführung nach dem .GETACTIVEOBJECT...(z.B. durch einen Haltepunkt) anhälst, werden die Objekte aufgelöst und die entsprechenden Eigenschaftenwerte angezeigt.
Wenn dir allerdings Intellisence zur Verfügung steht, solltest du deine Projektverweise nochmals checken.

------------------
Grüße TStone
   "Respektiere die Macht der Worte, wähle sie mit Bedacht!"

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

INLU
Mitglied
Konstrukteur Automotive


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

Beiträge: 71
Registriert: 01.03.2008

erstellt am: 20. Sep. 2010 10:49    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

Hallo TStone,

das ist ja schon mal gut zu wissen. Mein größtes Problem ist allerdings, dass ich nicht genau weiß, wie ich die Verbindung zu Catia im Late Binding umsetzen muss. Im Buch von Jens Hansen ist das Late Binding mit C# erklärt. Ich bekomme das aber nicht auf VB umgemünzt. Ich habe anscheinend Probleme mit der Syntax. Hast du so etwas schon umgesetzt?

mfg
  Lars

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

DanielFr.
Moderator
Manager


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

Beiträge: 2506
Registriert: 10.08.2005

HP Compaq 8710w, Intel Core Duo T7700, 2,40 Ghz, 3GB RAM, Windows XP Professionel @32bit, Quadro FX 1600M, CATIA V5 R19 SP3

erstellt am: 20. Sep. 2010 11:51    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 INLU 10 Unities + Antwort hilfreich

Hallo  ,

der Syntax bleibt der selbe. Beim Early Binding werden die Com-Verweise zu den CATIA-Klassen explizit angegeben. Somit ist es Möglich ein Objekt auch den CATIA spezifischen Datentyp über die Dim Anweisung zuzuordnen (z.B. Dim oPart as Part). Beim Late Binding hingegegen gibt es keine Verweise auf die Com-Klassen. D.h. du kannst auch keinen CATIA spezifischen Datentyp deklarieren. In diesem Fall werden alle Variablen die von einem CATIA Objekt vererbt sind einfach als Objekte deklariert.

Beispiel:

EARLY BINDING
Dim oDoc as PartDocument
Dim oPart as Part
Dim oName as String

Set oDoc = CATIA.ActiveDocument
Set oPart = oDoc.Part
oName = oPart.Name


LATE BINDING
Dim oDoc as Object
Dim oPart as Object
Dim oName as String

Set oDoc = CATIA.ActiveDocument
Set oPart = oDoc.Part
oName = oPart.Name

------------------
MFG Daniel

Systeminformation | Inoffizielle CATIA Hilfeseite | CATIA FAQ | Suche | TraceParts (Normteile...) | 3D Content Central (noch mehr Normteile...)

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

INLU
Mitglied
Konstrukteur Automotive


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

Beiträge: 71
Registriert: 01.03.2008

erstellt am: 20. Sep. 2010 12:43    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

Hallo Daniel,

AHA! Das habe ich verstanden. Kann man trotzdem alle Methoden der Catiatypen verwenden?

Problematisch ist für mich aber das Verbinden mit dem Catia-Objekt. Im Buch von Jens wird das ja dann über die Funktionen lb_get u.s.w. gelöst. Wie setzte ich das in VB um?

Und reicht es im Programm den Aufruf
CATIA = System.Runtime.InteropServices.Marshal.GetActiveObject("CATIA.Application")
zu haben, oder muss noch etwas programmiert werden?

mfg
  Lars

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

DanielFr.
Moderator
Manager


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

Beiträge: 2506
Registriert: 10.08.2005

HP Compaq 8710w, Intel Core Duo T7700, 2,40 Ghz, 3GB RAM, Windows XP Professionel @32bit, Quadro FX 1600M, CATIA V5 R19 SP3

erstellt am: 20. Sep. 2010 13:22    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 INLU 10 Unities + Antwort hilfreich

Hallo  ,

das wird einfach über die Methode GetObject in VB.NET realisiert. Du kannst alle Methoden und Eigenschaften genauso wie mit einem early Binding verwendet, hast aber keine intelliSense Unterstützung! Des weiteren kannst du nicht über den Objekt-Brwoser auf die Objekte, Methoden und Klassen zugreifen. D.h. während der Entwicklung eines komplexen Programms ist es für den Workflow (der Programmierung) sicherlich einfacher ein early Binding einzusetzen. Wenn du das Programm dann final veröffentlichst dann ersetzt du alle CATIA-Dateityp-Objekte einfach durch "Object" und löst die Verweise (dann hast du wiederum ein Late Binding).

Hier ein Beispiel um an das CATIA Objekt mittels VB.NET zu kommen (CATIA V5 muss ordentlich in der Registry registriert sein, sonst kann kein ActiveX Objekt von der Instanz erzeugt werden und die Funktion gibt den Wert Nothing zurück!)

Code:

Sub Main()

    Dim CATIA As Object
   
    CATIA = GetCATIA

    If CATIA is Nothing then
      MsgBox "CATIA konnte nicht gestartet werden"
      Exit SUb
    End If
   
End Sub


Private Function GetCATIA() As Object

    CATIA As Object
   
    On Error Resume Next
   
    CATIA = GetObject(, "CATIA.Application")
   
    If CATIA Is Nothing Then
        CATIA = CreateObject("CATIA.Application")
    Else
        Return CATIA
    End If
   
    If Not CATIA Is Nothing Then
        Return CATIA
    Else
        Return Nothing
    End If
   
    On Error GoTo 0
   
End Function


------------------
MFG Daniel

Systeminformation | Inoffizielle CATIA Hilfeseite | CATIA FAQ | Suche | TraceParts (Normteile...) | 3D Content Central (noch mehr Normteile...)

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

INLU
Mitglied
Konstrukteur Automotive


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

Beiträge: 71
Registriert: 01.03.2008

erstellt am: 21. Sep. 2010 17:41    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

Hallo Daniel,

ich habe es gerade ausprobiert, und es klappt.

Dann frage ich mich, warum das in C# so umständlich ist.

Danke für die Hilfe !

mfg
  Lars

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

gladly
Mitglied



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

Beiträge: 56
Registriert: 02.11.2007

Catia V5R19SP9HF40 64Bit
Windows XP Pro x64

erstellt am: 29. Sep. 2010 16:17    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 INLU 10 Unities + Antwort hilfreich

Diese Umständlichkeit in C# ist auch in VB nötig. Der Unterschied warum du allerdings direkt auf Eingenschaten und Methoden in VB zugreifen kannst liegt daran, da der VB-Compiler automatisch den benötigten Code erzeugt. Der C#-Compiler nicht (bzw. soll er eigentlich seit .net 2010 auch können, habe ich aber nicht nicht getestet)

Fals dir der .netReflector was sagt schau dir mal ein Programm an welches du mit VB geschrieben hast.

Schreibe einfach mal folgendes in VB:
Es bennent in einem Part nen PartBody um.

Dim catia As Object = System.Runtime.InteropServices.Marshal.GetActiveObject("CATIA.Application")
Dim o As Object
o = CATIA.ActiveDocument.Part.Bodies.Item(1)
dim oldname as String = o.name
o.name = "Test"

im entgültigen Code sieht es wie folgt aus:

Dim o As Object = RuntimeHelpers.GetObjectValue(NewLateBinding.LateGet(NewLateBinding.LateGet(NewLateBinding.LateGet(NewLateBinding.LateGet(RuntimeHelpers.GetObjectValue(Marshal.GetActiveObject("CAT IA.Application")), Nothing, "ActiveDocument", New Object(0  - 1) {}, Nothing, Nothing, Nothing), Nothing, "Part", New Object(0  - 1) {}, Nothing, Nothing, Nothing), Nothing, "Bodies", New Object(0  - 1) {}, Nothing, Nothing, Nothing), Nothing, "Item", New Object() { 1 }, Nothing, Nothing, Nothing))
    Dim oldname As String = Conversions.ToString(NewLateBinding.LateGet(o, Nothing, "name", New Object(0  - 1) {}, Nothing, Nothing, Nothing))
    NewLateBinding.LateSet(o, Nothing, "name", New Object() { "Test" }, Nothing, Nothing)


Nun sieht das auch schon wieder wie in C# aus. Nur das der Compiler dir die schreibarbeit abgenommen hat.


mfg

gladly

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

INLU
Mitglied
Konstrukteur Automotive


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

Beiträge: 71
Registriert: 01.03.2008

erstellt am: 30. Sep. 2010 10:23    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

Hallo gladly,

gut, ich dachte schon, ich hätte das prinzip nicht verstanden. Hat sich da denn auch was bei Visual Basic 2010 geändert. Du scheinst ja gut in der Materie zu stecken. Lohnt sich das Upgraden auf 2010?

mfg
  Lars

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

INLU
Mitglied
Konstrukteur Automotive


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

Beiträge: 71
Registriert: 01.03.2008

erstellt am: 02. Okt. 2010 14:53    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

Hallo,

ich habe nun etwas rumprobiert, und bin wiedermal auf ein Problem gestoßen. Wer hätte das gedacht .

Ich erzeuge mir zwei Körper in einem Part. Nun möchte ich die beiden über add verbauen. Dafür möchte ich den ersten erzeugten Körper, mit folgendem Code in Bearbeitung definieren:

Code:

        Dim apart As Object
        Dim Wzk3d As Object

        apart = partDocument1.Part
        Wzk3d = apart.ShapeFactory

        aktuell = apart.Bodies.Item(2)
        bool = apart.Bodies.Item(3)

        'Boolsche Operation
        apart.InWorkObject = aktuell
        Dim operation As Object
        operation = Wzk3d.AddNewAdd(bool)

        operation.Name = kobe2

        apart.update()



Unter VBA funktioniert alles wie es soll.
In VB2008 bekomme ich bei der Zeile : apart.InWorkObject = aktuell folgende Fehlermeldung: COMException wurde nicht behandelt. (Ausnahme von HRESULT: 0x80020003 (DISP_E_MEMBERNOTFOUND)).

Eine ähnliche fehlermedung ist in fogendem thead beschrieben. http://ww3.cad.de/foren/ubb/Forum137/HTML/002817.shtml#000000
Da handelt es sich aber um eine Meldung beim Early Binding.

Kennt jemand das Problem?

mfg
  Lars

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

Tstone
Mitglied
Werkzeugkonstrukteur


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

Beiträge: 163
Registriert: 04.06.2003

Dell Precision 470
Intel Xeon CPU 3,00GHz
2GB Ram
Microsoft Windows XP
Catia V5 R18 SP6
VB2005

erstellt am: 04. Okt. 2010 08:01    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 INLU 10 Unities + Antwort hilfreich

Hallo INLU,
in dem Betrag, auf den du hingewiesen hast, wird das Problem durch Wechsel zu early binding gelöst. Die Fehlermeldung, die du erhälst ist eigentlich typisch für late binding (nicht typsicheres arbeiten hat halt auch seine Nachteile). Deklariere deine Objekte mit dem richtigen Typen (wie in deinem Beispielbeitrag beschrieben), dann könnte dein Problem schon gelöst sein.

------------------
Grüße TStone
   "Respektiere die Macht der Worte, wähle sie mit Bedacht!"

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

INLU
Mitglied
Konstrukteur Automotive


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

Beiträge: 71
Registriert: 01.03.2008

erstellt am: 05. Okt. 2010 11:40    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

Hallo Tstone,

was wäre denn der Richtige Typ? Den Code siehst du ja etwas weiter oben. Ich habe mich jetzt ein bisschen durch die VB Hilfe gelesen. Wie ich das verstanden habe, liegt es wohl daran, dass es in VB kein set mehr gibt. Ich muss ja mit meinem Code den Zustand mit apart.InWorkObject = aktuell ändern. Die Meldung kommt halt daher, weil aktuell ein Objekt ist. Welcher Typ wäre denn richtig?
Anscheinend Interpretiert VB das als Set apart.InWorkObject = aktuell , und das geht ja wirklich nicht.

Oh man........

mfg
  Lars

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

Tstone
Mitglied
Werkzeugkonstrukteur


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

Beiträge: 163
Registriert: 04.06.2003

Dell Precision 470
Intel Xeon CPU 3,00GHz
2GB Ram
Microsoft Windows XP
Catia V5 R18 SP6
VB2005

erstellt am: 05. Okt. 2010 12:43    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 INLU 10 Unities + Antwort hilfreich

Hallo Inlu,
solange du mit late binding arbeitest, sehe ich keine Möglichkeit das Problem zu lösen. Ich habe dein Problem mal, mit deinem Code nachgestellt und bekomme bei late binding die gleiche Fehlermeldung wie du.
Füge ich aber einen Verweis auf *CATIA V5 MecModInterfaces Object Library* hinzu und deklariere:
Dim apart As MECMOD.Part
dann funktioniert das Ganze.
Aber vielleicht kann dir ein Vertreter der late binding- Fraktion noch einen Tip geben.
Da ich meistens (immer geht leider nicht danke dem Objektmodell von Catia) typsicher arbeite (early binding), bin ich sicherlich auch nicht mit allen Tricks bei late binding vertraut.

------------------
Grüße TStone
   "Respektiere die Macht der Worte, wähle sie mit Bedacht!"

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

gladly
Mitglied



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

Beiträge: 56
Registriert: 02.11.2007

Catia V5R19SP9HF40 64Bit
Windows XP Pro x64

erstellt am: 11. Okt. 2010 15:54    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 INLU 10 Unities + Antwort hilfreich

Hallo nochmal,
vorab schuldige, dass ich mich erst nun melde...
So nun zum Problem:
Ich musste es natürlichgleich Probieren mit deinem "InWorkObject" und ja es funktioniert (zumindest) unter .net 2005 als implizite Late-Binding tatsächlich nicht.
Ich habe es somit per Hand gemacht und es funktioniert.

Code sähe so aus:

Code:

Dim catia As Object = System.Runtime.InteropServices.Marshal.GetActiveObject("CATIA.Application")
Dim oPart As Object
oPart = CATIA.ActiveDocument.Part
Dim oBody As Object = oPart.HybridBodies.item(1)
'Get Funktioniert...
Dim o As Object = oPart.InWorkObject
'Hier der Code zum Setzen der Property
oPart.[GetType]().InvokeMember("InWorkObject", BindingFlags.SetProperty, nothing, oPart, new Object() {oBody})

Vll wird bei der impliziten Variante ein Falsches Binding gesetzt, keine Ahnung... Ich kenne mich eigentlich eher wenig damit aus. Hatte es nur einmal etwas aufwendiger nutzen müssen. Und der .netReflector schickt einen nur immer tiefer ins Framework hinnein...

Zur hilfe kann ich dir nur eine Klasse geben, welche den Zugriff per Reflection sehr erleichter (die ich früher auch gut gebraucht hätte)

Zu Finden unter: http://mattberseth.com/blog/2007/04/net_reflection.html

Achja die änderung auf VB2010 ist eigentlich egal. Implitzites Late-Binding wird ja seit 2005 unterstützt. Nur wenn du C# programmierst musst du mit der 2010-Version (bzw. .net Framwork 4) arbeiten, um auch dort implizites Late-Bindung zu erhalten. (Nicht getestet nur gelesen in der MSDN!)

mfg

gladly

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

INLU
Mitglied
Konstrukteur Automotive


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

Beiträge: 71
Registriert: 01.03.2008

erstellt am: 14. Okt. 2010 17:03    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

Hallo gladly,

Du hast Recht! Bei VB2008 allerdings mit der kleinen Änderung:

oPart.[GetType]().InvokeMember("InWorkObject", System.Reflection.BindingFlags.SetProperty, nothing, oPart, new Object() {oBody}).

Dein Link scheint nicht mehr zu funktionieren. Das mit den BindingFlags ist mir auch ein bisschen zu hoch!

Vielen Dank für die Hilfe!

mfg
  Lars

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

gladly
Mitglied



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

Beiträge: 56
Registriert: 02.11.2007

Catia V5R19SP9HF40 64Bit
Windows XP Pro x64

erstellt am: 15. Okt. 2010 11:24    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 INLU 10 Unities + Antwort hilfreich


Reflector_VB.txt


ReflectionFacade.zip

 
Hallo wieder einmal,

Sorry wegen des Fehlers, ich hatte den Reflection-Namespace importiert...
Bezüglich der Binding-Flags kann ich auch nur sagen, dass auch ich es nicht ganz verstehe. Aber um die Grundsätze zu verstehen, helfen Beispiele und die Dokumentation des SDK!

Die Seite funktioniert tatsächlich nicht mehr. Der Domain-Name ist laut Anzeige am 13.10.2010 abgelaufen (Bei mir lief Sie also tatsächlich noch).
Deshalb schicke ich anbei die Datei mit Verweis auf die oben angegebene Seite des Urhebers.
Ich weis nicht ob ich das durfte, da keine Bestimmte Lizenz angegeben war, aber ich habe dir eine konvertiere Version für Visual Basic zur Verfügung gestellt, da die ursprüngliche Klasse in C# geschrieben war.
Ein beispiel der benutzung liegt übrigends in Form der Application.cs vor. Allerdings ist es eigentlich auch fast selbsterklärend.

mfg

gladly

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