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 );
15 #else 16 17 MessageBox( GetFocus(), "There is no AreaScan-Window opened", "Failure", 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 ..." );
54 #else 55 SetInfo( "Move to 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" );
69 #else 70 strcpy( buffer, "Scan Ready" );
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" );
81 #else 82 sprintf( fmt, "Measurement ... Angle= " ); 83 strcat( fmt, mGetDF() ); 84 strcat( fmt, " Intensity= %.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