File: WORKFLOW\TAreaScanCmd.cpp
1 #include "workflow\TAreaScanCmd.h"
2
3 extern TSteering Steering;
4 extern TMain Main;
5
6 TAreaScanCmd::TAreaScanCmd ( TCmdTag ct ) : TCmd( ct )
7 {
8 bRestart= FALSE;
9 // wenn kein Areascanfenster geoeffnet dann Fehlerausgabe + abbruch
10 AreaScanW= (TAreaScanWindow*) Main.AreaScanWindow;
11 if ( !AreaScanW )
12 {
13 #ifdef GermanVersion
14 MessageBox( GetFocus(), "Kein AreaScan-Fenster offen", "Fehler", MBSTOP );
18 #endif
19
20 return;
21 }
22 // uebernehmen von Werten aus AreaScan
23 nOmega= AreaScanW->nOmega;
24 nTheta= AreaScanW->nTheta;
25 AreaScanW->bMeasurementActive= TRUE;
26 // min- und maxwerte fuer Omega und Theta berechnen (incl. offset)
27 dOmegaMin= AreaScanW->dOmegaMin - AreaScanW->dOffsetOmega;
28 dOmegaMax= AreaScanW->dOmegaMax - AreaScanW->dOffsetOmega;
29 dOmegaWidth= AreaScanW->dOmegaWidth;
30 dThetaWindow= AreaScanW->dThetaWindow;
31 dThetaWidth= AreaScanW->dThetaWidth;
32 dMoveRelation= AreaScanW->dMoveRelation;
33 // 2thetastartposition aus Scanfenster
34 d2ThetaStart= AreaScanW->d2ThetaStart - AreaScanW->dOffsetTheta;
35
36 // Anzahl der Omega- und Thetaschritte
37 nMaxOmegaPoint= ( dOmegaMax - dOmegaMin ) / dOmegaWidth;
38 nMaxThetaPoint= dThetaWindow / dThetaWidth;
39 // akt. Omega- und Thetaschritt auf 0 setzen
40 nOmegaPoint= nThetaPoint= 0;
41 // akt. Omegapos. sichern + zum omegastartpunkt fahren
42 mlGetDistance( nOmega, Steering.dStartPoint );
43 dOmega= dOmegaMin;
44 StartMove( nOmega, dOmegaMin );
45 // akt. Thetapos. sichern + zum Thetastartpunkt fahren
46 mlGetDistance( nTheta, dStartPointTheta );
47 dTheta= d2ThetaStart - dThetaWindow / 2.0;
48 StartMove( nTheta, dTheta );
49 // loeschen der Datenbasis + Fenster neuzeichnen + Info in Statuszeile
50 AreaScanW->New();
51 AreaScanW->UpdateWnd();
52 #ifdef GermanVersion
53 SetInfo( "Anfahren der Startposition ..." );
56 #endif
57 eStep= CFirstStep;
58 bNoMeasure= TRUE;
59 };
60
61 // Fortschritt- Kommandoinformtionen
62 bool TAreaScanCmd::GetShowData ( LPSTR buffer )
63 {
64 buffer[0] = 0;
65 if ( eStep == CReady )
66 {
67 #ifdef GermanVersion
68 strcpy( buffer, "Scan abgeschlossen" );
71 #endif
72 }
73 else if ( eStep == CControlStep )
74 {
75 char fmt[ MaxString ];
76
77 #ifdef GermanVersion
78 sprintf( fmt, "Scan läuft ... Winkel= " );
79 strcat( fmt, mGetDF() );
80 strcat( fmt, " Intensität= %.3f" );
85 #endif
86
87 sprintf( buffer, fmt, mGetValue( Distance ), Steering.GetIntensity() );
88 //Datum: 24.07.2002 SetInfo( buffer );
89 }
90 return true;
91 }
92
93 void TAreaScanCmd::GetName ( LPSTR aName )
94 {
95 strcpy( aName, "AreaScanCmd" );
96 }
97
98 ECmdCode TAreaScanCmd::FirstStep ( void )
99 {
100 eStep = CControlStep;
101 // bisher keine gemessenen Punkte
102 bNoMeasure = FALSE;
103 return CMeasure;
104 };
105
106 ECmdCode TAreaScanCmd::ControlStep ( void )
107 {
108 // FIX Fehler 72 Diff/Refl
109 if (bRestart)
110 {
111 bRestart= FALSE;
112 StartMove( nOmega, dOmega );
113 StartMove( nTheta, dTheta );
114 return CRecall;
115 }
116 // wenn letzer Omegaschritt erreicht dann akt. Schritt auf fertig setzen und
117 // Omega- und Theta auf ursprungsposition zurueckfahren
118 // FIX Fehler 31,54
119 if ( nThetaPoint >= nMaxThetaPoint )
120 if ( nOmegaPoint >= nMaxOmegaPoint )
121 {
122 eStep= CReadyStep;
123 bNoMeasure= TRUE;
124 StartMove( nOmega, Steering.dStartPoint );
125 StartMove( nTheta, dStartPointTheta );
126
127 // wenn letzter Thetaschritt erreicht dann dieses ans AreaScanfenster
128 // weitergeben, naechste Omegapos. anfahren + naechste Thetapos. berechnen
129 // und anfahren
130 }
131 else
132 {
133 AreaScanW->bThetaScanCompleted= TRUE;
134 dOmega += dOmegaWidth;
135 nOmegaPoint++;
136 StartMove( nOmega, dOmega );
137 nThetaPoint= 0;
138 d2ThetaStart += dOmegaWidth * dMoveRelation;
139 dTheta= d2ThetaStart - dThetaWindow / 2.0;
140
141 StartMove( nTheta, dTheta );
142
143 // Sind die bei Borland blöd? Das ist doch ein ELSE-Zweig zu viel! Wann soll der denn eintreten?
144 }
145 else
146 {
147 // naechste Thetapos. anfahren
148 nThetaPoint++;
149 dTheta += dThetaWidth;
150 StartMove( nTheta, dTheta );
151 }
152 return CRecall;
153 };
154
155 ECmdCode TAreaScanCmd::ReadyStep ( void )
156 {
157 eStep= CReady;
158 return CRecall;
159 };
160