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