Truevision3D Engine in Autoit nutzen

  • Hi,
    ich versuche derzeit die Truevision 3D Engine mithilfe von COM in Autoit zu nutzen. Nach ersten Erfolgen kristallisieren sich zwei Hauptprobleme:
    1. Es sieht so aus, als ob ich keine Funktion aufrufen kann, die einen Wert zurück gibt.
    Z.B. funktioniert folgendes einwandfrei, während das Beispel darunter den darauf folgenden Fehler verursacht.

    [autoit]


    $oTVEngine.Clear()
    $oTVscene.RenderAll(True,True)
    $oTVEngine.RenderToScreen()

    [/autoit]


    [autoit]


    If _IsPressed("28") Then
    $x = $oTVcamera.GetPosition.x()
    ConsoleWrite("act x:" & $x)
    $y = $oTVcamera.GetPosition.y()
    ConsoleWrite("act y:" & $y)
    $z = $oTVcamera.GetPosition.z()
    ConsoleWrite("act z:" & $z)
    $oTVcamera.SetPosition($x, $y, $z + 1)
    EndIf

    [/autoit]


    Hier erhalte ich folgenden Fehler:

    Code
    : ==> The requested action with this object has failed.:
    $x = $oTVcamera.GetPosition.x()
    $x = $oTVcamera.GetPosition^ ERROR


    Weder das, noch

    [autoit]

    $x = $oTVcamera.GetPosition().x

    [/autoit]


    oder

    [autoit]

    $x = $oTVcamera.GetPosition()

    [/autoit]


    funktioniert.
    Allerdings habe ich mit der "gegenteiligen" Methode .SetPosition() keine Probleme.
    Es scheint so, dass ich bei jeder Funktion die etwas zurückgibt einen Fehler erhalte.
    Wenn ich mit dem Error-Handler den Fehler abfange sagt der mir "Parameter falsch", Fehlercode:80070057.
    Wenn ich diesen Fehler abfange und die Engine noch etwas laufen lasse, dann erhalte ich nach kurzer Zeit wieder einen
    abgefangenen Fehler, diesmal "Typkonflikt", Fehlercode:80020005. Möglicherweise hat dieser Fehler auch etwas damit zu tun...

    Die Instanzierung und das nutzen von Methoden ohne Rückgabewert funktioniert allerdings einwandfrei:

    [autoit]


    $oTVcamera = ObjCreate("TV3D65.TVCamera")
    With $oTVcamera
    .SetViewFrustum(45, 10000)
    .SetCamera(250, 550, 250,0,0,0)
    EndWith

    [/autoit]

    2. Habe ich ein Problem mit der Übergabe von Fenster handles, weswegen es mir derzeit nur möglich ist, die Engine im Fullscreen-mode zu initialisieren:

    [autoit]


    With $oTVEngine
    .Init3DFullscreen(800,600) ;funktioniert
    ;.Init3DWindowed($hWin, True) ;Dies allerdings nicht.
    EndWith

    [/autoit]

    Ich nutze Win 7 Starter x86, Autoit 3.3.6.1 & Truevision 3d SDK 6.5

    Danke für eure Antwort im Voraus
    Dr.Doktor

    Einmal editiert, zuletzt von Dr.Doktor (21. Juli 2010 um 18:45)

  • Hallo.

    Also ich weiß nicht ob es funktioniert und kanns auch net testen, aber versuch mal das hier:

    [autoit]

    $x = $oTVcamera.GetPositionX()

    [/autoit]

    Könnte klappen, oder auch net, aber n versuch schadet nicht oder ??
    MfG. PrideRage

    Meine Projekte:
    ClipBoard Manager (beendet)
    Gutes ClipBoard Verwaltungs Programm mit nützlichen Funktionen.

    HTML Creator (beendet)
    Nützliches Tool um schnell ein eigenes HTML Dokument zu erstellen.

  • Hast du denn eine Dokumentation über die DLL oder wo her auch immer du dieses Objekt nimmst?
    Du kannst mit dem Programm das ich dir angehängt habe, die einzelnen Funktionen ausfindig machen, vielleicht steht da auch etwas über den Rückgabewert o.Ä.

    EDIT: Achja bitte DLL anhängen.

  • Falls es nicht anders funktioniert, kannst du es ja so machen:
    https://autoit.de/index.php?page…7614#post167614

    Spoiler anzeigen
    [autoit]

    ...
    HIER KOMMT DER ANDERE CODE, z.b. $oTVCamera erstellen
    ...

    [/autoit] [autoit][/autoit] [autoit]

    $oScriptHost = _CreateT3DHelper()

    [/autoit] [autoit][/autoit] [autoit]

    $x = $oScriptHost.Modules('T3D').Run('GetPositionX', $oTVCamera)
    $y = $oScriptHost.Modules('T3D').Run('GetPositionY', $oTVCamera)
    $z = $oScriptHost.Modules('T3D').Run('GetPositionZ', $oTVCamera)

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0, '', $x & @CRLF & $y & @CRLF & $z)

    [/autoit] [autoit][/autoit] [autoit]

    Func _CreateT3DHelper()
    #Region *** Init ScriptControl ***
    Local $oScriptHost = ObjCreate("ScriptControl")
    $oScriptHost.Language = 'vbscript'

    $oScriptHost.Modules.Add('T3D')
    Local $sCode = 'Function GetPositionX(ByVal TVCam)' & @CRLF
    $sCode &= 'GetPositionX = TVCam.GetPosition().x' & @CRLF
    $sCode &= 'End Function' & @CRLF

    $sCode &= 'Function GetPositionY(ByVal TVCam)' & @CRLF
    $sCode &= 'GetPositionY = TVCam.GetPosition().y' & @CRLF
    $sCode &= 'End Function' & @CRLF

    [/autoit] [autoit][/autoit] [autoit]

    $sCode &= 'Function GetPositionZ(ByVal TVCam)' & @CRLF
    $sCode &= 'GetPositionZ = TVCam.GetPosition().z' & @CRLF
    $sCode &= 'End Function' & @CRLF

    [/autoit] [autoit][/autoit] [autoit]

    $oScriptHost.Modules('T3D' ).AddCode($sCode)
    #EndRegion *** Init ScriptControl ***
    Return $oScriptHost
    EndFunc

    [/autoit]
  • Zu deinem zweiten Problem. Fensterhandles werden intern wie Pointer gespeichert, womit AutoIt bei COM-Objekten probleme hat. Wandle einfach das Handle in eine Zahl um, bevor du es an die Funktion übergibst:

    [autoit]

    $oObj.Init3DWindowed(Number($hWin), True)

    [/autoit]