Arbeiten mit Gleitpunktzahlen bei Erstellung eigener EyesWeb-Blöcke

Aus toolbox_interaktion
Wechseln zu: Navigation, Suche

Wenn man mit Gleitpunktzahlen arbeiten will, also mit dem Datentyp Float, muss man in Visual C++ den Datentyp „IDTScalar“ verwenden. Man muss diesen Datentyp umkonvertieren und das funktioniert mit folgendem Code in der Funktion „Init“. Das folgende Beispiel hat drei Ausgabewerte (X, Y, Z) für den EyesWeb-Block vorgesehen und der Block hat den Namen „Superblock“.


Es wird jetzt anhand dieses Beispiels „Superblock“ beschrieben, wir man Ein- und Ausgänge festlegt. In diesem Beispiel wird mit 4 Eingängen und 3 Ausgängen gearbeitet.

--Initialisierung--

  1. include “stdafx.h”
  2. include <windows.h>
  3. include <mbstring.h>
  4. include “resource.h”
  5. include “Superblock.h”
  6. include “SuperBlockAboutDlg.h”
  7. include “math.h” // nur bei mathematischen Berechnungen notwendig, z.B. sin(x)


// Eingabe definieren

  1. define EYWIN_EINGABE_1 0
  2. define EYWIN_ EINGABE_2 1
  3. define EYWIN_ EINGABE_3 2
  4. define EYWIN_ EINGABE_4 3

// Ausgabe definieren

  1. define EYWOUT_OUT_X 0
  2. define EYWOUT_OUT_Y 1
  3. define EYWOUT_OUT_Z 2

Dann folgt der Konstruktor

Im Konstruktor werden die Ein- und Ausgänge z.B. so behandelt:

SetInputInfo( EYWIN_EINGABE_3, “EINGABE_3”, “{44AFB1CB-88EF- 4AD7-894E-DC44F59F33E2}”, “{DEE0EC69-7 DE1-4CC6-B189-312119C56414}”, 2| EYWIF_REQUIRED_INITIALIZATION);

Es gilt nur darauf zu achten, dass die Anzahl bei Eingängen um 1 erhöht wird (oben die rot markierte 2) und bei Ausgängen um 1 vermindert wird (unten die rot markierte 2). Die Zählung der Eingänge beginnt bei 0 und die der Ausgänge beginnt bei -1.

SetOutputInfo( EYWOUT_OUT_Y, “OUT_Y”, “{44AFB1CB-88EF- 4AD7-894E-DC44F59F33E2}”, “{DEE0EC69-7 DE1-4CC6-B189-312119C56414}”, -2, -2);


--Execute Funktion – Ausführung--

HRESULT CSuperblock::Execute( DWORD dwFlags, DWORD dwParams ) { //AFX_MANAGE_STATE(AfxGetStaticModuleState( )); // TODO: Add your implementation code here

IDTScalar* In1 = (IDTScalar*) LockInput(EYWIN_ EINGABE_1); IDTScalar* In2 = (IDTScalar*) LockInput(EYWIN_ EINGABE_2); IDTScalar* In3 = (IDTScalar*) LockInput(EYWIN_ EINGABE_3); IDTScalar* In4 = (IDTScalar*) LockInput(EYWIN_ EINGABE_4);

IDTScalar* Out1 = (IDTScalar*) LockOutput(EYWOUT_OUT_X); IDTScalar* Out2 = (IDTScalar*) LockOutput(EYWOUT_OUT_Y); IDTScalar* Out3 = (IDTScalar*) LockOutput(EYWOUT_OUT_Z);

// hier werden 4 Variablen deklariert double k1_hor; double k1_ver; double k2_hor; double k2_ver;

// und hier die Eingabevariablen den Eingängen zugewiesen In1->GetDoubleValue( &k1_hor); In2->GetDoubleValue( &k1_ver); In3->GetDoubleValue( &k2_hor); In4->GetDoubleValue( &k2_ver);

//Ausgabevariablen Deklaration double x, y, z;

// hier können sämtliche Funktionen aufgerufen werden…

// und am Ende die Zuweisung der Ausgabevariablen Out1->SetDoubleValue( x ); Out2->SetDoubleValue( y ); Out3->SetDoubleValue( z );

// und alle Ein- und Ausgänge auf Unlock setzen

UnlockInput(EYWIN_ EINGABE_1); UnlockInput(EYWIN_ EINGABE_2); UnlockInput(EYWIN_ EINGABE_3); UnlockInput(EYWIN_ EINGABE_4); UnlockOutput(EYWOUT_OUT_X); UnlockOutput(EYWOUT_OUT_Y); UnlockOutput(EYWOUT_OUT_Z); return S_OK; }