File: INCLUDE\DIFRKMTY\A_EXTERN.H
1 //##############################################################################
2 // //
3 // A_EXTERN.H //
4 // //
5 // Subsystem: Diffraktometrie/ Reflektometrie //
6 // DAS MDI-Fenster für AreaScan //
7 // Benutzung durch andere Subsysteme erforderlich: JA //
8 // //
9 //##############################################################################
10
11 #ifndef _A_EXTERN_H
12 #define _A_EXTERN_H
13
14 #include "difrkmty\d_extern.h" // TPlotWindow
15 #include "detecuse\detecuse.h" // TDetector, TOneDimDetector
16
17 //--||--\\--||--//--||--\\--||--//--||--\\--||--//--||--\\--||--//--||--\\--||--
18
19 //##############################################################################
20 // TAreaScanParameters
21 //##############################################################################
22
23 class TAreaScanParameters
24 {
25 private:
26 //! struktur haelt Info zu reportkurven
27 //! (welche zusatzinfo existieren und welche nicht)
28 struct TReportUse
29 {
30 BOOL bMonitor; //! Monitorintensitaet
31 BOOL bAbsorber; //! Absorberposition
32 BOOL bTime; //! reale Messzeit
33 BOOL bIntegral; //! integrale Intensitaet
34 };
35 /* 21.04.2004 enum ENotifyValue
36 {
37 nvMonitorIntensity= 1, nvAbsorberPosition, nvPeakPosition, nvIntegralIntensity,
38 nvMeasurementTime
39 };*/
40
41 public:
42 TAreaScanParameters( void );
43
44 TDetector* GetDetector()
45 {
46 return Detector;
47 };
48 TDetector* GetMonitor()
49 {
50 return Monitor;
51 };
52
53 void SetDetector(TDetector* detectorParam)
54 {
55 Detector= detectorParam;
56 };
57 void SetMonitor(TDetector* monitorParam)
58 {
59 Monitor= monitorParam;
60 };
61
62 //! Gibt den Messdetektor als Psd zurueck, wenn es ein Psd ist,
63 //! andernfalls 0
64 TOneDimDetector* GetPsd();
65
66 protected:
67 virtual void ResetPosition();
68
69 //ATTRIBUT(E)
70 public:
71 // ehemalig extern-Verweise aus D_INTERN.CPP
72 char DataFile[ 40 ];
73 BOOL bAquisitionActive;
74 int nLinePoints;
75 BOOL bSetDXZero,
76 bSetDYZero,
77 bSetRLSave;
78 int nEnvironment;
79
80 // ehemalig static in A_EXTERN.CPP
81 int nFirstReadColumn;
82 int nLastReadColumn;
83 float fPsdRange;
84 char szODF[ 7 ], szOWF[ 7 ], szTDF[ 7 ], szTWF[ 7 ];
85 char DismantleFile[ _MAX_PATH+1 ]; //! Dateiname zum Zerlegen bzw. Zusammenfassen einer Datenbasis
86
87 //! enthaelt Nummer des Omega- sowie Thetamotors in der Motorenliste
88 int nOmega, nTheta;
89
90 //! enthaelt Anfangs- und Endwinkel sowie die Schrittweite des Omegamotors
91 //! fuer einen Areascan
92 double dOmegaMin, dOmegaMax, dOmegaWidth;
93
94 //! enthaelt Anfangs- und Endwinkel , die Schrittweite sowie den Offset des
95 //! Thetamotors fuer einen Areascan
96 //! NEU dThetaStep
97 double dThetaMin, dThetaMax, dThetaWidth, dThetaOffset;
98
99 //! gibt den Thetabereich eines Spektrums an
100 double dThetaWindow;
101
102 //! gibt das Schrittverhaeltnis zwischen Omega und Theta an
103 double dMoveRelation;
104
105 //! gibt den Scantyp an (omega2Theta/StandardScan)
106 ExScanType eScanType;
107
108 //! gibt an in welcher Form die Messwerte in Datei abgelegt werden sollen
109 //! (nur StandardFile verwendet, erweitert um bkFile, dtnFile)
110 EFileFormat eSaveFormat;
111
112 //! Speichern nach Beendigung der Messung
113 BOOL bSaveOnReady;
114
115 //! Speichern waehrend der Messung
116 BOOL bSaveContinuous;
117
118 //! Aenderung DB_Zerlegung
119 //25.04.2004 BOOL bSaveEachScan;
120
121 //! bisher ueberfluessig (bei anderen Speicherformaten verwendet)
122 BOOL bThetaAddsPsd;
123
124 //! zeigt an ob AreaScan mit Absorber durchzufuehren
125 BOOL bAbsorberUsed;
126
127 //! gibt an wieviele Kanaele des Psd zu einem zusammenzufassen sind
128 int nAddedChannels;
129
130 float fMaxTime; // Maximale Messzeit
131 DWORD dwMaxCounts; // Maximale Anzahl Impulse
132
133 //! gibt an welche zusatzdaten zu einem Spektrum im Scanreport zu speichern
134 //! sind, zur Zeit nur IntegralIntensity moeglich
135 //21.04.2004 TNotifyValue eNotifyValue;
136
137 //! gibt die gewuenschte Thetastartposition bei O2T-Scans bzw. die feste
138 //! position beim Standardscan an
139 double d2ThetaStart;
140
141 //! Aenderung DB_Zerlegung
142 char FirstFile[ _MAX_PATH+1 ], LastFile[ _MAX_PATH+1 ];
143 int MaxFiles;
144
145 //! gibt den Omega- bzw. Thetaoffset an (differenz zwischen gewuenschtem und
146 //! realem winkel)
147 double dOffsetOmega, dOffsetTheta;
148
149 //! gibt Winkelwert an, der sich aus der Nummer des Messkanals und der
150 //! breite eines Psd-kanals ergibt; um diesen winkelwert muss man verschieben,
151 //! um den Messkanal auf der 2Thetaposition zu positionieren
152 double dPsdOffset;
153
154 //! gibt Messkanal an; Kanal des Psd der sich immer auf der 2Thetaposition
155 //! befinden soll
156 int nMeasurementChannel;
157
158 //! gibt an welche Zusatzinfos zu der Datenbasis anzulegen sind bzw. bei
159 //! nachgeladenen welche Infos existieren
160 TReportUse ReportUse;
161
162 //! neu akk
163 //! gibt art der Darstellung waehrend eines AreaScans mit Psd an
164 //! akkumulierte Anzeige (TRUE) oder
165 //! Anzeige am Ende der Messzeit (FALSE)
166 BOOL bAccumulatedDisplay;
167
168 protected:
169 //! gibt ausgewaehlten Detektor an
170 TDetector* Detector; // nicht im Destruktor freigeben, wird durch Detektorsubsystem verwaltet
171
172 //! gibt ausgewaehlten Monitordetektor an (ist bisher nicht auswaehlbar)
173 TDetector* Monitor; // nicht im Destruktor freigeben, wird durch Detektorsubsystem verwaltet
174 };
175
176 //##############################################################################
177 // TAreaScanWindow
178 //##############################################################################
179
180 class TAreaScanWindow : public TAreaScanParameters, public TPlotWindow
181 {
182 //Kullmann+Reinecker: zahlreiche unnötige friend-Deklarationen entfernt
183 friend class TScanCmd;
184 friend class TAreaScanCmd;
185 friend class TSaveDataCmd;
186 friend class TChooseScanDlg;
187
188 public:
189 TAreaScanWindow( HINSTANCE aInstance );
190 virtual ~TAreaScanWindow( void );
191
192 // Überschriebenes von TAreaScanParameters
193 private:
194 virtual void ResetPosition();
195
196 // Überschriebenes aus der (Fenster-)Basisklasse
197 private:
198 virtual void OnCreate();
199 virtual LRESULT OnCommand( WPARAM, LPARAM );
200 LRESULT OnEvent ( HWND, UINT, WPARAM, LPARAM );
201
202 //Mausbedienung
203 virtual void OnPopupMenuInit ( WPARAM, LPARAM );
204 virtual void OnLButtonUp( WPARAM, LPARAM );
205 virtual void OnLButtonDown( WPARAM, LPARAM );
206
207 virtual BOOL SetTitle( void );
208 virtual void UpdateWnd( EPaintType= ptEntire );
209 virtual void SetRanges( void );
210
211 //! Ablaufsteuerung
212 virtual void SteeringReady( LPARAM ); // Ende
213 virtual void SteeringReset( LPARAM ); // Abbruch
214 virtual void Interrupt(); //! unterbricht Scanvorgang
215
216 //! erhaelt Messpunkt, stellt ihn dar, speichert ihn ggf.
217 virtual void CounterSetRequest( LPARAM );
218
219 virtual BOOL CanNew()
220 { return (!bAreaScanStarted || bInterrupted) && !bShowPsdContinuous; /*Messung beendet und Spekrenanzeige aus*/ }
221 virtual BOOL CanOpenFile()
222 { return (!bAreaScanStarted || bInterrupted) && !bShowPsdContinuous; /*Messung beendet und Spekrenanzeige aus*/ }
223 virtual BOOL CanSave()
224 { return (!bAreaScanStarted || bInterrupted) && !bShowPsdContinuous; /*Messung beendet und Spekrenanzeige aus*/ }
225 virtual BOOL IsScanning(BOOL &PsdContinious)
226 { PsdContinious= bShowPsdContinuous; return bAreaScanStarted; /*Messung läuft*/ }
227
228 virtual BOOL New( void );
229 virtual BOOL LoadOldData();
230 virtual BOOL SaveFile( EAskType );
231 virtual BOOL UpdateFile( void );
232
233 //! liefert den Klassennamen zurueck
234 virtual LPCSTR ClassName()
235 {
236 return "AreaScan";
237 };
238
239 //! liefert Klassencharakteristik
240 virtual LPCSTR GetCharacteristic()
241 {
242 return "AreaScan";
243 };
244
245 //24.04.2004 void DrawMenu( void );
246 //24.04.2004 void StopMeasurement( void );
247
248 // Überschriebenes aus TPlotWindow
249 private:
250 virtual BOOL SetMeasurementArea( TKSystem & );
251
252 // gibt die Beschriftung der X- und Y-Achse zurück
253 virtual void GetTitleX(int, int, char*, bool);
254 virtual void GetTitleY(int, int, char*, bool);
255
256 virtual bool CanSwitchChannelAngle() {
257 if ( eOutputType==otReciprokeLatticeBitmap ) return false; // nicht möglich
258 else if ( bShowPsdContinuous && m_PsdContinousType==PsdEnergyData ) return false; // nicht möglich, wenn Energiespektrum aktiv
259 else return TPlotWindow::CanSwitchChannelAngle();
260 }
261
262 //! Funktion liefert den absoluten Thetawert als Rueckkehrcode
263 //! 1.Param. scid gibt Kurvennr. an, deren absoluter Thetawert gesucht ist
264 //! nur bei RL-Bitmap benutzt
265 virtual double GetThetaOffset( int );
266
267 //SONSTIGES
268 private:
269 BOOL LoadReport( void );
270 BOOL SaveReport( void );
271
272 void StartSensorContinuous( EPsdDataType, BOOL= FALSE ); // wenn Spektrenanzeige gestartet werden kann, wird die im Parameter angegebene Art gestartet
273 void StopSensorContinuous(); // wenn Spektrenanzeige aktiv, wird aktuelle Art gestoppt
274 void ShowSensorContinuous( EPsdDataType ); // Start/ Stop der Spektrenanzeige, Aufruf durch Kontextmenüpunkte 'Energiespektrum anzeigen' und 'Positionsspektrum anzeigen'
275
276 BOOL LoadMeasurementInfo( TTxtRead& );
277 // BOOL LoadMeasurementInfo( HFILE );
278 BOOL SaveMeasurementInfo( BOOL );
279
280 int GetAdditionalColumns( void );
281 int GetShift( int ScanNumber );
282
283 void CalibratePsd( void );
284 void InitializeAreaScanTask();
285 void DoDataAquisition();
286
287 // Read/Write (Aenderung DB_Zerlegung)
288 BOOL ComposeDB( void );
289 BOOL SaveDismantleCurve( int );
290 BOOL DismantleDB( void );
291
292 // Protokoll
293 //! klier 01.03.2003 Protokollbuch
294 //! Speichert Informationen im Protokollbuch
295 void SetMeasurementProtocolParameter( void );
296
297 // berechnet den Dateinamen der Reportdatei
298 LPCSTR GetRepFileName( void );
299
300 double GetActAngle( const LPCSTR, BOOL& ) const;
301
302 //ATTRIBUT(E)
303 private:
304 //! nur bei benutzung von 0 dim. Detekt. von Bedeutung
305 //! zeigt an ob der Detektor den Thetabereich durchlaufen hat
306 BOOL bThetaScanCompleted;
307
308 //! Kurve enthaelt zu jedem Spektrum der Datenbasis die Omega-,Thetapos.
309 //! und einen Reportwert (integrale Intensitaet)
310 LPCurve ScanReport; // nicht im Destruktor freigeben, wird durch lpDatabase verwaltet
311
312 //! Kurve enthaelt weitere Zusatzinformationen zu den Kurven der Datenbasis
313 //! Absorberposition, Monitorintensitaet, reale Messzeit
314 LPCurve ScanReport2; // im Destruktor freigeben
315
316 //! gibt Nummer der Kurve in Datenbasis an, die gerade aktiv ist
317 int nActiveScan;
318
319 // wie bMeasurementActive, aber bereits beim anfahren der Startposition == TRUE
320 BOOL bAreaScanStarted;
321
322 BOOL bShowPsdContinuous; //! zeigt an, ob kont. Spektrumsanzeige aktiv ist
323 EPsdDataType m_PsdContinousType; // Art der zuletzt benutzen Spektrenart (zum Stoppen der aktuellen Anzeige benötigt)
324
325 //! zeigt an, ob die Psdkalibrierung gerade durchgefuehrt wird
326 BOOL bCalibrationActive;
327
328 //! zeigt an, ob gerade das erste Spektrum eines AreaScans aktiv ist
329 //! wird benutzt, da die Datenbasis bereits mit einer Kurve init. wird
330 //! aber in den folgenden Schritten immer eine neue Kurve anlegen muss
331 BOOL bFirstScan;
332
333 //! soll AreaScanstart vor Aufruf einer Einstellungsbox verhindern
334 //! FIX Fehler 2
335 BOOL bScanSetupOk;
336
337 // bei Energiespektrum vorherige Beschriftung der Abszisse merken
338 BOOL bSavedSecondaryCoor;
339
340 //! Aenderung DB_Zerlegung
341 BOOL bComposeDB;
342
343 // Platz für den Dateinamen der Reportdatei; wird bei GetRepFileName() in Abhängigkeit von TMDIWindow::Filename neu berechnet
344 char m_RepFileName[ _MAX_PATH+1 ];
345
346 TDetector *oldDetector; // nicht im Destruktor freigegeben, wird durch das Detektorsubsystem verwaltet
347 };
348
349 #endif // _A_EXTERN_H
350
351 //#############################################################################
352 // LastLine
353 //#############################################################################
354