From 7488dcc15763eaa054cb80e1eec71cdaa2414452 Mon Sep 17 00:00:00 2001 From: malleor Date: Thu, 23 Feb 2012 16:05:04 +0100 Subject: [PATCH] initial commit --- .hgignore | 9 + Calculation2D.sln | 44 + README.md | 21 + .../interfaces/mmGlobalInterfacesStorage.h | 74 + include/interfaces/mmICalcMethod.h | 100 + include/interfaces/mmICalcMethodExt.h | 127 + include/interfaces/mmIFileIO.h | 585 +++ include/interfaces/mmIHardware.h | 789 ++++ include/interfaces/mmIImages.h | 287 ++ include/interfaces/mmILog.h | 67 + include/interfaces/mmISynchronize.h | 117 + include/interfaces/mmIThread.h | 141 + include/interfaces/mmIXML.h | 298 ++ include/log/mmLogSender.h | 74 + include/math/mmMath.h | 1293 +++++++ include/mmCalcMethod.h | 95 + include/mmError.h | 227 ++ include/mmGlobalDefs.h | 42 + include/mmInterfaceInitializers.h | 148 + include/mmOperatingSystemCalls.h | 121 + include/mmPixel.h | 76 + include/mmStringUtilities.h | 177 + include/mmXMLIOUtilities.h | 63 + lib/Debug/libcalc2dmath.lib | Bin 0 -> 919536 bytes lib/Release/libcalc2dmath.lib | Bin 0 -> 1109490 bytes lib/x64/Debug/libcalc2dmath.lib | Bin 0 -> 1266004 bytes lib/x64/Release/libcalc2dmath.lib | Bin 0 -> 1111598 bytes proj/calc2d/calc2d.cpp | 23 + proj/calc2d/calc2d.vcxproj | 169 + proj/calc2d/calc2d.vcxproj.filters | 33 + proj/calc2d/stdafx.cpp | 8 + proj/calc2d/stdafx.h | 15 + proj/calc2d/targetver.h | 8 + proj/libcalc2d/Calculation2D.vcxproj | 228 ++ proj/libcalc2d/Calculation2D.vcxproj.filters | 213 ++ proj/libcalc2d/include/fileio/mmFileIOStd.h | 316 ++ .../images/mmImagesCalculationManagement.h | 65 + ...mImagesCalculationMethodContainerWindows.h | 95 + .../mmImagesCalculationMethodDLLBroker.h | 85 + .../mmImagesComplexCalculationManagement.h | 262 ++ .../include/images/mmImagesStructure.h | 136 + proj/libcalc2d/include/log/mmLogFile.h | 46 + proj/libcalc2d/include/log/mmLogRedirector.h | 102 + .../synchronize/mmSynchronizeWindowsImpl.h | 101 + .../include/thread/mmThreadWindowsImpl.h | 82 + proj/libcalc2d/include/windows/mmDllSupport.h | 32 + proj/libcalc2d/include/xml/mmXMLBB.h | 217 ++ proj/libcalc2d/src/fileio/mmFileIOStd.cpp | 1630 ++++++++ proj/libcalc2d/src/images/mmCalcMethod.cpp | 318 ++ .../images/mmImagesCalculationManagement.cpp | 255 ++ ...magesCalculationMethodContainerWindows.cpp | 163 + .../mmImagesCalculationMethodDLLBroker.cpp | 132 + .../mmImagesComplexCalculationManagement.cpp | 3320 +++++++++++++++++ .../src/images/mmImagesStructure.cpp | 704 ++++ .../interfaces/mmGlobalInterfacesStorage.cpp | 52 + proj/libcalc2d/src/interfaces/mmIHardware.cpp | 51 + proj/libcalc2d/src/interfaces/mmIImages.cpp | 62 + proj/libcalc2d/src/log/mmLogFile.cpp | 48 + proj/libcalc2d/src/log/mmLogRedirector.cpp | 119 + proj/libcalc2d/src/log/mmLogSender.cpp | 55 + proj/libcalc2d/src/mmError.cpp | 25 + .../libcalc2d/src/mmInterfaceInitializers.cpp | 167 + proj/libcalc2d/src/mmOperatingSystemCalls.cpp | 269 ++ proj/libcalc2d/src/mmPixel.cpp | 246 ++ proj/libcalc2d/src/mmStringUtilities.cpp | 376 ++ proj/libcalc2d/src/mmXMLIOUtilities.cpp | 452 +++ .../synchronize/mmSynchronizeWindowsImpl.cpp | 292 ++ .../src/thread/mmThreadWindowsImpl.cpp | 310 ++ proj/libcalc2d/src/windows/mmDllSupport.cpp | 59 + proj/libcalc2d/src/xml/mmXMLBB.cpp | 1344 +++++++ 70 files changed, 17660 insertions(+) create mode 100644 .hgignore create mode 100644 Calculation2D.sln create mode 100644 README.md create mode 100644 include/interfaces/mmGlobalInterfacesStorage.h create mode 100644 include/interfaces/mmICalcMethod.h create mode 100644 include/interfaces/mmICalcMethodExt.h create mode 100644 include/interfaces/mmIFileIO.h create mode 100644 include/interfaces/mmIHardware.h create mode 100644 include/interfaces/mmIImages.h create mode 100644 include/interfaces/mmILog.h create mode 100644 include/interfaces/mmISynchronize.h create mode 100644 include/interfaces/mmIThread.h create mode 100644 include/interfaces/mmIXML.h create mode 100644 include/log/mmLogSender.h create mode 100644 include/math/mmMath.h create mode 100644 include/mmCalcMethod.h create mode 100644 include/mmError.h create mode 100644 include/mmGlobalDefs.h create mode 100644 include/mmInterfaceInitializers.h create mode 100644 include/mmOperatingSystemCalls.h create mode 100644 include/mmPixel.h create mode 100644 include/mmStringUtilities.h create mode 100644 include/mmXMLIOUtilities.h create mode 100644 lib/Debug/libcalc2dmath.lib create mode 100644 lib/Release/libcalc2dmath.lib create mode 100644 lib/x64/Debug/libcalc2dmath.lib create mode 100644 lib/x64/Release/libcalc2dmath.lib create mode 100644 proj/calc2d/calc2d.cpp create mode 100644 proj/calc2d/calc2d.vcxproj create mode 100644 proj/calc2d/calc2d.vcxproj.filters create mode 100644 proj/calc2d/stdafx.cpp create mode 100644 proj/calc2d/stdafx.h create mode 100644 proj/calc2d/targetver.h create mode 100644 proj/libcalc2d/Calculation2D.vcxproj create mode 100644 proj/libcalc2d/Calculation2D.vcxproj.filters create mode 100644 proj/libcalc2d/include/fileio/mmFileIOStd.h create mode 100644 proj/libcalc2d/include/images/mmImagesCalculationManagement.h create mode 100644 proj/libcalc2d/include/images/mmImagesCalculationMethodContainerWindows.h create mode 100644 proj/libcalc2d/include/images/mmImagesCalculationMethodDLLBroker.h create mode 100644 proj/libcalc2d/include/images/mmImagesComplexCalculationManagement.h create mode 100644 proj/libcalc2d/include/images/mmImagesStructure.h create mode 100644 proj/libcalc2d/include/log/mmLogFile.h create mode 100644 proj/libcalc2d/include/log/mmLogRedirector.h create mode 100644 proj/libcalc2d/include/synchronize/mmSynchronizeWindowsImpl.h create mode 100644 proj/libcalc2d/include/thread/mmThreadWindowsImpl.h create mode 100644 proj/libcalc2d/include/windows/mmDllSupport.h create mode 100644 proj/libcalc2d/include/xml/mmXMLBB.h create mode 100644 proj/libcalc2d/src/fileio/mmFileIOStd.cpp create mode 100644 proj/libcalc2d/src/images/mmCalcMethod.cpp create mode 100644 proj/libcalc2d/src/images/mmImagesCalculationManagement.cpp create mode 100644 proj/libcalc2d/src/images/mmImagesCalculationMethodContainerWindows.cpp create mode 100644 proj/libcalc2d/src/images/mmImagesCalculationMethodDLLBroker.cpp create mode 100644 proj/libcalc2d/src/images/mmImagesComplexCalculationManagement.cpp create mode 100644 proj/libcalc2d/src/images/mmImagesStructure.cpp create mode 100644 proj/libcalc2d/src/interfaces/mmGlobalInterfacesStorage.cpp create mode 100644 proj/libcalc2d/src/interfaces/mmIHardware.cpp create mode 100644 proj/libcalc2d/src/interfaces/mmIImages.cpp create mode 100644 proj/libcalc2d/src/log/mmLogFile.cpp create mode 100644 proj/libcalc2d/src/log/mmLogRedirector.cpp create mode 100644 proj/libcalc2d/src/log/mmLogSender.cpp create mode 100644 proj/libcalc2d/src/mmError.cpp create mode 100644 proj/libcalc2d/src/mmInterfaceInitializers.cpp create mode 100644 proj/libcalc2d/src/mmOperatingSystemCalls.cpp create mode 100644 proj/libcalc2d/src/mmPixel.cpp create mode 100644 proj/libcalc2d/src/mmStringUtilities.cpp create mode 100644 proj/libcalc2d/src/mmXMLIOUtilities.cpp create mode 100644 proj/libcalc2d/src/synchronize/mmSynchronizeWindowsImpl.cpp create mode 100644 proj/libcalc2d/src/thread/mmThreadWindowsImpl.cpp create mode 100644 proj/libcalc2d/src/windows/mmDllSupport.cpp create mode 100644 proj/libcalc2d/src/xml/mmXMLBB.cpp diff --git a/.hgignore b/.hgignore new file mode 100644 index 0000000..cbe790a --- /dev/null +++ b/.hgignore @@ -0,0 +1,9 @@ +relre:.*\.(idb|pdb|user|ilk|rar|old) +relre:.*\.(obj|exe|dll) +relre:.*\.(suo|ncb) +relre:.*\.(pch|dep|exp) +relre:.*\.(tlh|tli|log) +relre:.*\.(res|aps) + +syntax: regexp +.*\.(tlog) diff --git a/Calculation2D.sln b/Calculation2D.sln new file mode 100644 index 0000000..2e6a347 --- /dev/null +++ b/Calculation2D.sln @@ -0,0 +1,44 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{414A41D2-9FF0-4282-98E6-72B308485C32}" + ProjectSection(SolutionItems) = preProject + README.md = README.md + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "calc2d", "proj\calc2d\calc2d.vcxproj", "{51B17ACA-BAC0-408E-8145-B366393F0734}" + ProjectSection(ProjectDependencies) = postProject + {81764A51-4B0F-4310-ACD1-059BFC9BEDDE} = {81764A51-4B0F-4310-ACD1-059BFC9BEDDE} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcalc2d", "proj\libcalc2d\Calculation2D.vcxproj", "{81764A51-4B0F-4310-ACD1-059BFC9BEDDE}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {51B17ACA-BAC0-408E-8145-B366393F0734}.Debug|Win32.ActiveCfg = Debug|Win32 + {51B17ACA-BAC0-408E-8145-B366393F0734}.Debug|Win32.Build.0 = Debug|Win32 + {51B17ACA-BAC0-408E-8145-B366393F0734}.Debug|x64.ActiveCfg = Debug|x64 + {51B17ACA-BAC0-408E-8145-B366393F0734}.Debug|x64.Build.0 = Debug|x64 + {51B17ACA-BAC0-408E-8145-B366393F0734}.Release|Win32.ActiveCfg = Release|Win32 + {51B17ACA-BAC0-408E-8145-B366393F0734}.Release|Win32.Build.0 = Release|Win32 + {51B17ACA-BAC0-408E-8145-B366393F0734}.Release|x64.ActiveCfg = Release|x64 + {51B17ACA-BAC0-408E-8145-B366393F0734}.Release|x64.Build.0 = Release|x64 + {81764A51-4B0F-4310-ACD1-059BFC9BEDDE}.Debug|Win32.ActiveCfg = Debug|Win32 + {81764A51-4B0F-4310-ACD1-059BFC9BEDDE}.Debug|Win32.Build.0 = Debug|Win32 + {81764A51-4B0F-4310-ACD1-059BFC9BEDDE}.Debug|x64.ActiveCfg = Debug|x64 + {81764A51-4B0F-4310-ACD1-059BFC9BEDDE}.Debug|x64.Build.0 = Debug|x64 + {81764A51-4B0F-4310-ACD1-059BFC9BEDDE}.Release|Win32.ActiveCfg = Release|Win32 + {81764A51-4B0F-4310-ACD1-059BFC9BEDDE}.Release|Win32.Build.0 = Release|Win32 + {81764A51-4B0F-4310-ACD1-059BFC9BEDDE}.Release|x64.ActiveCfg = Release|x64 + {81764A51-4B0F-4310-ACD1-059BFC9BEDDE}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/README.md b/README.md new file mode 100644 index 0000000..f118836 --- /dev/null +++ b/README.md @@ -0,0 +1,21 @@ +# Calculation2D +**Extensible image processing framework for C++** +*** + +## Installation + +## Quick start + +## Features + + +*** +###The MIT License (MIT) + +Copyright (c) 2012 OGX|OPTOGRAPHX + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/include/interfaces/mmGlobalInterfacesStorage.h b/include/interfaces/mmGlobalInterfacesStorage.h new file mode 100644 index 0000000..52887c8 --- /dev/null +++ b/include/interfaces/mmGlobalInterfacesStorage.h @@ -0,0 +1,74 @@ +//****************************************************************************** +//****************************************************************************** +// +// Global Interfaces Storage class +// +// +// Description: Class with pointers to global interfaces initialized objects. +// It is used for exchange of main interface objects between +// core of the system and other components. +// +//****************************************************************************** +//****************************************************************************** +#ifndef mmGlobalInterfacesStorageH +#define mmGlobalInterfacesStorageH + +#include + + +//////////////////////////////////////////////////////////////////////////////// +/// Namespace for interface initializers. +//////////////////////////////////////////////////////////////////////////////// +namespace mmInterfacesStorage +{ + ////////////////////////////////////////////////////////////////////////////////// + ///// Class for storage of pointers into main interfaces classes. + ////////////////////////////////////////////////////////////////////////////////// + //class mmGlobalInterfacesStorage: public mmLog::mmLogSender + //{ + // private: // members + // //////////////////////////////////////////////////////////////////////////////// + // /// Pointer for private storage of memory manager object. + // //////////////////////////////////////////////////////////////////////////////// + // mmMemory::mmMemoryManagerI* m_psMemoryManager; + + // public: // methods + // //////////////////////////////////////////////////////////////////////////////// + // /// This constructor initializes all private members. + // /// + // /// @param[in] p_psMemoryManager pointer to memory manager object. + // /// @param[in] p_psLogReceiver pointer to log object. + // /// @param[in] p_psMainWindow pointer to main window object. + // //////////////////////////////////////////////////////////////////////////////// + // mmGlobalInterfacesStorage( mmMemory::mmMemoryManagerI* p_psMemoryManager, mmLog::mmLogReceiverI* p_psLogReceiver ); + + // //////////////////////////////////////////////////////////////////////////////// + // /// Desctructor. + // //////////////////////////////////////////////////////////////////////////////// + // ~mmGlobalInterfacesStorage(); + + // //////////////////////////////////////////////////////////////////////////////// + // /// Method returns pointer to memory manager object. + // /// + // /// @return pointer to memory manager object + // //////////////////////////////////////////////////////////////////////////////// + // mmMemory::mmMemoryManagerI* GetMemoryManager(void); + + // //////////////////////////////////////////////////////////////////////////////// + // /// Method returns pointer to log object. + // /// + // /// @return pointer to log object + // //////////////////////////////////////////////////////////////////////////////// + // mmLog::mmLogReceiverI* GetLogManager(void); + + //}; + struct mmGlobalInterfacesStorage { + mmGlobalInterfacesStorage( mmLog::mmLogReceiverI* p_psLogReceiver ); + mmLog::mmLogReceiverI* GetLogManager(void); + mmLog::mmLogReceiverI* GetLogReceiver(void); + private: + mmLog::mmLogReceiverI* m_psLogReceiver; + }; +}; + +#endif diff --git a/include/interfaces/mmICalcMethod.h b/include/interfaces/mmICalcMethod.h new file mode 100644 index 0000000..c76607f --- /dev/null +++ b/include/interfaces/mmICalcMethod.h @@ -0,0 +1,100 @@ +#pragma once + +#include + +//****************************************************************************** +//****************************************************************************** +// +// Simple interface for calculation method +// +// Description: This header defines class mmCalcKernelI for function objects +// which implement operation on a single data block within the image and class +// mmCalcMethodI which offers simple interface to calculation method. It is a +// wrapper for mmImagesCalculationMethodI interface and is meant to be overloaded +// by developer +// +//****************************************************************************** +//****************************************************************************** + +namespace mmImages { + //////////////////////////////////////////////////////////////////////////////// + /// Interface representing function object for operation on single data block + //////////////////////////////////////////////////////////////////////////////// + class mmCalcKernelI + { + public: + //////////////////////////////////////////////////////////////////////////////// + /// Virtual destructor + //////////////////////////////////////////////////////////////////////////////// + virtual ~mmCalcKernelI() { } + + //////////////////////////////////////////////////////////////////////////////// + /// Method executes for every data block in the structure. Internal loop over + /// pixels should be placed here. + /// + /// @param[in] p_psImageStructure pointer to images structure, + /// @param[in] p_iCurrentImageID ID number of the current processed image + /// @param[in] p_iFirstRow index of the first row of pixels scheduled for calculation + /// @param[in] p_iRowsCount number of rows scheduled for calculation + //////////////////////////////////////////////////////////////////////////////// + virtual void operator()(mmImageI* p_psCurrentImage, + mmInt p_iFirstRow, + mmInt p_iRowsCount) = 0; + }; + + //////////////////////////////////////////////////////////////////////////////// + /// Interface representing calculation method + //////////////////////////////////////////////////////////////////////////////// + class mmCalcMethodI: public mmCalcMethod + { + public: + //////////////////////////////////////////////////////////////////////////////// + /// Constructor. It invokes the mmCalcMethod class constructor which hides + /// implementation details + //////////////////////////////////////////////////////////////////////////////// + mmCalcMethodI(mmLog::mmLogReceiverI *p_psLogReceiver = NULL, + mmString p_sClassName = L"") + :mmCalcMethod(p_psLogReceiver, + p_sClassName) { } + + //////////////////////////////////////////////////////////////////////////////// + /// Virtual destructor + //////////////////////////////////////////////////////////////////////////////// + virtual ~mmCalcMethodI() { } + + protected: + //////////////////////////////////////////////////////////////////////////////// + /// Method executes for every working thread. Put pixels manipulations code here + //////////////////////////////////////////////////////////////////////////////// + virtual bool Calculate() = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method executes once for every image in the structure before the main loop + /// iterating blocks of pixels when using ForEachImage function. Do not use + /// m_psThreadSynchEL for accessing class members in multithread configuration + /// because this function runs always in a single thread. + /// (check mmICalcMethodExt.h for documentation) + /// + /// @param[in] p_iCurrentImageID ID number of the current processed image + //////////////////////////////////////////////////////////////////////////////// + virtual void ExecBeforeSingleImageCalc(mmInt p_iCurrentImageID) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method executes once for every image in the structure after the main loop + /// iterating blocks of pixels when using ForEachImage function. Do not use + /// m_psThreadSynchEL for accessing class members in multithread configuration + /// because this function runs always in a single thread. + /// (check mmICalcMethodExt.h for documentation) + /// + /// @param[in] p_iCurrentImageID ID number of the current processed image + //////////////////////////////////////////////////////////////////////////////// + virtual void ExecAfterSingleImageCalc(mmInt p_iCurrentImageID) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method executes once before the Calculate method which allows for setting + /// new parameters values after their modification by the user. Place initialization + /// code here. + //////////////////////////////////////////////////////////////////////////////// + virtual void RetrieveParameters() = 0; + }; +}; diff --git a/include/interfaces/mmICalcMethodExt.h b/include/interfaces/mmICalcMethodExt.h new file mode 100644 index 0000000..22e5f16 --- /dev/null +++ b/include/interfaces/mmICalcMethodExt.h @@ -0,0 +1,127 @@ +#pragma once + +#include +#include +#include + +//****************************************************************************** +//****************************************************************************** +// +// Extension for calculation method interface +// +// Description: This header defines class mmCalcMethodExtI which extends +// calculation method interface in order to simplify usage. It contains a set +// of tool functions for parameters manipulation and iteration through data +// structure in multithread environment. These functions are meant to be used +// by developer rather than overload. +// +//****************************************************************************** +//****************************************************************************** + +namespace mmImages { + //////////////////////////////////////////////////////////////////////////////// + /// Forward declaration of mmCalcKernel class + //////////////////////////////////////////////////////////////////////////////// + class mmCalcKernelI; + + //////////////////////////////////////////////////////////////////////////////// + /// Interface representing interface extension for calculation method + //////////////////////////////////////////////////////////////////////////////// + class mmCalcMethodExtI + { + public: + //////////////////////////////////////////////////////////////////////////////// + /// Virtual destructor + //////////////////////////////////////////////////////////////////////////////// + ~mmCalcMethodExtI() { } + + protected: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Method iterates through data structure in order to perform specified operation + /// on every data block. It works in multithread environment and may be executed + /// by multiple threads to manipulate on the same images structure. It should be + /// used inside Calculate function (see mmICalcMethod.h for documentation) + /// + /// @param[in] p_psKernel pointer to function object which implements operation + /// executed for every data block in every image + //////////////////////////////////////////////////////////////////////////////// + virtual void ForEachImage(mmCalcKernelI* p_psKernel) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method adds new user interface parameter for calculation method + /// + /// @param[in] p_sName parameter name which appears as a label in the parameters + /// dialog box + /// @param[in] p_eType parameter type (see mmXMLIOUtilities.h for documentation) + /// @param[in] p_psValue pointer to variable containing default parameter value + /// @param[in] p_bIsOutput flag indicating if the new parameter is input or + /// output for the calculation method + //////////////////////////////////////////////////////////////////////////////// + virtual void SetParam(mmString p_sName, mmXML::mmXMLDataType p_eType, void* p_psValue, bool p_bIsOutput = false) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method retrieves information about parameter value. + /// + /// @param[in] p_sName parameter name which appears as a label in the parameters + /// dialog box + /// @return pointer to parameter value. It should be assigned to a pointer of + /// the specific type + //////////////////////////////////////////////////////////////////////////////// + virtual const void* GetParam(mmString p_sName) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method retrieves information about parameter value. + /// + /// @param[in] p_sName parameter name which appears as a label in the parameters + /// dialog box + /// @param[out] p_pValue pointer to a variable where new parameter value should + /// be stored. It should have proper type. + //////////////////////////////////////////////////////////////////////////////// + virtual void GetParam(mmString p_sName, void* p_pValue) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method creates internal parameters structure. It should be called after all + /// SetParam invocations + //////////////////////////////////////////////////////////////////////////////// + virtual void UpdateParameters() = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns names of all images in the images structure + /// + /// @return vector of image names + //////////////////////////////////////////////////////////////////////////////// + virtual std::vector GetImageNames() = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns names of all data layers in the images structure + /// + /// @return vector of data layers names + //////////////////////////////////////////////////////////////////////////////// + virtual std::vector GetDLNames() = 0; + + protected: // fields + //////////////////////////////////////////////////////////////////////////////// + /// Calculation method parameters. Developer should assign the method name, ID as + /// a GUID and indicate if the method should be executed by multiple threads (default) + //////////////////////////////////////////////////////////////////////////////// + mmImages::mmImagesCalculationMethodI::sCalculationMethodParams m_sCMParams; + + //////////////////////////////////////////////////////////////////////////////// + /// Pointer to images structure. Use to access all loaded data. + //////////////////////////////////////////////////////////////////////////////// + mmImages::mmImageStructureI* m_psImageStructure; + + //////////////////////////////////////////////////////////////////////////////// + /// Pointer exclusive lock object. Use to control access to class members in + /// multithread implementation. + //////////////////////////////////////////////////////////////////////////////// + std::tr1::shared_ptr m_psThreadSynchEL; + + //////////////////////////////////////////////////////////////////////////////// + /// Number of rows in single data block. Modify to control amount of data processed + /// by a single thread. The last block may be smaller, depending on image size, + /// because it is a reminder of integer division of image height. + //////////////////////////////////////////////////////////////////////////////// + mmInt m_iRowsCountInBlock; + }; +}; diff --git a/include/interfaces/mmIFileIO.h b/include/interfaces/mmIFileIO.h new file mode 100644 index 0000000..c70dc25 --- /dev/null +++ b/include/interfaces/mmIFileIO.h @@ -0,0 +1,585 @@ +//****************************************************************************** +//****************************************************************************** +// +// FileIO Interface +// +// +// Description: This interface unifies file access/read/write capabilities. +// +//****************************************************************************** +//****************************************************************************** +#ifndef mmIFileIOH +#define mmIFileIOH + +#include + +#include +#include + +//////////////////////////////////////////////////////////////////////////////// +/// This namespace unifies Input/Output operations to hard drive resources. +//////////////////////////////////////////////////////////////////////////////// +namespace mmFileIO +{ + //////////////////////////////////////////////////////////////////////////////// + /// This enumeration defines open access to file. + //////////////////////////////////////////////////////////////////////////////// + typedef enum + { + //////////////////////////////////////////////////////////////////////////////// + /// Read access. + //////////////////////////////////////////////////////////////////////////////// + for_read = 0, + //////////////////////////////////////////////////////////////////////////////// + /// Write access. + //////////////////////////////////////////////////////////////////////////////// + trunc_for_write = 1, + //////////////////////////////////////////////////////////////////////////////// + /// Open for write and move to end of file. + //////////////////////////////////////////////////////////////////////////////// + append_for_write = 2 + } eOpenFileMode; + + //////////////////////////////////////////////////////////////////////////////// + /// Interface for global methods supports hsrd drive/directories operations. + //////////////////////////////////////////////////////////////////////////////// + class mmFileUtilsI + { + public: // type definitions + //////////////////////////////////////////////////////////////////////////////// + /// Structure defining file/directory on hard drive. + //////////////////////////////////////////////////////////////////////////////// + typedef struct + { + //////////////////////////////////////////////////////////////////////////////// + /// Name of file/directory. + //////////////////////////////////////////////////////////////////////////////// + mmString sName; + //////////////////////////////////////////////////////////////////////////////// + /// TRUE if file, FALSE if directory. + //////////////////////////////////////////////////////////////////////////////// + bool bFile; + } sDirElement; + public: // methods + //////////////////////////////////////////////////////////////////////////////// + /// This function creates directory. In case of error it throws + /// mmeFileIONoSuchFileOrDirectory, mmeFileIOPermissionToFileDenied or + /// mmeFileIOUnknownError. + /// + /// @param[in] p_sDirName name of directory with path. + //////////////////////////////////////////////////////////////////////////////// + virtual void CreateDir(mmString p_sDirName) = 0; + //////////////////////////////////////////////////////////////////////////////// + /// Method creates directory(ies) in a given location. + /// + /// @param[in] p_sDirName path to creation. + //////////////////////////////////////////////////////////////////////////////// + virtual void CreateDirStructure(mmString p_sDirName) = 0; + //////////////////////////////////////////////////////////////////////////////// + /// This method deletes all directory content. In case of error it throws + /// mmeFileIONoSuchFileOrDirectory, mmeFileIOPermissionToFileDenied or + /// mmeFileIOUnknownError. + /// + /// @param[in] p_sDirName directory name with path. + //////////////////////////////////////////////////////////////////////////////// + virtual void ClearDir(mmString p_sDirName) = 0; + //////////////////////////////////////////////////////////////////////////////// + /// This method deletes directory. In case of error it throws + /// mmeFileIONoSuchFileOrDirectory, mmeFileIOPermissionToFileDenied or + /// mmeFileIOUnknownError. + /// + /// @param[in] p_sDirName directory name with path, + /// @param[in] p_bWithElements if TRUE it deletes also directory content, + /// if FALSE deletes only if directory is empty. + //////////////////////////////////////////////////////////////////////////////// + virtual void RemoveDir(mmString p_sDirName,bool p_bWithElements) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method checks if given directory exists. In case of error it throws + /// mmeFileIOUnknownError. + /// + /// @param[in] p_sDirName directory name with full path, + /// @return if directory exists it returns TRUE, FALSE otherwise. + //////////////////////////////////////////////////////////////////////////////// + virtual bool IsExistingDir(mmString p_sDirName) = 0; + //////////////////////////////////////////////////////////////////////////////// + /// Method returns path do temporary directory. In case of error it throws + /// mmeFileIONoTemporaryDirectory. + /// + /// @return full path to temporary directory + //////////////////////////////////////////////////////////////////////////////// + virtual mmString GetTemporaryDir(void) = 0; + //////////////////////////////////////////////////////////////////////////////// + /// This method returns full path to application directory. + /// + /// @return full path to application + //////////////////////////////////////////////////////////////////////////////// + virtual mmString GetApplicationDir(void) = 0; + //////////////////////////////////////////////////////////////////////////////// + /// Method returns elements belonging to directory p_sDirName. + /// + /// @param[in] p_sDirName full path to directory + /// @param[in] p_sDirWildcards string defining search criterion eg "*.txt" or + /// "*.*", + /// @return vector with directory elements. + //////////////////////////////////////////////////////////////////////////////// + virtual std::vector GetDirElements(mmString p_sDirName, + mmString p_sDirWildcards) = 0; + //////////////////////////////////////////////////////////////////////////////// + /// Method checks if given directory is empty or not. + /// + /// @param[in] p_sDirName full path to directory, + /// @return TRUE if directory is empty, FALSE otherwise. + //////////////////////////////////////////////////////////////////////////////// + virtual bool IsEmptyDir(mmString p_sDirName) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method removes file from hard drive. In case of error it throws + /// mmeFileIONoSuchFileOrDirectory, mmeFileIOPermissionToFileDenied or + /// mmeFileIOUnknownError. + /// + /// @param[in] p_sFileName name with full path of file to remove + //////////////////////////////////////////////////////////////////////////////// + virtual void RemoveFile(mmString p_sFileName) = 0; + //////////////////////////////////////////////////////////////////////////////// + /// This method checks if file exists. + /// + /// @param[in] p_sFileName name with full path to checked file + /// @return TRUE if file exists, FALSE otherwise + //////////////////////////////////////////////////////////////////////////////// + virtual bool IsExistingFile(mmString p_sFileName) = 0; + //////////////////////////////////////////////////////////////////////////////// + /// Method extracts path to file from full path with name. + /// + /// @param[in] p_sFileName file name with full path, + /// @return path to file. + //////////////////////////////////////////////////////////////////////////////// + virtual mmString GetPathToFile(mmString p_sFileName) = 0; + }; + + //////////////////////////////////////////////////////////////////////////////// + /// Interface for text file reading functionality. + //////////////////////////////////////////////////////////////////////////////// + class mmTextFileReadI + { + public: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Virtual desctructor. + //////////////////////////////////////////////////////////////////////////////// + virtual ~mmTextFileReadI() {}; + public: // methods + + //////////////////////////////////////////////////////////////////////////////// + /// Method opens file for reading. In case of error during file opening + /// it throws mmError(mmeFileIOCantOpenFile) + /// + /// @param[in] p_sFileName file name with full path to open. + //////////////////////////////////////////////////////////////////////////////// + virtual void Open(mmString p_sFileName) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// This method closes opened file. + //////////////////////////////////////////////////////////////////////////////// + virtual void Close(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method reads and returns char from file. If file is not opened it throws + /// mmError(mmeFileIOFileIsNotOpened). In case of read error it throws + /// mmError(mmeFileIOCantReadFromFile). + /// + /// @param[out] p_pcChar red char is stored here + /// @return TRUE if read successful, FALSE otherwise. + //////////////////////////////////////////////////////////////////////////////// + virtual bool ReadChar(wchar_t* p_pcChar) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method reads and return line from file. If file position is in the middle + /// line it returns only rest of line. If file is not opened it throws + /// mmError(mmeFileIOFileIsNotOpened). In case of read error it throws + /// mmError(mmeFileIOCantReadFromFile). + /// + /// @param[out] p_psFileLine red line is stored here + /// @return TRUE if read successful, FALSE otherwise. + //////////////////////////////////////////////////////////////////////////////// + virtual bool ReadLine(mmString* p_psFileLine) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method reads many lines from file. + /// + /// @param[out] p_psLines pointer to vector of strings where red lines are stored + /// @param[in] p_iLinesCount number of lines to read + /// @return number of really red lines, if =0 end of file or error occurs + //////////////////////////////////////////////////////////////////////////////// + virtual mmInt ReadLines(std::vector* p_psLines,mmInt p_iLinesCount) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns size of opened file in bytes. If file is not opened it throws + /// mmError(mmeFileIOFileIsNotOpened). + /// + /// @return size of file. + //////////////////////////////////////////////////////////////////////////////// + virtual mmInt GetLenght(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method reads whole file and stores it in memory pointed by p_pcFileContent. + /// p_pcFileContent memory block should be large enough to store file content. + /// If file is not opened it throws mmError(mmeFileIOFileIsNotOpened). + /// In case of read error it throws mmError(mmeFileIOCantReadFromFile). + /// + /// @param[out] p_pcFileContent pointer to memory block where file content is stored + /// @return number of really readed chars. + //////////////////////////////////////////////////////////////////////////////// + virtual mmInt ReadWholeFile(wchar_t* p_pcFileContent) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// This method checks end of file. If file is not opened it throws + /// mmError(mmeFileIOFileIsNotOpened). In case of read error it throws + /// mmError(mmeFileIOCantReadFromFile). + /// + /// @return TRUE if end of file, FALSE otherwise. + //////////////////////////////////////////////////////////////////////////////// + virtual bool Eof(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns information if any file is opened currently. + /// + /// @return TRUE if file is already opened, FALSE otherwise. + //////////////////////////////////////////////////////////////////////////////// + virtual bool IsActiveFile(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns current file position. If file is not opened it throws + /// mmError(mmeFileIOFileIsNotOpened). + /// + /// @return current file position. + //////////////////////////////////////////////////////////////////////////////// + virtual mmInt GetActualFilePosition(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns name of opened file. If file is not opened it throws + /// mmError(mmeFileIOFileIsNotOpened). + /// + /// @return file name. + //////////////////////////////////////////////////////////////////////////////// + virtual mmString GetFileName(void) = 0; + }; + + //////////////////////////////////////////////////////////////////////////////// + /// Interface for text file reading functionality with extension of reading of + /// whole file into memory during opening and further use of data from memory + /// only. + //////////////////////////////////////////////////////////////////////////////// + class mmMemTextFileReadI: public mmTextFileReadI + { + public: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Virtual destructor. + //////////////////////////////////////////////////////////////////////////////// + virtual ~mmMemTextFileReadI() {}; + + //////////////////////////////////////////////////////////////////////////////// + /// Method opens text file for reading. In case of error during file opening + /// it throws mmError(mmeFileIOCantOpenFile). In case of read error it throws + /// mmError(mmeFileIOCantReadFromFile). + /// + /// @param[in] p_sFileName file name with path + /// @param[in] p_bToMemory TRUE it reads whole file into memory, FALSE it opens + /// file in standard way + //////////////////////////////////////////////////////////////////////////////// + virtual void Open(mmString p_sFileName,bool p_bToMemory) = 0; + }; + + //////////////////////////////////////////////////////////////////////////////// + /// Interface for text file writing functionality. + //////////////////////////////////////////////////////////////////////////////// + class mmTextFileWriteI + { + public: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Virtual destructor. + //////////////////////////////////////////////////////////////////////////////// + virtual ~mmTextFileWriteI() {}; + + //////////////////////////////////////////////////////////////////////////////// + /// Method opens file for writing. In case of error during file opening + /// it throws mmError(mmeFileIOCantOpenFile). + /// + /// @param[in] p_sFileName file name with full path + /// @param[in] p_eOpenMode file open mode + //////////////////////////////////////////////////////////////////////////////// + virtual void Open(mmString p_sFileName, + mmFileIO::eOpenFileMode p_eOpenMode) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// This method closes opened file. It saves all unsaved data. + /// In case of write error throws mmError(mmeFileIOCantWriteToFile). + //////////////////////////////////////////////////////////////////////////////// + virtual void Close(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method writes char to file. In case of write error throws + /// mmError(mmeFileIOCantWriteToFile). If file is not opened it throws + /// mmError(mmeFileIOFileIsNotOpened). + /// + /// @param[in] p_cChar char to write + //////////////////////////////////////////////////////////////////////////////// + virtual void WriteChar(wchar_t p_cChar) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// This method writes line to file. In case of write error throws + /// mmError(mmeFileIOCantWriteToFile). If file is not opened it throws + /// mmError(mmeFileIOFileIsNotOpened). + /// + /// @param[in] p_sFileLine string to write line + //////////////////////////////////////////////////////////////////////////////// + virtual void WriteLine(mmString p_sFileLine) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Mehtod writes many lines to file. + /// + /// @param[in] p_psLines pointer to vector of strings representing lines to write. + //////////////////////////////////////////////////////////////////////////////// + virtual void WriteLines(std::vector* p_psLines) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method writes text buffer into file. In case of write error throws + /// mmError(mmeFileIOCantWriteToFile). If file is not opened it throws + /// mmError(mmeFileIOFileIsNotOpened). + /// + /// @param[in] p_pcBuffer pointer to text buffer to write + /// @param[in] p_iBufferSize size of buffer + //////////////////////////////////////////////////////////////////////////////// + virtual void WriteBuffer(wchar_t const* p_pcBuffer,mmInt p_iBufferSize) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// This method writes end of line command into file. In case of write error throws + /// mmError(mmeFileIOCantWriteToFile). If file is not opened it throws + /// mmError(mmeFileIOFileIsNotOpened). + //////////////////////////////////////////////////////////////////////////////// + virtual void WriteEol(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method flushes file buffers and forces writing of all data. + /// In case of write error throws mmError(mmeFileIOCantWriteToFile). + /// If file is not opened it throws mmError(mmeFileIOFileIsNotOpened). + //////////////////////////////////////////////////////////////////////////////// + virtual void Flush(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method checks if object uses (keep opened) currently any file. + /// + /// @return TRUE file is using, FALSE otherwise. + //////////////////////////////////////////////////////////////////////////////// + virtual bool IsActiveFile(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// This method returns name of currently opened file. + /// If file is not opened it throws mmError(mmeFileIOFileIsNotOpened). + /// + /// @return file name with full path. + //////////////////////////////////////////////////////////////////////////////// + virtual mmString GetFileName(void) = 0; + }; + + //////////////////////////////////////////////////////////////////////////////// + /// Interface for text file writing functionality with extension of writing of + /// whole file into memory and at the end saving whole memory structure into file. + //////////////////////////////////////////////////////////////////////////////// + class mmMemTextFileWriteI: public mmTextFileWriteI + { + public: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Virtual destructor. + //////////////////////////////////////////////////////////////////////////////// + virtual ~mmMemTextFileWriteI() {}; + + //////////////////////////////////////////////////////////////////////////////// + /// Method opens text fole to write. In case of error during file opening + /// it throws mmError(mmeFileIOCantOpenFile). + /// + /// @param[in] p_sFileName file name with full path to write + /// @param[in] p_eOpenMode file open mode + /// @param[in] p_bToMemory TRUE it creates whole file into memory and writes + /// it on hard drive once, FALSE it opens file + /// for write in standard way. + //////////////////////////////////////////////////////////////////////////////// + virtual void Open(mmString p_sFileName, + eOpenFileMode p_eOpenMode, + bool p_bToMemory) = 0; + + }; + + //////////////////////////////////////////////////////////////////////////////// + /// Interface for binary file reading functionality. + //////////////////////////////////////////////////////////////////////////////// + class mmBinaryFileReadI + { + public: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Virtual desctructor. + //////////////////////////////////////////////////////////////////////////////// + virtual ~mmBinaryFileReadI() {}; + public: // methods + + //////////////////////////////////////////////////////////////////////////////// + /// Method opens file for reading. In case of error during file opening + /// it throws mmError(mmeFileIOCantOpenFile) + /// + /// @param[in] p_sFileName file name with full path to open. + //////////////////////////////////////////////////////////////////////////////// + virtual void Open(mmString p_sFileName) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// This method closes opened file. + //////////////////////////////////////////////////////////////////////////////// + virtual void Close(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method reads buffer from file. If file is not opened it throws + /// mmError(mmeFileIOFileIsNotOpened). In case of read error it throws + /// mmError(mmeFileIOCantReadFromFile). + /// + /// @param[out] p_pBuffer red buffer is stored here + /// @param[in] p_iSize number of bytes to read from file + /// @return TRUE if read successful, FALSE otherwise. + //////////////////////////////////////////////////////////////////////////////// + virtual bool ReadBuffer(void* p_pBuffer,mmInt p_iSize) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns size of opened file in bytes. If file is not opened it throws + /// mmError(mmeFileIOFileIsNotOpened). + /// + /// @return size of file. + //////////////////////////////////////////////////////////////////////////////// + virtual mmInt GetLenght(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// This method checks end of file. If file is not opened it throws + /// mmError(mmeFileIOFileIsNotOpened). In case of read error it throws + /// mmError(mmeFileIOCantReadFromFile). + /// + /// @return TRUE if end of file, FALSE otherwise. + //////////////////////////////////////////////////////////////////////////////// + virtual bool Eof(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns information if any file is opened currently. + /// + /// @return TRUE if file is already opened, FALSE otherwise. + //////////////////////////////////////////////////////////////////////////////// + virtual bool IsActiveFile(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns current file position. If file is not opened it throws + /// mmError(mmeFileIOFileIsNotOpened). + /// + /// @return current file position. + //////////////////////////////////////////////////////////////////////////////// + virtual mmInt GetActualFilePosition(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method sets current file position. If file is not opened it throws + /// mmError(mmeFileIOFileIsNotOpened) or mmError(mmeFileIOBadFilePosition). + /// + /// @param[in] p_iFilePos requested file position + /// @return current file position. + //////////////////////////////////////////////////////////////////////////////// + virtual void SetActualFilePosition(mmInt p_iFilePos) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns name of opened file. If file is not opened it throws + /// mmError(mmeFileIOFileIsNotOpened). + /// + /// @return file name. + //////////////////////////////////////////////////////////////////////////////// + virtual mmString GetFileName(void) = 0; + }; + + //////////////////////////////////////////////////////////////////////////////// + /// Interface for binary file writing functionality. + //////////////////////////////////////////////////////////////////////////////// + class mmBinaryFileWriteI + { + public: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Virtual desctructor. + //////////////////////////////////////////////////////////////////////////////// + virtual ~mmBinaryFileWriteI() {}; + public: // methods + + //////////////////////////////////////////////////////////////////////////////// + /// Method opens file for writing. In case of error during file opening + /// it throws mmError(mmeFileIOCantOpenFile). + /// + /// @param[in] p_sFileName file name with full path + /// @param[in] p_eOpenMode file open mode + //////////////////////////////////////////////////////////////////////////////// + virtual void Open(mmString p_sFileName, + mmFileIO::eOpenFileMode p_eOpenMode) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// This method closes opened file. + //////////////////////////////////////////////////////////////////////////////// + virtual void Close(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method saves buffer into file. If file is not opened it throws + /// mmError(mmeFileIOFileIsNotOpened). In case of write error it throws + /// mmError(mmeFileIOCantWriteToFile). + /// + /// @param[out] p_pBuffer pointer to buffer + /// @param[in] p_iSize number of bytes to write into file + /// @return TRUE if read successful, FALSE otherwise. + //////////////////////////////////////////////////////////////////////////////// + virtual bool WriteBuffer(void* p_pBuffer,mmInt p_iSize) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns size of opened file in bytes. If file is not opened it throws + /// mmError(mmeFileIOFileIsNotOpened). + /// + /// @return size of file. + //////////////////////////////////////////////////////////////////////////////// + virtual mmInt GetLenght(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns information if any file is opened currently. + /// + /// @return TRUE if file is already opened, FALSE otherwise. + //////////////////////////////////////////////////////////////////////////////// + virtual bool IsActiveFile(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns current file position. If file is not opened it throws + /// mmError(mmeFileIOFileIsNotOpened). + /// + /// @return current file position. + //////////////////////////////////////////////////////////////////////////////// + virtual mmInt GetActualFilePosition(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method sets current file position. If file is not opened it throws + /// mmError(mmeFileIOFileIsNotOpened) or mmError(mmeFileIOBadFilePosition). + /// + /// @param[in] p_iFilePos requested file position + /// @return current file position. + //////////////////////////////////////////////////////////////////////////////// + virtual void SetActualFilePosition(mmInt p_iFilePos) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns name of opened file. If file is not opened it throws + /// mmError(mmeFileIOFileIsNotOpened). + /// + /// @return file name. + //////////////////////////////////////////////////////////////////////////////// + virtual mmString GetFileName(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method flushes file buffers and forces writing of all data. + /// In case of write error throws mmError(mmeFileIOCantWriteToFile). + /// If file is not opened it throws mmError(mmeFileIOFileIsNotOpened). + //////////////////////////////////////////////////////////////////////////////// + virtual void Flush(void) = 0; + }; +}; + +#endif diff --git a/include/interfaces/mmIHardware.h b/include/interfaces/mmIHardware.h new file mode 100644 index 0000000..1018d4a --- /dev/null +++ b/include/interfaces/mmIHardware.h @@ -0,0 +1,789 @@ +//****************************************************************************** +//****************************************************************************** +// +// Hardware component interfaces +// +// +// Description: This header defines interfaces for hardware components like +// detectors, projectors, linear stages, rotary stages, robots, etc. +// +//****************************************************************************** +//****************************************************************************** +#ifndef mmIHardwareH +#define mmIHardwareH + +#include +#include +#include +#include +#include + +namespace mmImageProcessing +{ + //////////////////////////////////////////////////////////////////////////////// + /// Enumeration for definition of pixel color packing. + //////////////////////////////////////////////////////////////////////////////// + typedef enum + { + //////////////////////////////////////////////////////////////////////////////// + /// Pixel is represented by by 3 bytes Red, Green and Blue. + //////////////////////////////////////////////////////////////////////////////// + pixel_R8G8B8 = 0x00000000, + //////////////////////////////////////////////////////////////////////////////// + /// Pixel is represented by by 3 bytes Blue, Green and Red. + //////////////////////////////////////////////////////////////////////////////// + pixel_B8G8R8 = 0x00000001, + //////////////////////////////////////////////////////////////////////////////// + /// Pixel is represented by one grayscale intensity byte value. + //////////////////////////////////////////////////////////////////////////////// + pixel_Gray8 = 0x00000002, + //////////////////////////////////////////////////////////////////////////////// + /// Pixel is represented by 16bit grayscale intensity value. + //////////////////////////////////////////////////////////////////////////////// + pixel_Gray16 = 0x00000003, + //////////////////////////////////////////////////////////////////////////////// + /// Pixel is represented by 3 16bit values Red, Green and Blue. (Deep color) + //////////////////////////////////////////////////////////////////////////////// + pixel_R16G16B16 = 0x00000004, + //////////////////////////////////////////////////////////////////////////////// + /// Pixel is represented by by 4 bytes Red, Green, Blue and Alpha + //////////////////////////////////////////////////////////////////////////////// + pixel_R8G8B8A8 = 0x00000005, + //////////////////////////////////////////////////////////////////////////////// + /// Pixel is represented by by 4 bytes Blue, Green, Red and Alpha + //////////////////////////////////////////////////////////////////////////////// + pixel_B8G8R8A8 = 0x00000006, + //////////////////////////////////////////////////////////////////////////////// + /// Pixel format irrelevant, doesn't matter or undefined + //////////////////////////////////////////////////////////////////////////////// + pixel_AnyType = -1 + //////////////////////////////////////////////////////////////////////////////// + } ePixelType; + + mmInt GetPixelSize(mmImageProcessing::ePixelType p_ePixelType); +} + +//////////////////////////////////////////////////////////////////////////////// +/// This namespace defines functionality of basic hardware components +/// like detector, projector, linear and rotary stages, robot, etc. +//////////////////////////////////////////////////////////////////////////////// +namespace mmHardware +{ + //////////////////////////////////////////////////////////////////////////////// + /// Structure defines raw image data packing for hardware operations. + //////////////////////////////////////////////////////////////////////////////// + + // //////////////////// ??????? + + typedef struct + { + //////////////////////////////////////////////////////////////////////////////// + /// Image width. + //////////////////////////////////////////////////////////////////////////////// + mmInt iWidth; + //////////////////////////////////////////////////////////////////////////////// + /// Image height. + //////////////////////////////////////////////////////////////////////////////// + mmInt iHeight; + //////////////////////////////////////////////////////////////////////////////// + /// Pixel packing. + //////////////////////////////////////////////////////////////////////////////// + mmImageProcessing::ePixelType ePixType; + } sImageDef; + + //////////////////////////////////////////////////////////////////////////////// + /// Mechanical manipulator interface. + //////////////////////////////////////////////////////////////////////////////// + class mmManipulatorI + { + public: + //////////////////////////////////////////////////////////////////////////////// + /// Definition of manipulator status enum. + //////////////////////////////////////////////////////////////////////////////// + enum mmManipulatorStatus + { + //////////////////////////////////////////////////////////////////////////////// + /// Manipulator axis is stopped. + //////////////////////////////////////////////////////////////////////////////// + mmmsStopped = 0, + //////////////////////////////////////////////////////////////////////////////// + /// Manipulator axis is moving. + //////////////////////////////////////////////////////////////////////////////// + mmmsMoving = 1, + //////////////////////////////////////////////////////////////////////////////// + /// Manipulator axis is blocked. + //////////////////////////////////////////////////////////////////////////////// + mmmsBlocked = 2, + //////////////////////////////////////////////////////////////////////////////// + /// Manipulator axis is disconnected. + //////////////////////////////////////////////////////////////////////////////// + mmmsDisconected = 3, + //////////////////////////////////////////////////////////////////////////////// + /// Manipulator axis status is unknown. + //////////////////////////////////////////////////////////////////////////////// + mmmsUnknown = 4 + + }; + + //////////////////////////////////////////////////////////////////////////////// + /// Virtual destructor. + //////////////////////////////////////////////////////////////////////////////// + virtual ~mmManipulatorI(void) {}; + + //////////////////////////////////////////////////////////////////////////////// + /// Method initializes manipulator. LoadManipulatorGlobalParameters() or + /// SetManipulatorGlobalParameters() has to be done before calling + /// InitializeManipulator().If manipulator is not initialized, it can't moved. + /// + /// @return TRUE if no error occured, FALSE otherwise. + //////////////////////////////////////////////////////////////////////////////// + virtual BOOL InitializeManipulator(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method synchronizes manipulator driver. Synchronization is automatically + /// done in InitializeManipulator() method. + /// + /// @param[in] p_uiRepeatCount how many times method tries to synchronize driver, + /// @return TRUE if no error occured, FALSE otherwise. + //////////////////////////////////////////////////////////////////////////////// + virtual BOOL Synchronize(unsigned int p_uiRepeatCount = 40) {return FALSE;}; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns XML structure with manipulator axis parameters. + /// + /// @param[in] p_uiAxisNumber number of manipulator axis, + /// @return XML structure with manipulator axis parameters. + //////////////////////////////////////////////////////////////////////////////// + virtual mmString GetManipulatorParameters(unsigned int p_uiAxisNumber = 1) {return NULL;}; + + //////////////////////////////////////////////////////////////////////////////// + /// Method sets manipulator axis parameters. + /// + /// @param[in] p_sAxisParameters XML structure withm anipulator axis parameters, + /// @return TRUE if no error occured, FALSE otherwise. + //////////////////////////////////////////////////////////////////////////////// + virtual BOOL SetManipulatorParameters(mmString p_sAxisParameters, + unsigned int p_uiAxisNumber = 1) {return FALSE;}; + + //////////////////////////////////////////////////////////////////////////////// + /// Method loads manipulator parameters from XML file. + /// + /// @param[in] p_sFilePath path to file with manipulator parameters XML structure, + /// @return TRUE if no error occured, FALSE otherwise. + //////////////////////////////////////////////////////////////////////////////// + virtual BOOL LoadManipulatorGlobalParameters(mmString p_sFilePath) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns XML structure with manipulator parameters. + /// + /// @return XML structure with manipulator axis parameters. + //////////////////////////////////////////////////////////////////////////////// + virtual mmString GetManipulatorGlobalParameters(void) {return NULL;}; + + //////////////////////////////////////////////////////////////////////////////// + /// Method sets manipulator parameters. + /// + /// @param[in] p_sManipulatorGlobalParameters XML structure with manipulator parameters, + /// @return TRUE if no error occured, FALSE otherwise. + //////////////////////////////////////////////////////////////////////////////// + virtual BOOL SetManipulatorGlobalParameters(mmString p_sManipulatorGlobalParameters) {return FALSE;}; + + //////////////////////////////////////////////////////////////////////////////// + /// Method saves XML structure with manipulator parameters to file. + /// + /// @param[in] p_sFilePath path to file, + /// @return TRUE if no error occured, FALSE otherwise. + //////////////////////////////////////////////////////////////////////////////// + virtual BOOL SaveManipulatorGlobalParameters(mmString p_sFilePath) {return FALSE;}; + + //////////////////////////////////////////////////////////////////////////////// + /// Method loads manipulator state from XML file. + /// + /// @param[in] p_sFilePath path to file with manipulator state XML structure, + /// @return TRUE if no error occured, FALSE otherwise. + //////////////////////////////////////////////////////////////////////////////// + virtual BOOL LoadManipulatorGlobalState(mmString p_sFilePath) {return FALSE;}; + + //////////////////////////////////////////////////////////////////////////////// + /// Method saves XML structure with manipulator state to file. + /// + /// @param[in] p_sFilePath path to file, + /// @return TRUE if no error occured, FALSE otherwise. + //////////////////////////////////////////////////////////////////////////////// + virtual BOOL SaveManipulatorGlobalState(mmString p_sFilePath) {return FALSE;}; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns number of manipulator axes. + /// + /// @return number of manipulator axes. + //////////////////////////////////////////////////////////////////////////////// + virtual unsigned int GetManipulatorAxisCount(void) {return 0;}; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns working mode of an axis of manipulator. Active means that it + /// can be manipulated. Passive that it can only return actual transformations, + /// all movements are performed out of control of application. + /// + /// @param[in] p_uiAxisNumber axis number, + /// @return TRUE if it can't be controllable, FALSE otherwise. + //////////////////////////////////////////////////////////////////////////////// + virtual BOOL IsPassive(unsigned int p_uiAxisNumber = 1) {return TRUE;}; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns status of manipulator axis. + /// + /// @param[in] p_uiAxisNumber axis number, + /// @return status of manipulator axis. + //////////////////////////////////////////////////////////////////////////////// + virtual mmManipulatorStatus GetManipulatorStatus(unsigned int p_uiAxisNumber = 1) {return mmmsUnknown;}; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns position of manipulator axis. + /// + /// @param[in] p_uiAxisNumber axis number, + /// @return position of manipulator axis. + //////////////////////////////////////////////////////////////////////////////// + virtual mmReal GetPosition(unsigned int p_uiAxisNumber = 1) {return 0.0;}; + + //////////////////////////////////////////////////////////////////////////////// + /// Method realizes manipulation of manipulator axis. + /// + /// @param[in] p_rValue manipulation value in units appropriate for axis type, + /// @param[in] p_uiAxisNumber axis number, + /// @return real manipulation value. + //////////////////////////////////////////////////////////////////////////////// + virtual mmReal Move(mmReal p_rValue, unsigned int p_uiAxisNumber = 1) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method realizes emergency stop of all axes of manipulator. + //////////////////////////////////////////////////////////////////////////////// + virtual void EmergencyStop(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method realizes user action. + /// + /// @param[in] p_sUserAction XML structure with user action command, + /// @return XML structure with manipulator reply. + //////////////////////////////////////////////////////////////////////////////// + virtual mmString UserAction(mmString p_sUserAction) {return NULL;}; + }; + + //////////////////////////////////////////////////////////////////////////////// + /// Manipulator container interface. It is responsible for + /// searching all available manipulators and querying them. It also initializes + /// manipulator objects and return pointers to them. + //////////////////////////////////////////////////////////////////////////////// + class mmManipulatorContainerI + { + public: // name + //////////////////////////////////////////////////////////////////////////////// + /// Virtual destructor. + //////////////////////////////////////////////////////////////////////////////// + virtual ~mmManipulatorContainerI() {}; + + //////////////////////////////////////////////////////////////////////////////// + /// Returns list with names of available manipulators. + /// + /// @return vector with names defining available manipulators. + //////////////////////////////////////////////////////////////////////////////// + virtual std::vector GetAvailableManipulators(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Initializes selected manipulator and returns pointer into its interface. + /// In case of error it throws mmError(mmeHardwareUnknownManipulator). + /// + /// @param[in] p_sManipulatorName name of manipulator to initialize, + /// @return pointer to initialized mmHardware::mmManipulatorI object. + //////////////////////////////////////////////////////////////////////////////// + virtual mmHardware::mmManipulatorI* InitializeManipulator(mmString p_sManipulatorName) = 0; + }; + + + //////////////////////////////////////////////////////////////////////////////// + /// Detector interface. + //////////////////////////////////////////////////////////////////////////////// + class mmDetectorI + { + private: // fields + //////////////////////////////////////////////////////////////////////////////// + /// ID name of detector. + //////////////////////////////////////////////////////////////////////////////// + mmString m_sName; + protected: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Method sets name of detector. + /// + /// @param[in] p_sName detector name + //////////////////////////////////////////////////////////////////////////////// + void SetName(mmString p_sName) + { + m_sName = p_sName; + }; + public: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Virtual destructor. + //////////////////////////////////////////////////////////////////////////////// + virtual ~mmDetectorI() {}; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns name of detector. + /// + /// @return name of detector + //////////////////////////////////////////////////////////////////////////////// + const wchar_t* GetName(void) + { + return m_sName.c_str(); + }; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns XML structure with global params of detector. These params + /// are used globally, they are not changing from image to image. + /// + /// @return XML structure with global parameters + //////////////////////////////////////////////////////////////////////////////// + virtual mmString GetXMLGlobalParams(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns XML structure with global params of detector. These params + /// are used globally, they are not changing from image to image. + /// + /// @param[in] p_pcXMLParamsBuffer buffer with XML structure with global parameters + /// @param[in] p_iXMLParamsBufferSize size of buffer + //////////////////////////////////////////////////////////////////////////////// + virtual void GetXMLGlobalParams( wchar_t* p_pcXMLParamsBuffer, + mmInt p_iXMLParamsBufferSize) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method sets new set of global params for detector. In case of error + /// it throws mmError(mmeHardwareBadInputParams) and + /// mmError(mmeHardwareBadRangeForParamsValue). + /// + /// @param[in] p_sXMLParams XML definition of global detector parameters. + //////////////////////////////////////////////////////////////////////////////// + virtual void SetXMLGlobalParams(mmString p_sXMLParams) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method sets new set of global params for detector. In case of error + /// it throws mmError(mmeHardwareBadInputParams) and + /// mmError(mmeHardwareBadRangeForParamsValue). + /// + /// @param[in] p_pcXMLParams XML definition of global detector parameters. + //////////////////////////////////////////////////////////////////////////////// + virtual void SetXMLGlobalParams(wchar_t* p_pcXMLParams) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns XML structure with image parameters. These parameters can be + /// changed from image to image. + /// + /// @return XML structure with image parameters + //////////////////////////////////////////////////////////////////////////////// + virtual mmString GetXMLImageParams(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns XML structure with image parameters. These parameters can be + /// changed from image to image. + /// + /// @param[in] p_pcXMLParamsBuffer buffer with XML structure with image parameters + /// @param[in] p_iXMLParamsBufferSize size of buffer + //////////////////////////////////////////////////////////////////////////////// + virtual void GetXMLImageParams( wchar_t* p_pcXMLParamsBuffer, + mmInt p_iXMLParamsBufferSize) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method sets new set of local params for detector. In case of error + /// it throws mmError(mmeHardwareBadInputParams) and + /// mmError(mmeHardwareBadRangeForParamsValue). + /// + /// @param[in] p_sXMLParams XML definition of local detector parameters. + //////////////////////////////////////////////////////////////////////////////// + virtual void SetXMLImageParams(mmString p_sXMLParams) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method sets new set of local params for detector. In case of error + /// it throws mmError(mmeHardwareBadInputParams) and + /// mmError(mmeHardwareBadRangeForParamsValue). + /// + /// @param[in] p_pcXMLParams XML definition of local detector parameters. + //////////////////////////////////////////////////////////////////////////////// + virtual void SetXMLImageParams(wchar_t* p_pcXMLParams) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method captures image from detector. In case of error it throws + /// mmError(mmeHardwareCantCapture). + //////////////////////////////////////////////////////////////////////////////// + virtual void CaptureImage(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns captured image count. + /// + /// @return count of captured image. + //////////////////////////////////////////////////////////////////////////////// + virtual mmInt GetCapturedImagesCount(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns info about previously captured image. In case of error + /// it throws mmError(mmeHardwareImageOutOfRange). + /// + /// @param[in] p_iImageIndex index of requested image + /// @return information about image + //////////////////////////////////////////////////////////////////////////////// + virtual sImageDef GetImageInfo(mmInt p_iImageIndex) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns previously captured image. In case of error it throws + /// mmError(mmeHardwareImageOutOfRange). + /// + /// @param[in] p_iImageIndex index of requested image + /// @param[in] p_psImageData pointer where image data have to be copied. + //////////////////////////////////////////////////////////////////////////////// + virtual void GetImageData( mmInt p_iImageIndex, + void* p_psImageData) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method deletes all images stored in detector memory. + //////////////////////////////////////////////////////////////////////////////// + virtual void DeleteAllImages(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns info about flash state. + /// + /// @return TRUE if flash function is enabled, FALSE otherwise. + //////////////////////////////////////////////////////////////////////////////// + virtual bool IsFlashOn(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method sets flash state. + /// + /// @param[in] p_bFlashOnOff new flash state + //////////////////////////////////////////////////////////////////////////////// + virtual void SetFlash(bool p_bFlashOnOff) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method saves detector state into XML file. It not save images. + /// + /// @param[in] p_sPathToFile path to XML file. + //////////////////////////////////////////////////////////////////////////////// + virtual void SaveStateInXMLFile(mmString p_sPathToFile) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method saves detector state into XML file. It not save images. + /// + /// @param[in] p_pcPathToFile path to XML file. + //////////////////////////////////////////////////////////////////////////////// + virtual void SaveStateInXMLFile(wchar_t* p_pcPathToFile) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method loads detector state from XML file. + /// + /// @param[in] p_sPathToFile path to XML file. + //////////////////////////////////////////////////////////////////////////////// + virtual void LoadStateFromXMLFile(mmString p_sPathToFile) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method loads detector state from XML file. + /// + /// @param[in] p_pcPathToFile path to XML file. + //////////////////////////////////////////////////////////////////////////////// + virtual void LoadStateFromXMLFile(wchar_t* p_pcPathToFile) = 0; + }; + + //////////////////////////////////////////////////////////////////////////////// + /// Detector container interface. It is responsible for + /// searching all available detectors and querying them. It also initializes + /// detector objects and return pointers to them. + //////////////////////////////////////////////////////////////////////////////// + class mmDetectorContainerI + { + public: // name + //////////////////////////////////////////////////////////////////////////////// + /// Virtual destructor. + //////////////////////////////////////////////////////////////////////////////// + virtual ~mmDetectorContainerI() {}; + + //////////////////////////////////////////////////////////////////////////////// + /// Returns list with names of available detectors. + /// + /// @return vector with names defining available detectors. + //////////////////////////////////////////////////////////////////////////////// + virtual std::vector GetAvailableDetectors(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Initializes selected detector and returns pointer into its interface. + /// In case of error it throws mmError(mmeHardwareUnknownDetector). + /// + /// @param[in] p_sDetectorName name of detector to initialize, + /// @return pointer to initialized mmHardware::mmDetectorI object. + //////////////////////////////////////////////////////////////////////////////// + virtual mmHardware::mmDetectorI* InitializeDetector(mmString p_sDetectorName) = 0; + }; + + + + //////////////////////////////////////////////////////////////////////////////// + /// Projector interface. + //////////////////////////////////////////////////////////////////////////////// + class mmProjectorI + { + public: // definitions + //////////////////////////////////////////////////////////////////////////////// + /// Definition of projected image type. + //////////////////////////////////////////////////////////////////////////////// + typedef enum + { + //////////////////////////////////////////////////////////////////////////////// + /// Image with constant intensity (image is defined by one pixel value). + //////////////////////////////////////////////////////////////////////////////// + constant_intensity = 0, + //////////////////////////////////////////////////////////////////////////////// + /// Image with horizontal orientation (image is defined by one row). + //////////////////////////////////////////////////////////////////////////////// + horizontal_orientation = 1, + //////////////////////////////////////////////////////////////////////////////// + /// Image with vertical orientation (image is defined by one column). + //////////////////////////////////////////////////////////////////////////////// + vertical_orientation = 2, + //////////////////////////////////////////////////////////////////////////////// + /// Image with horizontal orientation (image is defined by one row). + //////////////////////////////////////////////////////////////////////////////// + horizontal_and_vertical_orientation = 3, + //////////////////////////////////////////////////////////////////////////////// + /// Two-dimensional image (each pixel of image is defined). + //////////////////////////////////////////////////////////////////////////////// + image2D = 4 + } eProjectorImageType; + //////////////////////////////////////////////////////////////////////////////// + /// Definition of projector image. + //////////////////////////////////////////////////////////////////////////////// + typedef struct + { + //////////////////////////////////////////////////////////////////////////////// + /// Image type. + //////////////////////////////////////////////////////////////////////////////// + eProjectorImageType eImageType; + //////////////////////////////////////////////////////////////////////////////// + /// Red intensities. + //////////////////////////////////////////////////////////////////////////////// + std::vector vRed; + //////////////////////////////////////////////////////////////////////////////// + /// Green intensities. + //////////////////////////////////////////////////////////////////////////////// + std::vector vGreen; + //////////////////////////////////////////////////////////////////////////////// + /// Blue intensities. + //////////////////////////////////////////////////////////////////////////////// + std::vector vBlue; + //////////////////////////////////////////////////////////////////////////////// + /// Defines if quality of measurement will increase if this image will be + /// reperated and further averaged. + //////////////////////////////////////////////////////////////////////////////// + bool bIsRepeatable; + } sProjectorImageDef; + private: // fields + //////////////////////////////////////////////////////////////////////////////// + /// ID name of projector. + //////////////////////////////////////////////////////////////////////////////// + mmString m_sName; + protected: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Method sets name of projector. + /// + /// @param[in] p_sName projector name + //////////////////////////////////////////////////////////////////////////////// + void SetName(mmString p_sName) + { + m_sName = p_sName; + }; + public: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Virtual destructor. + //////////////////////////////////////////////////////////////////////////////// + virtual ~mmProjectorI() {}; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns name of projector. + /// + /// @return name of projector + //////////////////////////////////////////////////////////////////////////////// + const wchar_t* GetName(void) + { + return m_sName.c_str(); + }; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns XML structure with global params of projector. These params + /// are used globally, they are not changing from image to image projected. + /// + /// @return XML structure with global parameters + //////////////////////////////////////////////////////////////////////////////// + virtual mmString GetXMLGlobalParams(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns XML structure with global params of projector. These params + /// are used globally, they are not changing from image to image projected. + /// + /// @param[in] p_pcXMLParamsBuffer buffer with XML structure with global parameters + /// @param[in] p_iXMLParamsBufferSize size of buffer + //////////////////////////////////////////////////////////////////////////////// + virtual void GetXMLGlobalParams(wchar_t* p_pcXMLParamsBuffer, + mmInt p_iXMLParamsBufferSize) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method sets new set of global params for projector. In case of error + /// it throws mmError(mmeHardwareBadInputParams) and + /// mmError(mmeHardwareBadRangeForParamsValue). + /// + /// @param[in] p_sXMLParams XML definition of global projector parameters. + //////////////////////////////////////////////////////////////////////////////// + virtual void SetXMLGlobalParams(mmString p_sXMLParams) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method sets new set of global params for projector. In case of error + /// it throws mmError(mmeHardwareBadInputParams) and + /// mmError(mmeHardwareBadRangeForParamsValue). + /// + /// @param[in] p_pcXMLParams XML definition of global projector parameters. + //////////////////////////////////////////////////////////////////////////////// + virtual void SetXMLGlobalParams(wchar_t* p_pcXMLParams) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns XML structure with projected image parameters. These + /// parameters can be changed from image to image projected. + /// + /// @return XML structure with projected image parameters + //////////////////////////////////////////////////////////////////////////////// + virtual mmString GetXMLImageParams(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns XML structure with projected image parameters. These + /// parameters can be changed from image to image projected. + /// + /// @param[in] p_pcXMLParamsBuffer buffer with XML structure with image parameters + /// @param[in] p_iXMLParamsBufferSize size of buffer + //////////////////////////////////////////////////////////////////////////////// + virtual void GetXMLImageParams(wchar_t* p_pcXMLParamsBuffer, + mmInt p_iXMLParamsBufferSize) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method sets new values of projected image. In case of error + /// it throws mmError(mmeHardwareBadInputParams) and + /// mmError(mmeHardwareBadRangeForParamsValue). + /// + /// @param[in] p_sXMLParams XML definition of local projector parameters. + //////////////////////////////////////////////////////////////////////////////// + virtual void SetXMLImageParams(mmString p_sXMLParams) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method sets new values of projected image. In case of error + /// it throws mmError(mmeHardwareBadInputParams) and + /// mmError(mmeHardwareBadRangeForParamsValue). + /// + /// @param[in] p_pcXMLParams XML definition of local projector parameters. + //////////////////////////////////////////////////////////////////////////////// + virtual void SetXMLImageParams(wchar_t* p_pcXMLParams) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// This method initialises image sequence to project. + /// + /// @param[in] p_psProjImages pointer to vector storing image sequence definition + //////////////////////////////////////////////////////////////////////////////// + virtual void InitializeImageSequence(std::vector* p_psProjImages) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// This method returns count of initialized image sequence. + /// + /// @return count of initialized image sequence + //////////////////////////////////////////////////////////////////////////////// + virtual mmInt GetInitializedImageSequenceCount(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method starts rendering process. In case of error + /// it throws mmError(mmeHardwareInitialisationError). + //////////////////////////////////////////////////////////////////////////////// + virtual void StartProjectionMode(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method stops rendering process. + //////////////////////////////////////////////////////////////////////////////// + virtual void StopProjectionMode(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method projects image from image sequence list. + /// + /// @param[in] m_iImageIndex index of image in sequence list. + //////////////////////////////////////////////////////////////////////////////// + virtual void ProjectImage(mmInt m_iImageIndex) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns projection width. + /// + /// @return projection width. + //////////////////////////////////////////////////////////////////////////////// + virtual mmInt GetProjectionWidth(void) = 0; + //////////////////////////////////////////////////////////////////////////////// + /// Method returns projection height. + /// + /// @return projection height. + //////////////////////////////////////////////////////////////////////////////// + virtual mmInt GetProjectionHeight(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method saves projector state into XML file. It not save image sequence. + /// + /// @param[in] p_sPathToFile path to XML file. + //////////////////////////////////////////////////////////////////////////////// + virtual void SaveStateInXMLFile(mmString p_sPathToFile) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method saves projector state into XML file. It not save image sequence. + /// + /// @param[in] p_pcPathToFile path to XML file. + //////////////////////////////////////////////////////////////////////////////// + virtual void SaveStateInXMLFile(wchar_t* p_pcPathToFile) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method loads projector state from XML file. + /// + /// @param[in] p_sPathToFile path to XML file. + //////////////////////////////////////////////////////////////////////////////// + virtual void LoadStateFromXMLFile(mmString p_sPathToFile) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method loads projector state from XML file. + /// + /// @param[in] p_pcPathToFile path to XML file. + //////////////////////////////////////////////////////////////////////////////// + virtual void LoadStateFromXMLFile(wchar_t* p_pcPathToFile) = 0; + }; + + //////////////////////////////////////////////////////////////////////////////// + /// Projector container interface. It is responsible for + /// searching all available projectors and querying them. It also initializes + /// projector objects and return pointers to them. + //////////////////////////////////////////////////////////////////////////////// + class mmProjectorContainerI + { + public: // name + //////////////////////////////////////////////////////////////////////////////// + /// Virtual destructor. + //////////////////////////////////////////////////////////////////////////////// + virtual ~mmProjectorContainerI() {}; + + //////////////////////////////////////////////////////////////////////////////// + /// Returns list with names of available projectors. + /// + /// @return vector with names defining available projectors. + //////////////////////////////////////////////////////////////////////////////// + virtual std::vector GetAvailableProjectors(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Initializes selected projector and returns pointer into its interface. + /// In case of error it throws mmError(mmeHardwareUnknownDetector). + /// + /// @param[in] p_sProjectorName name of projector to initialize, + /// @return pointer to initialized mmHardware::mmProjectorI object. + //////////////////////////////////////////////////////////////////////////////// + virtual mmHardware::mmProjectorI* InitializeProjector(mmString p_sProjectorName) = 0; + }; +}; + +#endif diff --git a/include/interfaces/mmIImages.h b/include/interfaces/mmIImages.h new file mode 100644 index 0000000..c7bea71 --- /dev/null +++ b/include/interfaces/mmIImages.h @@ -0,0 +1,287 @@ +//****************************************************************************** +//****************************************************************************** +// +// Images interfaces +// +// Description: This header defines mmImages namespace and its main interfaces. +// +//****************************************************************************** +//****************************************************************************** +#ifndef mmIImagesInterfacesH +#define mmIImagesInterfacesH + +#include +#include +#include +#include + +#include + +//////////////////////////////////////////////////////////////////////////////// +/// It defines size of input/output XML params definition for calculation +/// automation. +//////////////////////////////////////////////////////////////////////////////// +#define INOUT_PARAMS_SIZE 4096 + +//////////////////////////////////////////////////////////////////////////////// +/// Namespace for images storage, calculation and manipulation. +//////////////////////////////////////////////////////////////////////////////// +namespace mmImages +{ + class mmLayerI; + class mmImageI; + class mmImageStructureI; + + class mmStats { + public: + mmStats(void); + void Clear(void); + void Update(mmReal const p_prValues[], mmUInt const p_iSize); + public: + static mmReal const rInvalid; + public: + mmReal rMin; + mmReal rMax; + mmReal rAverage; + mmReal rStdDev; + }; + + class mmLayerI { + public: + class mmCallbackI { + public: + virtual void OnLayerCreate(mmLayerI * p_psLayer) = 0; + virtual void OnLayerDestroy(mmLayerI * p_psLayer) = 0; + virtual void OnLayerPropertiesChange(mmLayerI * p_psLayer) = 0; + virtual void OnLayerValuesChange(mmLayerI * p_psLayer) = 0; + }; + public: + static mmUInt const iInvalid; + public: + virtual mmUInt GetWidth(void) const = 0; + virtual mmUInt GetHeight(void) const = 0; + virtual mmReal GetDefaultValue(void) const = 0; + + virtual mmStats GetStats(void) const = 0; + + virtual mmString GetName(void) const = 0; + virtual void SetName(mmString const & p_sName) = 0; + + virtual bool GetRows(mmUInt const p_iStart, mmUInt const p_iCount, mmReal p_prValues[]) const = 0; + virtual bool SetRows(mmUInt const p_iStart, mmUInt const p_iCount, mmReal const p_prValues[]) = 0; + + virtual bool GetPixels(mmRect const & p_sRect, mmReal p_prValues[]) const = 0; + virtual bool SetPixels(mmRect const & p_sRect, mmReal const p_prValues[]) = 0; + + virtual ~mmLayerI(void) {}; + }; + + class mmImageI { + public: + class mmCallbackI { + public: + virtual void OnImageCreate(mmImageI * p_psImage) = 0; + virtual void OnImageDestroy(mmImageI * p_psImage) = 0; + virtual void OnImagePropertiesChange(mmImageI * p_psImage) = 0; + virtual void OnImagePixelsChange(mmImageI * p_psImage) = 0; + virtual void OnLayerCreate(mmImageI * p_psImage, mmLayerI * p_psLayer) = 0; + virtual void OnLayerDestroy(mmImageI * p_psImage, mmLayerI * p_psLayer) = 0; + virtual void OnLayerPropertiesChange(mmImageI * p_psImage, mmLayerI * p_psLayer) = 0; + virtual void OnLayerValuesChange(mmImageI * p_psImage, mmLayerI * p_psLayer) = 0; + }; + public: + enum mmPixelType {mmP8=1, mmP24=3, mmP32=4}; + public: + static mmUInt const iInvalid; + public: + virtual mmUInt GetWidth(void) const = 0; + virtual mmUInt GetHeight(void) const = 0; + virtual void Resize(mmUInt const p_iWidth, mmUInt const p_iHeight) = 0; + + virtual mmPixelType GetPixelType(void) const = 0; + + virtual mmString GetName(void) const = 0; + virtual void SetName(mmString const & p_sName) = 0; + + virtual mmLayerI * GetChannel(mmUInt const p_iIndex) const = 0; + + virtual bool GetRows(mmUInt const p_iStart, mmUInt const p_iCount, mmPixel8 p_psValues[]) const = 0; + virtual bool GetRows(mmUInt const p_iStart, mmUInt const p_iCount, mmPixel24 p_psValues[]) const = 0; + virtual bool GetRows(mmUInt const p_iStart, mmUInt const p_iCount, mmPixel32 p_psValues[]) const = 0; + + virtual bool SetRows(mmUInt const p_iStart, mmUInt const p_iCount, mmPixel8 const p_psValues[]) = 0; + virtual bool SetRows(mmUInt const p_iStart, mmUInt const p_iCount, mmPixel24 const p_psValues[]) = 0; + virtual bool SetRows(mmUInt const p_iStart, mmUInt const p_iCount, mmPixel32 const p_psValues[]) = 0; + + virtual bool GetPixels(mmRect const & p_sRect, mmPixel8 p_psValues[]) const = 0; + virtual bool GetPixels(mmRect const & p_sRect, mmPixel24 p_psValues[]) const = 0; + virtual bool GetPixels(mmRect const & p_sRect, mmPixel32 p_psValues[]) const = 0; + + virtual bool SetPixels(mmRect const & p_sRect, mmPixel8 const p_psValues[]) = 0; + virtual bool SetPixels(mmRect const & p_sRect, mmPixel24 const p_psValues[]) = 0; + virtual bool SetPixels(mmRect const & p_sRect, mmPixel32 const p_psValues[]) = 0; + + virtual void SetRegionOfInterest(mmRect const & p_sRegion) = 0; + virtual mmRect GetRegionOfInterest(void) const = 0; + + virtual mmUInt CreateLayer(mmString const & p_sName, mmReal const p_rDefaultValue) = 0; + virtual mmUInt GetLayerCount(void) const = 0; + virtual mmLayerI * GetLayer(mmUInt const p_iIndex) const = 0; + virtual mmLayerI * GetLayer(mmString const & p_sName) const = 0; + virtual bool DeleteLayer(mmUInt const p_iIndex) = 0; + virtual bool DeleteLayer(mmString const & p_sName) = 0; + + virtual void SetMetadata(mmString const & p_sMetadata) = 0; + virtual mmString GetMetadata(void) = 0; + + virtual ~mmImageI(void) {}; + }; + + class mmImageStructureI { + public: + virtual mmUInt CreateImage(mmString const & p_sName, mmUInt const p_iWidth, mmUInt const p_iHeight, mmImageI::mmPixelType const p_ePixelType) = 0; + virtual mmUInt GetImageCount(void) const = 0; + virtual mmImageI * GetImage(mmUInt const p_iIndex) const = 0; + virtual mmImageI * GetImage(mmString const & p_sName) const = 0; + virtual bool DeleteImage(mmUInt const p_iIndex) = 0; + virtual bool DeleteImage(mmString const & p_sName) = 0; + + virtual ~mmImageStructureI(void) {}; + }; + + extern const wchar_t* g_pAutoCalcXML_Params_ParamType_ImageName; + extern const wchar_t* g_pAutoCalcXML_Params_ParamType_ImagesNames; + extern const wchar_t* g_pAutoCalcXML_Params_ParamType_ImageCount_All; + extern const wchar_t* g_pAutoCalcXML_Params_ParamType_DataLayerName; + extern const wchar_t* g_pAutoCalcXML_Params_ParamType_RealValue; + extern const wchar_t* g_pAutoCalcXML_Params_ParamType_IntegerValue; + extern const wchar_t* g_pAutoCalcXML_Params_ParamType_BoolValue; + extern const wchar_t* g_pAutoCalcXML_Params_ParamType_BoolValue_YES; + extern const wchar_t* g_pAutoCalcXML_Params_ParamType_BoolValue_NO; + extern const wchar_t* g_pAutoCalcXML_Params_ParamType_String; + + extern const wchar_t* g_pAutoCalcXML_INParams_Node; + extern const wchar_t* g_pAutoCalcXML_OUTParams_Node; + extern const wchar_t* g_pAutoCalcXML_Params_Param_Node; + extern const wchar_t* g_pAutoCalcXML_Params_ParamName_Node; + extern const wchar_t* g_pAutoCalcXML_Params_ParamType_Node; + extern const wchar_t* g_pAutoCalcXML_Params_ParamValue_Node; + + //////////////////////////////////////////////////////////////////////////////// + /// Interface representing image calculation method class. It should be + /// derived and implemented by developers designing calculation method classes for + /// images processing. + //////////////////////////////////////////////////////////////////////////////// + class mmImagesCalculationMethodI: public mmThread::mmThreadExecutionI + { + public: // definitions + //////////////////////////////////////////////////////////////////////////////// + /// This structure defines calculation method params for automated processing + /// by using calculation patterns. + //////////////////////////////////////////////////////////////////////////////// + typedef struct + { + //////////////////////////////////////////////////////////////////////////////// + /// Definition of calculation method input params in XML. + //////////////////////////////////////////////////////////////////////////////// + wchar_t sInParams[INOUT_PARAMS_SIZE]; + //////////////////////////////////////////////////////////////////////////////// + /// Definition of calculation method output params in XML. + //////////////////////////////////////////////////////////////////////////////// + wchar_t sOutParams[INOUT_PARAMS_SIZE]; + } sCalculationAutomationParams; + + //////////////////////////////////////////////////////////////////////////////// + /// This structure defines calculation method params defining its functionality and + /// description. + //////////////////////////////////////////////////////////////////////////////// + typedef struct + { + //////////////////////////////////////////////////////////////////////////////// + /// Short name for calculation method. + //////////////////////////////////////////////////////////////////////////////// + wchar_t sShortName[128]; + //////////////////////////////////////////////////////////////////////////////// + /// Unique name for calculation method. + //////////////////////////////////////////////////////////////////////////////// + wchar_t sIDName[128]; + //////////////////////////////////////////////////////////////////////////////// + /// Description of calculation method functionality. + //////////////////////////////////////////////////////////////////////////////// + wchar_t sDescription[INOUT_PARAMS_SIZE]; + //////////////////////////////////////////////////////////////////////////////// + /// It defines if this calculation method can be executed in multithreaded + /// environment. TRUE - it can be multithreaded, FALSE - only one thread for + /// this calculation method is allowed. + //////////////////////////////////////////////////////////////////////////////// + bool bIsMultithreaded; + //////////////////////////////////////////////////////////////////////////////// + /// Automation params definition. + /// See mmImages::mmImagesCalculationMethodI::sCalculationAutomationParams + /// structure description. + //////////////////////////////////////////////////////////////////////////////// + sCalculationAutomationParams sAutoParams; + } sCalculationMethodParams; + public: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Virtual destructor. + //////////////////////////////////////////////////////////////////////////////// + virtual ~mmImagesCalculationMethodI() {}; + + //////////////////////////////////////////////////////////////////////////////// + /// Returns list with available image of points calculation methods. + /// + /// @return vector with mmImages::mmImagesStructureI::sCalculationMethodParams + /// structures defining available calculation methods and their functionality. + //////////////////////////////////////////////////////////////////////////////// + virtual mmImages::mmImagesCalculationMethodI::sCalculationMethodParams GetCalculationMethodInfo(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method initializes parameters for calculation method. It also invokes user interface + /// dialog for input parameters specification or parses automation parameters from XML. + /// + /// @param[in] p_psImagesStructure pointer to mmImages::mmImagesStructureI + /// representing images structure to calculate, + /// @param[in] p_psAutomationParams pointer to mmImages::mmImagesCalculationMethodI::sCalculationAutomationParams + /// structure representing automation params. If NULL than user interface asks + /// user about input parametrs specification, otherwise this structure is + /// parsed and all parameters are set automatically. + //////////////////////////////////////////////////////////////////////////////// + virtual void SetCalculationMethodParameters(mmImages::mmImageStructureI* p_psImagesStructure, + mmImages::mmImagesCalculationMethodI::sCalculationAutomationParams* p_psAutomationParams = NULL) = 0; + }; + + //////////////////////////////////////////////////////////////////////////////// + /// Images calculation method container interface. It is responsible for + /// searching all available calculation methods, querying them. It also initializes + /// calculation method objects and return pointers to them. + //////////////////////////////////////////////////////////////////////////////// + class mmImagesCalculationMethodContainerI + { + public: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Virtual destructor. + //////////////////////////////////////////////////////////////////////////////// + virtual ~mmImagesCalculationMethodContainerI() {}; + + //////////////////////////////////////////////////////////////////////////////// + /// Returns list with available images calculation methods. + /// + /// @return vector with mmImages::mmImagesCalculationMethodI::sCalculationMethodParams + /// structures defining available exporters and their functionality. + //////////////////////////////////////////////////////////////////////////////// + virtual std::vector GetAvailableImagesCalculationMethods(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Initializes selected images calculation method and returns pointer + /// into its interface. In case of error it throws + /// mmError(mmeImagesStructureUnknownImagesCalculationMethod). + /// + /// @param[in] p_sCalculationMethodName name of images calculation method to initialize, + /// @return pointer to initialized mmImages::mmImagesCalculationMethodI object. + //////////////////////////////////////////////////////////////////////////////// + virtual mmImages::mmImagesCalculationMethodI* InitializeImagesCalculationMethod(mmString p_sCalculationMethodName) = 0; + }; +}; + +#endif diff --git a/include/interfaces/mmILog.h b/include/interfaces/mmILog.h new file mode 100644 index 0000000..de68975 --- /dev/null +++ b/include/interfaces/mmILog.h @@ -0,0 +1,67 @@ +//****************************************************************************** +//****************************************************************************** +// +// Log Interface +// +// Description: Specification of logging interfaces. +// +//****************************************************************************** +//****************************************************************************** +#ifndef mmILogH +#define mmILogH + +#include + +//////////////////////////////////////////////////////////////////////////////// +/// Log organization definitions. +//////////////////////////////////////////////////////////////////////////////// +namespace mmLog +{ + //////////////////////////////////////////////////////////////////////////////// + /// Enumeration with definition of different log priorities. + //////////////////////////////////////////////////////////////////////////////// + typedef enum + { + //////////////////////////////////////////////////////////////////////////////// + /// Debug log message. For any activity of the system. + //////////////////////////////////////////////////////////////////////////////// + debug = 0, + //////////////////////////////////////////////////////////////////////////////// + /// Info log message. Second level of logging activity for raporting + /// of system & user behavior. + //////////////////////////////////////////////////////////////////////////////// + info = 1, + //////////////////////////////////////////////////////////////////////////////// + /// User log message. Used for logging user actions. + //////////////////////////////////////////////////////////////////////////////// + user = 2, + //////////////////////////////////////////////////////////////////////////////// + /// Critical log messages. Used for raporting of critical system events. + //////////////////////////////////////////////////////////////////////////////// + critical = 3 + } eLogMessagePriority; + + //////////////////////////////////////////////////////////////////////////////// + /// Log receiver interface defines functionality for collecting log messages + /// from whole environment. It have to be implemented as thread safe. + //////////////////////////////////////////////////////////////////////////////// + class mmLogReceiverI + { + public: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Virtual destructor. + //////////////////////////////////////////////////////////////////////////////// + virtual ~mmLogReceiverI() {}; + + //////////////////////////////////////////////////////////////////////////////// + /// Method for sending log messages. + /// + /// @param[in] p_ePriority - priority of log message, one of eLogMessagePriority + /// value + /// @param[in] p_psString - pointer to string with message + //////////////////////////////////////////////////////////////////////////////// + virtual void SendLogMessage(eLogMessagePriority p_ePriority,mmString* p_psString) = 0; + }; +}; + +#endif diff --git a/include/interfaces/mmISynchronize.h b/include/interfaces/mmISynchronize.h new file mode 100644 index 0000000..fd6de6f --- /dev/null +++ b/include/interfaces/mmISynchronize.h @@ -0,0 +1,117 @@ +//****************************************************************************** +//****************************************************************************** +// +// Thread and data synchronize Interface +// +// +// Description: Definition of interfaces for synchronization of data or +// threads. +// +//****************************************************************************** +//****************************************************************************** +#ifndef mmISynchronizeH +#define mmISynchronizeH + +#include +#include + +//////////////////////////////////////////////////////////////////////////////// +/// Synchronize namespace for all synchronization objects. +//////////////////////////////////////////////////////////////////////////////// +namespace mmSynchronize +{ + //////////////////////////////////////////////////////////////////////////////// + /// Interface for exclusive lock. + //////////////////////////////////////////////////////////////////////////////// + class mmExclusiveLockI + { + public: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Virtual destructor. Clean resources. In case of lock state throws error + /// mmError(mmeExclusiveLockLocked). + //////////////////////////////////////////////////////////////////////////////// + virtual ~mmExclusiveLockI() {}; + + //////////////////////////////////////////////////////////////////////////////// + /// TryLock tries to lock. + /// + /// @return true for success, false otherwise. + //////////////////////////////////////////////////////////////////////////////// + virtual bool TryLock(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Wait till successful lock. + //////////////////////////////////////////////////////////////////////////////// + virtual void Lock(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Unlock state. In case of unlocked state throws error + /// mmError(mmeExclusiveLockUnlocked). + //////////////////////////////////////////////////////////////////////////////// + virtual void Unlock(void) = 0; + }; + + //////////////////////////////////////////////////////////////////////////////// + /// Interface supporting read/write lock functionality. Gives possibility + /// for multiple read locks and signle write lock. + //////////////////////////////////////////////////////////////////////////////// + class mmReadWriteLockI + { + public: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Virtual destructor. Clean resources. In case of bad end + /// conditions throws exception (if it is locked then throws + /// mmError(mmeReadWriteLockBadEndLockCount), if some object waits for write lock + /// then throws mmError(mmeReadWriteLockWaitForWrite)). + //////////////////////////////////////////////////////////////////////////////// + virtual ~mmReadWriteLockI() {}; + + //////////////////////////////////////////////////////////////////////////////// + /// Tries to lock for read. + /// + /// @return true for success, false otherwise. + //////////////////////////////////////////////////////////////////////////////// + virtual bool TryLockForRead(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Wait till successful read lock. + //////////////////////////////////////////////////////////////////////////////// + virtual void LockForRead(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Unlock read state. In case of unlocked state throws error + /// mmError(mmeReadWriteLockReadUnlocked). + //////////////////////////////////////////////////////////////////////////////// + virtual void UnlockFromRead(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Tries to lock for write. + /// + /// @return true for success, false otherwise. + //////////////////////////////////////////////////////////////////////////////// + virtual bool TryLockForWrite(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Wait till successful write lock. + //////////////////////////////////////////////////////////////////////////////// + virtual void LockForWrite(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Unlock write state. In case of unlocked state throws error + /// mmError(mmeReadWriteLockWriteUnlocked). + //////////////////////////////////////////////////////////////////////////////// + virtual void UnlockFromWrite(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns state of lock. + /// + /// @param[out] p_pbWaitForWrite TRUE if any object waits for write access, + /// FALSE otherwise, + /// @return integer value representing lock state; - =-1 locked for write, + /// =0 unlocked, =n locked for read by n objects. + //////////////////////////////////////////////////////////////////////////////// + virtual mmInt GetLockState(bool* p_pbWaitForWrite) = 0; + }; +}; + +#endif diff --git a/include/interfaces/mmIThread.h b/include/interfaces/mmIThread.h new file mode 100644 index 0000000..f9be136 --- /dev/null +++ b/include/interfaces/mmIThread.h @@ -0,0 +1,141 @@ +//****************************************************************************** +//****************************************************************************** +// +// Thread Interface +// +// +// Description: This header defines interfaces for threaded work/calculations. +// +//****************************************************************************** +//****************************************************************************** +#ifndef mmIThreadH +#define mmIThreadH + +//////////////////////////////////////////////////////////////////////////////// +/// Namespace for multi-threaded work. +//////////////////////////////////////////////////////////////////////////////// +namespace mmThread +{ + //////////////////////////////////////////////////////////////////////////////// + /// This interface defined functionality for executing part of thread + /// which should be implemented in descendant of this class. Methods of + /// this interface are always called by mmThreadI, never directly by user. + //////////////////////////////////////////////////////////////////////////////// + class mmThreadExecutionI + { + public: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Virtual destructor. + //////////////////////////////////////////////////////////////////////////////// + virtual ~mmThreadExecutionI() {}; + + //////////////////////////////////////////////////////////////////////////////// + /// This method is called by mmThreadI class. This method should perform + /// all thread work/calculations. + /// + /// @return TRUE if execution is successful, FALSE otherwise. + //////////////////////////////////////////////////////////////////////////////// + virtual bool Execute(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// This method is called for stopping current calculation. Class which + /// implements this interface should assure this functionality. + //////////////////////////////////////////////////////////////////////////////// + virtual void StopExecution(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// This method gives info about execution state. + /// + /// @return TRUE if calculations are in progress, FALSE otherwise. + //////////////////////////////////////////////////////////////////////////////// + virtual bool IsExecuting(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns calculation progress as a real value between [0..100] percent. + /// + /// @return real value between [0..100] representing percentage of calculation + /// accomplishment + //////////////////////////////////////////////////////////////////////////////// + virtual mmReal GetProgress(void) = 0; + }; + + //////////////////////////////////////////////////////////////////////////////// + /// Interface m5ThreadI defines functionality of thread. + //////////////////////////////////////////////////////////////////////////////// + class mmThreadI + { + public: // definitions + //////////////////////////////////////////////////////////////////////////////// + /// State of thread. + //////////////////////////////////////////////////////////////////////////////// + typedef enum + { + //////////////////////////////////////////////////////////////////////////////// + /// Just created. + //////////////////////////////////////////////////////////////////////////////// + created = 0, + //////////////////////////////////////////////////////////////////////////////// + /// Thread is initialized and it knows his calculation mmThreadExecutionI object. + //////////////////////////////////////////////////////////////////////////////// + initialized = 1, + //////////////////////////////////////////////////////////////////////////////// + /// Thread calculates mmThreadExecutionI tasks. + //////////////////////////////////////////////////////////////////////////////// + running = 2, + //////////////////////////////////////////////////////////////////////////////// + /// Thread is during stopping stage. + //////////////////////////////////////////////////////////////////////////////// + stopping = 3, + //////////////////////////////////////////////////////////////////////////////// + /// Thread is stopped and calculations are not finished. + //////////////////////////////////////////////////////////////////////////////// + stopped = 4, + //////////////////////////////////////////////////////////////////////////////// + /// Thread finished his calculations. + //////////////////////////////////////////////////////////////////////////////// + finished = 5 + } eStatus; + public: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Virtual destructor. + //////////////////////////////////////////////////////////////////////////////// + virtual ~mmThreadI() {}; + + //////////////////////////////////////////////////////////////////////////////// + /// This method registers class with implementation of mmThreadExecutionI + /// interface which realizes calculation. + /// + /// @param[in] p_psThreadExecutionObject pointer to object with implementation + /// mmThreadExecutionI interface. + //////////////////////////////////////////////////////////////////////////////// + virtual void RegisterThreadExecutionClass(mmThreadExecutionI* p_psThreadExecutionObject) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// This method starts thread execution. + //////////////////////////////////////////////////////////////////////////////// + virtual void Run(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method stops thread execution. + //////////////////////////////////////////////////////////////////////////////// + virtual void Stop(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// This method returns state of thread. + /// + /// @return thread state. + //////////////////////////////////////////////////////////////////////////////// + virtual eStatus GetStatus(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns calculation progress as a real value between [0..100] percent. + /// If progress value is less than 0 it means that progress is unavailable. + /// + /// @return real value between [0..100] representing percentage of calculation + /// accomplishment + //////////////////////////////////////////////////////////////////////////////// + virtual mmReal GetProgress(void) = 0; + }; +}; + +#endif diff --git a/include/interfaces/mmIXML.h b/include/interfaces/mmIXML.h new file mode 100644 index 0000000..8868c03 --- /dev/null +++ b/include/interfaces/mmIXML.h @@ -0,0 +1,298 @@ +//****************************************************************************** +//****************************************************************************** +// +// XML Interface +// +// +// Description: This header defines namespace and interfaces for XML data/file manipulation. +// +//****************************************************************************** +//****************************************************************************** +#ifndef mmIXMLH +#define mmIXMLH + +#include + +#include +#include + +//////////////////////////////////////////////////////////////////////////////// +/// Namenpace for XML data manipulation. The idea behind is that any XML +/// engine used parses whole XML document into mmXMLDocI and mmXMLNodeI +/// elements structure and all operation are performed in this structure. +/// Further user can save or export resultant data. +//////////////////////////////////////////////////////////////////////////////// +namespace mmXML +{ + //////////////////////////////////////////////////////////////////////////////// + /// XML attribute definition. + //////////////////////////////////////////////////////////////////////////////// + typedef struct + { + //////////////////////////////////////////////////////////////////////////////// + /// Attribute name. + //////////////////////////////////////////////////////////////////////////////// + mmString sName; + //////////////////////////////////////////////////////////////////////////////// + /// Attribute value. + //////////////////////////////////////////////////////////////////////////////// + mmString sValue; + } sXMLAttribute; + + //////////////////////////////////////////////////////////////////////////////// + /// Interface for XML node element. + //////////////////////////////////////////////////////////////////////////////// + class mmXMLNodeI + { + public: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Virtual destructor. + //////////////////////////////////////////////////////////////////////////////// + virtual ~mmXMLNodeI() {}; + + //////////////////////////////////////////////////////////////////////////////// + /// This method returns name of XML node element. + /// + /// @return name of XML node + //////////////////////////////////////////////////////////////////////////////// + virtual mmString GetName(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method sets new name for XML node element. + /// + /// @param[in] p_sName new name of XML node. + //////////////////////////////////////////////////////////////////////////////// + virtual void SetName(mmString p_sName) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns information is this node is leaf of not. + /// + /// @return TRUE if it is leaf, FALSE otherwise. + //////////////////////////////////////////////////////////////////////////////// + virtual bool IsLeaf(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns attributes of node. + /// + /// @return vector with node attributes. + //////////////////////////////////////////////////////////////////////////////// + virtual std::vector GetAttributes(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// This method adds attribute to node. + /// + /// @param[in] p_sAttrName name of attribute + /// @param[in] p_sAttrValue value of attribute. + //////////////////////////////////////////////////////////////////////////////// + virtual void AddAttribute(mmString p_sAttrName, + mmString p_sAttrValue) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method removes attribute(s) with given name. In case of lack attribute + /// with given name it throws mmError(mmeXMLNoSuchAttribute). + /// + /// @param[in] p_sAttrName name of attribute. + //////////////////////////////////////////////////////////////////////////////// + virtual void RemoveAttribute(mmString p_sAttrName) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method removes all attributes. + //////////////////////////////////////////////////////////////////////////////// + virtual void RemoveAllAttributes(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method checks if attribute with given name exists. + /// + /// @param[in] p_sAttrName name of attribute. + /// @return TRUE if it exists, FALSE otherwise. + //////////////////////////////////////////////////////////////////////////////// + virtual bool IsAttribute(mmString p_sAttrName) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Methods returns attribute value. In case of lack attribute + /// with given name it throws mmError(mmeXMLNoSuchAttribute). + /// + /// @param[in] p_sAttrName name of attribute + /// @return value of attribute. + //////////////////////////////////////////////////////////////////////////////// + virtual mmString GetAttributeValue(mmString p_sAttrName) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Methods sets attribute value. In case of lack attribute + /// with given name it adds it. + /// + /// @param[in] p_sAttrName name of attribute + /// @param[in] p_sAttrValue new value of attribute. + //////////////////////////////////////////////////////////////////////////////// + virtual void SetAttributeValue(mmString p_sAttrName, + mmString p_sAttrValue) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns text of node. + /// + /// @return text of node. + //////////////////////////////////////////////////////////////////////////////// + virtual mmString GetText(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method sets text of node. + /// + /// @param[in] p_sText text of node. + //////////////////////////////////////////////////////////////////////////////// + virtual void SetText(mmString p_sText) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns vector with child nodes. + /// + /// @return vector with pointers to elements. + //////////////////////////////////////////////////////////////////////////////// + virtual std::vector GetChilds(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method adds child node. If node has not empty text element it clears it. + /// + /// @param[in] p_sChildName name of new child element + /// @return pointer to created node + //////////////////////////////////////////////////////////////////////////////// + virtual mmXML::mmXMLNodeI* AddChild(mmString p_sChildName) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method copies child node and its structure. + /// + /// @param[in] p_psChildNode pointer to node which will be copied + //////////////////////////////////////////////////////////////////////////////// + virtual void AddChildWithStructure(mmXMLNodeI* p_psChildNode) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method finds child node. If child not exist then it returns NULL; + /// + /// @param[in] p_sChildName name of new child element + /// @return pointer to found node + //////////////////////////////////////////////////////////////////////////////// + virtual mmXML::mmXMLNodeI* FindChild(mmString p_sChildName) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns pointer to child node. In case of lack node with given index + /// it throws mmError(mmeXMLNoSuchNode). + /// + /// @param[in] p_iChildIndex index of selected child node. + /// @return pointer to selected node + //////////////////////////////////////////////////////////////////////////////// + virtual mmXML::mmXMLNodeI* GetChild(mmInt p_iChildIndex) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method removes child node. In case of lack node with given name it throws + /// mmError(mmeXMLNoSuchNode). + /// + /// @param[in] p_sChildName child node name + //////////////////////////////////////////////////////////////////////////////// + virtual void RemoveChild(mmString p_sChildName) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method removes child node. In case of lack node with given name it throws + /// mmError(mmeXMLNoSuchNode). + /// + /// @param[in] p_iChildIndex index of selected child node. + //////////////////////////////////////////////////////////////////////////////// + virtual void RemoveChild(mmInt p_iChildIndex) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method removes all child nodes. + //////////////////////////////////////////////////////////////////////////////// + virtual void RemoveAllChilds(void) = 0; + //////////////////////////////////////////////////////////////////////////////// + /// Method finds parent node of current node. + /// + /// @return parent node. + //////////////////////////////////////////////////////////////////////////////// + virtual mmXMLNodeI* GetParent( void )=0; + //////////////////////////////////////////////////////////////////////////////// + /// Method finds next sibling of current node. + /// + /// @return next sibling. + //////////////////////////////////////////////////////////////////////////////// + virtual mmXMLNodeI* GetNextSibling( void )=0; + //////////////////////////////////////////////////////////////////////////////// + /// Method finds previous sibling of current node. + /// + /// @return previous sibling. + //////////////////////////////////////////////////////////////////////////////// + virtual mmXMLNodeI* GetPrevSibling( void )=0; + }; + + //////////////////////////////////////////////////////////////////////////////// + /// Interface for XML document. + //////////////////////////////////////////////////////////////////////////////// + class mmXMLDocI + { + public: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Virtual destructor. + //////////////////////////////////////////////////////////////////////////////// + virtual ~mmXMLDocI() {}; + + //////////////////////////////////////////////////////////////////////////////// + /// Method parses XML file. In case of error it throws mmError(mmeXMLParseError). + /// + /// @param[in] p_sXMLFileName name of file to parse. + //////////////////////////////////////////////////////////////////////////////// + virtual void ParseXMLFile(mmString p_sXMLFileName) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method parses text buffer with XML document. In case of error it throws + /// mmError(mmeXMLParseError). + /// + /// @param[in] p_sXMLBuffer text buffer to parse. + //////////////////////////////////////////////////////////////////////////////// + virtual void ParseXMLBuffer(mmString p_sXMLBuffer) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method saves mmXMLDocI structure as XML file. In case of error it throws + /// mmError(mmeXMLBadXMLStructure). + /// + /// @param[in] p_sXMLFileName file name to store XML structure. + //////////////////////////////////////////////////////////////////////////////// + virtual void SaveToXMLFile(mmString p_sXMLFileName) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method saves mmXMLDocI structure as XML buffer. In case of error it throws + /// mmError(mmeXMLBadXMLStructure). + /// + /// @return string storing XML structure. + //////////////////////////////////////////////////////////////////////////////// + virtual mmString SaveToXMLBuffer(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method validates mmXMLDocI structure. In case of error it throws + /// mmError(mmeXMLBadXMLStructure). + /// + /// @return TRUE if structure is valid, FALSE otherwise. + //////////////////////////////////////////////////////////////////////////////// + virtual bool IsXMLStructureValid(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns root node of mmXMLDocI document. In case of lack node with + /// given name it throws mmError(mmeXMLNoSuchNode). + /// + /// @return pointer to XML node object. + //////////////////////////////////////////////////////////////////////////////// + virtual mmXMLNodeI* GetXMLRootNode(void) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method creates new root node. It deletes whole existing XML structure. + /// + /// @param[in] p_sRootNodeName new root node name. + //////////////////////////////////////////////////////////////////////////////// + virtual void CreateXMLRootNode(mmString p_sRootNodeName) = 0; + + //////////////////////////////////////////////////////////////////////////////// + /// Method creates new root node. It deletes whole existing XML structure. New + /// node is copied from v_psNode with its whole structure. + /// + /// @param[in] p_psNode pointer to new root node source node. + //////////////////////////////////////////////////////////////////////////////// + virtual void CopyXMLRootNodeStructure(mmXMLNodeI* p_psNode) = 0; + }; +}; + +#endif diff --git a/include/log/mmLogSender.h b/include/log/mmLogSender.h new file mode 100644 index 0000000..0625600 --- /dev/null +++ b/include/log/mmLogSender.h @@ -0,0 +1,74 @@ +//****************************************************************************** +//****************************************************************************** +// +// Log Sender class +// +// +// Description: This class implements mmLogReceiverI interface and supports +// all other classes with transparent logging capability. +// +//****************************************************************************** +//****************************************************************************** +#ifndef mmLogSenderH +#define mmLogSenderH + +#include + +namespace mmLog +{ + //////////////////////////////////////////////////////////////////////////////// + /// This class support transparent use of logging capability. It should be + /// added as ancestor to any class of the system. + //////////////////////////////////////////////////////////////////////////////// + class mmLogSender + { + private: // fields + //////////////////////////////////////////////////////////////////////////////// + /// Name of class which is descendant of mmLogSender class and uses it for logging. + //////////////////////////////////////////////////////////////////////////////// + mmString m_sClassName; + //////////////////////////////////////////////////////////////////////////////// + /// Pointer to mmLogReceiverI object. + //////////////////////////////////////////////////////////////////////////////// + mmLogReceiverI* m_psLog; + public: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Initializes fields. If p_psLog is NULL then logging support is disabled. + /// + /// @param[in] p_sClassName - name of ancestor class. + /// @param[in] p_psLog - pointer to mmLogReceiverI object which receives log messages + //////////////////////////////////////////////////////////////////////////////// + mmLogSender(mmString p_sClassName,mmLogReceiverI* p_psLog = NULL); + + //////////////////////////////////////////////////////////////////////////////// + /// Method sends a log message with defined priority. If m_psLog is equal NULL + /// then do nothing. + /// + /// @param[in] p_pClassPointer pointer to class sending this message + /// @param[in] p_ePriority type of log message + /// @param[in] p_sString content of message + //////////////////////////////////////////////////////////////////////////////// + void SendLogMessage(void* p_pClassPointer, + eLogMessagePriority p_ePriority, + mmString p_sString); + + //////////////////////////////////////////////////////////////////////////////// + /// Return a pointer to mmLogReceiverI object stored in m_psLog field. + /// + /// @return pointer to log receiver. + //////////////////////////////////////////////////////////////////////////////// + mmLogReceiverI* GetLogReceiver(void); + protected: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Method sends a log message with defined priority. If m_psLog is equal NULL + /// then do nothing. + /// + /// @param[in] p_ePriority type of log message + /// @param[in] p_sString content of message + //////////////////////////////////////////////////////////////////////////////// + void SendLogMessage(mmLog::eLogMessagePriority p_ePriority, + mmString p_sString); + }; +}; + +#endif diff --git a/include/math/mmMath.h b/include/math/mmMath.h new file mode 100644 index 0000000..7519162 --- /dev/null +++ b/include/math/mmMath.h @@ -0,0 +1,1293 @@ +//****************************************************************************** +//****************************************************************************** +// +// Description: This header defines math functionality for the system. +// +//****************************************************************************** +//****************************************************************************** +#ifndef mmMathH +#define mmMathH + +#include +#define _USE_MATH_DEFINES 1 +#include + +#include + +//////////////////////////////////////////////////////////////////////////////// +/// This namespace implements math routines used in the system. +//////////////////////////////////////////////////////////////////////////////// +namespace mmMath +{ + extern const mmReal g_rPI; + extern const mmReal g_r2PI; + extern const mmReal g_rPI_div2; + extern const mmReal g_rPIAndMargin; + + extern const mmReal g_rMaxReal; + extern const mmReal g_rMinReal; + + extern const mmFloat g_fMaxFloat; + extern const mmFloat g_fMinFloat; + + extern const mmReal g_rOne; + extern const mmReal g_rSmall; + + //////////////////////////////////////////////////////////////////////////////// + /// This structure defines two dimensional point with real coords. + //////////////////////////////////////////////////////////////////////////////// + typedef struct + { + //////////////////////////////////////////////////////////////////////////////// + /// X coord. + //////////////////////////////////////////////////////////////////////////////// + mmReal rX; + //////////////////////////////////////////////////////////////////////////////// + /// Y coord. + //////////////////////////////////////////////////////////////////////////////// + mmReal rY; + } sPoint2D; + + //////////////////////////////////////////////////////////////////////////////// + /// This structure defines three dimensional point with real coords. + //////////////////////////////////////////////////////////////////////////////// + typedef struct + { + //////////////////////////////////////////////////////////////////////////////// + /// X coord. + //////////////////////////////////////////////////////////////////////////////// + mmReal rX; + //////////////////////////////////////////////////////////////////////////////// + /// Y coord. + //////////////////////////////////////////////////////////////////////////////// + mmReal rY; + //////////////////////////////////////////////////////////////////////////////// + /// Z coord. + //////////////////////////////////////////////////////////////////////////////// + mmReal rZ; + } sPoint3D; + + //////////////////////////////////////////////////////////////////////////////// + /// This structure defines two dimensional line (y=A*x + B). + //////////////////////////////////////////////////////////////////////////////// + typedef struct + { + //////////////////////////////////////////////////////////////////////////////// + /// A coefficient of line. + //////////////////////////////////////////////////////////////////////////////// + mmReal rA; + //////////////////////////////////////////////////////////////////////////////// + /// B coefficient of line. + //////////////////////////////////////////////////////////////////////////////// + mmReal rB; + } sLine2D; + + //////////////////////////////////////////////////////////////////////////////// + /// This structure defines fields required to calculate three dimensional line + /// with real coords by MinRMS method. + //////////////////////////////////////////////////////////////////////////////// + typedef struct + { + //////////////////////////////////////////////////////////////////////////////// + /// Sum of X^2. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumX2; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of Y^2. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumY2; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of Z^2. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumZ2; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of X*Y. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumXY; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of X*Z. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumXZ; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of Y*Z. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumYZ; + //////////////////////////////////////////////////////////////////////////////// + /// Points count. + //////////////////////////////////////////////////////////////////////////////// + mmReal rCount; + } sLine3DCalc; + + //////////////////////////////////////////////////////////////////////////////// + /// Values for calculating best fitted polynomial y = ax^3 + bx^2 +cx + d + //////////////////////////////////////////////////////////////////////////////// + typedef struct + { + //////////////////////////////////////////////////////////////////////////////// + /// Sum of x^6. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumX6; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of x^5. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumX5; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of x^4. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumX4; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of x^3. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumX3; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of x^2. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumX2; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of x. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumX; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of (x^3)*y. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumX3Y; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of (x^2)*y. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumX2Y; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of xy. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumXY; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of y. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumY; + //////////////////////////////////////////////////////////////////////////////// + /// Points count. + //////////////////////////////////////////////////////////////////////////////// + mmReal rCount; + } s3OrderPolynomialXtoYCalc; + + //////////////////////////////////////////////////////////////////////////////// + /// Definition of polynomial y = ax^3 + bx^2 +cx + d + //////////////////////////////////////////////////////////////////////////////// + typedef struct + { + //////////////////////////////////////////////////////////////////////////////// + /// A coefficient. + //////////////////////////////////////////////////////////////////////////////// + mmReal rA; + //////////////////////////////////////////////////////////////////////////////// + /// B coefficient. + //////////////////////////////////////////////////////////////////////////////// + mmReal rB; + //////////////////////////////////////////////////////////////////////////////// + /// C coefficient. + //////////////////////////////////////////////////////////////////////////////// + mmReal rC; + //////////////////////////////////////////////////////////////////////////////// + /// D coefficient. + //////////////////////////////////////////////////////////////////////////////// + mmReal rD; + } s3OrderPolynomialXtoY; + + //////////////////////////////////////////////////////////////////////////////// + /// This structure defines three dimensional line (x-x0)/A = (y-y0)/B = (z-z0)/C. + //////////////////////////////////////////////////////////////////////////////// + typedef struct + { + //////////////////////////////////////////////////////////////////////////////// + /// A coefficient of line. + //////////////////////////////////////////////////////////////////////////////// + mmReal rA; + //////////////////////////////////////////////////////////////////////////////// + /// B coefficient of line. + //////////////////////////////////////////////////////////////////////////////// + mmReal rB; + //////////////////////////////////////////////////////////////////////////////// + /// C coefficient of line. + //////////////////////////////////////////////////////////////////////////////// + mmReal rC; + //////////////////////////////////////////////////////////////////////////////// + /// Point on line. + //////////////////////////////////////////////////////////////////////////////// + sPoint3D sP; + } sLine3D; + + //////////////////////////////////////////////////////////////////////////////// + /// This structure defines fields required to calculate three dimensional plane + /// with real coords by MinRMS method. + //////////////////////////////////////////////////////////////////////////////// + typedef struct + { + //////////////////////////////////////////////////////////////////////////////// + /// Sum of X^2. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumX2; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of Y^2. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumY2; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of Z^2. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumZ2; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of X*Y. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumXY; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of X*Z. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumXZ; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of Y*Z. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumYZ; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of X. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumX; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of Y. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumY; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of Z. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumZ; + //////////////////////////////////////////////////////////////////////////////// + /// Points count. + //////////////////////////////////////////////////////////////////////////////// + mmReal rCount; + } sPlane3DCalc; + + //////////////////////////////////////////////////////////////////////////////// + /// This structure defines plane formula. + //////////////////////////////////////////////////////////////////////////////// + typedef struct + { + //////////////////////////////////////////////////////////////////////////////// + /// A coefficient of plane. + //////////////////////////////////////////////////////////////////////////////// + mmReal rA; + //////////////////////////////////////////////////////////////////////////////// + /// B coefficient of plane. + //////////////////////////////////////////////////////////////////////////////// + mmReal rB; + //////////////////////////////////////////////////////////////////////////////// + /// C coefficient of plane. + //////////////////////////////////////////////////////////////////////////////// + mmReal rC; + //////////////////////////////////////////////////////////////////////////////// + /// D coefficient of plane. + //////////////////////////////////////////////////////////////////////////////// + mmReal rD; + } sPlane3D; + + //////////////////////////////////////////////////////////////////////////////// + /// This structure defines fields required to calculate two dimensional circle + /// with real coords by MinRMS method. + //////////////////////////////////////////////////////////////////////////////// + typedef struct + { + //////////////////////////////////////////////////////////////////////////////// + /// Sum of X^3. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumX3; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of X^2*Y. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumX2Y; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of X*Y^2. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumXY2; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of Y^3. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumY3; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of X^2. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumX2; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of X*Y. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumXY; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of Y^2. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumY2; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of X. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumX; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of Y. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumY; + //////////////////////////////////////////////////////////////////////////////// + /// Pixels/points count. + //////////////////////////////////////////////////////////////////////////////// + mmReal rCount; + } sCircle2DCalc; + + //////////////////////////////////////////////////////////////////////////////// + /// This structure defines fields required to calculate three dimensional sphere + /// with real coords by MinRMS method. + //////////////////////////////////////////////////////////////////////////////// + typedef struct + { + //////////////////////////////////////////////////////////////////////////////// + /// Sum of X^3. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumX3; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of X^2*Y. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumX2Y; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of X^2*Z. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumX2Z; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of X*Y^2. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumXY2; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of X*Z^2. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumXZ2; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of Y^2*Z. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumY2Z; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of Y*Z^2. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumYZ2; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of Y^3. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumY3; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of Z^3. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumZ3; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of X^2. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumX2; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of X*Y. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumXY; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of X*Z. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumXZ; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of Y*Z. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumYZ; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of Y^2. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumY2; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of Z^2. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumZ2; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of X. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumX; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of Y. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumY; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of Z. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumZ; + //////////////////////////////////////////////////////////////////////////////// + /// Pixels/points count. + //////////////////////////////////////////////////////////////////////////////// + mmReal rCount; + } sSphere3DCalc; + + //////////////////////////////////////////////////////////////////////////////// + /// This structure defines three dimensional sphere with real coords. + //////////////////////////////////////////////////////////////////////////////// + typedef struct + { + //////////////////////////////////////////////////////////////////////////////// + /// X coord of sphere center. + //////////////////////////////////////////////////////////////////////////////// + mmReal rX0; + //////////////////////////////////////////////////////////////////////////////// + /// Y coord of sphere center. + //////////////////////////////////////////////////////////////////////////////// + mmReal rY0; + //////////////////////////////////////////////////////////////////////////////// + /// Z coord of sphere center. + //////////////////////////////////////////////////////////////////////////////// + mmReal rZ0; + //////////////////////////////////////////////////////////////////////////////// + /// Radius of sphere. + //////////////////////////////////////////////////////////////////////////////// + mmReal rRadius; + } sSphere3D; + + //////////////////////////////////////////////////////////////////////////////// + /// This structure defines two dimensional circle with real coords. + //////////////////////////////////////////////////////////////////////////////// + typedef struct + { + //////////////////////////////////////////////////////////////////////////////// + /// X coord of circle center. + //////////////////////////////////////////////////////////////////////////////// + mmReal rX0; + //////////////////////////////////////////////////////////////////////////////// + /// Y coord of circle center. + //////////////////////////////////////////////////////////////////////////////// + mmReal rY0; + //////////////////////////////////////////////////////////////////////////////// + /// Radius of circle. + //////////////////////////////////////////////////////////////////////////////// + mmReal rRadius; + } sCircle2D; + + typedef struct + { + //////////////////////////////////////////////////////////////////////////////// + /// X coord of circle center. + //////////////////////////////////////////////////////////////////////////////// + mmReal rX0; + //////////////////////////////////////////////////////////////////////////////// + /// Y coord of circle center. + //////////////////////////////////////////////////////////////////////////////// + mmReal rY0; + //////////////////////////////////////////////////////////////////////////////// + /// Z coord of circle center. + //////////////////////////////////////////////////////////////////////////////// + mmReal rZ0; + //////////////////////////////////////////////////////////////////////////////// + /// Radius of circle. + //////////////////////////////////////////////////////////////////////////////// + mmReal rRadius; + //////////////////////////////////////////////////////////////////////////////// + /// X coord of normal vector to circle plane. + //////////////////////////////////////////////////////////////////////////////// + mmReal rA; + //////////////////////////////////////////////////////////////////////////////// + /// Y coord of normal vector to circle plane. + //////////////////////////////////////////////////////////////////////////////// + mmReal rB; + //////////////////////////////////////////////////////////////////////////////// + /// Z coord of normal vector to circle plane. + //////////////////////////////////////////////////////////////////////////////// + mmReal rC; + mmReal rPlaneError; + mmReal rCircleError; + } sCircle3D; + + //////////////////////////////////////////////////////////////////////////////// + /// This structure defines fields required to calculate two dimensional ellipse + /// with real coords by MinRMS method. + //////////////////////////////////////////////////////////////////////////////// + typedef struct + { + //////////////////////////////////////////////////////////////////////////////// + /// Sum of X^4. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumX4; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of X^3*Y. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumX3Y; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of X^2*Y^2. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumX2Y2; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of X*Y^3. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumXY3; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of Y^4. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumY4; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of X^3. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumX3; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of X^2*Y. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumX2Y; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of X*Y^2. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumXY2; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of Y^3. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumY3; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of X^2. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumX2; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of X*Y. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumXY; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of Y^2. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumY2; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of X. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumX; + //////////////////////////////////////////////////////////////////////////////// + /// Sum of Y. + //////////////////////////////////////////////////////////////////////////////// + mmReal rSumY; + //////////////////////////////////////////////////////////////////////////////// + /// Pixels/points count. + //////////////////////////////////////////////////////////////////////////////// + mmReal rCount; + } sEllipse2DCalc; + + //////////////////////////////////////////////////////////////////////////////// + /// This structure defines two dimensional ellipse with real coords. + //////////////////////////////////////////////////////////////////////////////// + typedef struct + { + //////////////////////////////////////////////////////////////////////////////// + /// X coord of ellipse center. + //////////////////////////////////////////////////////////////////////////////// + mmReal rX0; + //////////////////////////////////////////////////////////////////////////////// + /// Y coord of ellipse center. + //////////////////////////////////////////////////////////////////////////////// + mmReal rY0; + //////////////////////////////////////////////////////////////////////////////// + /// Rotation angle of ellipse. + //////////////////////////////////////////////////////////////////////////////// + mmReal rAngle; + //////////////////////////////////////////////////////////////////////////////// + /// Radius in x axis of ellipse. + //////////////////////////////////////////////////////////////////////////////// + mmReal rRadiusA; + //////////////////////////////////////////////////////////////////////////////// + /// Radius in y axis of ellipse. + //////////////////////////////////////////////////////////////////////////////// + mmReal rRadiusB; + //////////////////////////////////////////////////////////////////////////////// + /// Coefficient of canonical form a: a*x^2 + b*2*x*y + c*y^2 + d*x + e*y + f = 0 + //////////////////////////////////////////////////////////////////////////////// + mmReal rA; + //////////////////////////////////////////////////////////////////////////////// + /// Coefficient of canonical form b: a*x^2 + b*2*x*y + c*y^2 + d*x + e*y + f = 0 + //////////////////////////////////////////////////////////////////////////////// + mmReal rB; + //////////////////////////////////////////////////////////////////////////////// + /// Coefficient of canonical form c: a*x^2 + b*2*x*y + c*y^2 + d*x + e*y + f = 0 + //////////////////////////////////////////////////////////////////////////////// + mmReal rC; + //////////////////////////////////////////////////////////////////////////////// + /// Coefficient of canonical form d: a*x^2 + b*2*x*y + c*y^2 + d*x + e*y + f = 0 + //////////////////////////////////////////////////////////////////////////////// + mmReal rD; + //////////////////////////////////////////////////////////////////////////////// + /// Coefficient of canonical form e: a*x^2 + b*2*x*y + c*y^2 + d*x + e*y + f = 0 + //////////////////////////////////////////////////////////////////////////////// + mmReal rE; + //////////////////////////////////////////////////////////////////////////////// + /// Coefficient of canonical form f: a*x^2 + b*2*x*y + c*y^2 + d*x + e*y + f = 0 + //////////////////////////////////////////////////////////////////////////////// + mmReal rF; + } sEllipse2D; + + //////////////////////////////////////////////////////////////////////////////// + /// This structure defines 3D transformation. + //////////////////////////////////////////////////////////////////////////////// + typedef struct + { + //////////////////////////////////////////////////////////////////////////////// + /// X translation. + //////////////////////////////////////////////////////////////////////////////// + mmReal rTranslationX; + //////////////////////////////////////////////////////////////////////////////// + /// Y translation. + //////////////////////////////////////////////////////////////////////////////// + mmReal rTranslationY; + //////////////////////////////////////////////////////////////////////////////// + /// Z translation. + //////////////////////////////////////////////////////////////////////////////// + mmReal rTranslationZ; + //////////////////////////////////////////////////////////////////////////////// + /// X rotation. + //////////////////////////////////////////////////////////////////////////////// + mmReal rRotationX; + //////////////////////////////////////////////////////////////////////////////// + /// Y rotation. + //////////////////////////////////////////////////////////////////////////////// + mmReal rRotationY; + //////////////////////////////////////////////////////////////////////////////// + /// Z rotation. + //////////////////////////////////////////////////////////////////////////////// + mmReal rRotationZ; + //////////////////////////////////////////////////////////////////////////////// + /// X rotation sin+. + //////////////////////////////////////////////////////////////////////////////// + mmReal rRotationXSinP; + //////////////////////////////////////////////////////////////////////////////// + /// X rotation sin-. + //////////////////////////////////////////////////////////////////////////////// + mmReal rRotationXSinM; + //////////////////////////////////////////////////////////////////////////////// + /// X rotation cos+. + //////////////////////////////////////////////////////////////////////////////// + mmReal rRotationXCosP; + //////////////////////////////////////////////////////////////////////////////// + /// X rotation cos-. + //////////////////////////////////////////////////////////////////////////////// + mmReal rRotationXCosM; + //////////////////////////////////////////////////////////////////////////////// + /// Y rotation sin+. + //////////////////////////////////////////////////////////////////////////////// + mmReal rRotationYSinP; + //////////////////////////////////////////////////////////////////////////////// + /// Y rotation sin-. + //////////////////////////////////////////////////////////////////////////////// + mmReal rRotationYSinM; + //////////////////////////////////////////////////////////////////////////////// + /// Y rotation cos+. + //////////////////////////////////////////////////////////////////////////////// + mmReal rRotationYCosP; + //////////////////////////////////////////////////////////////////////////////// + /// Y rotation cos-. + //////////////////////////////////////////////////////////////////////////////// + mmReal rRotationYCosM; + //////////////////////////////////////////////////////////////////////////////// + /// Z rotation sin+. + //////////////////////////////////////////////////////////////////////////////// + mmReal rRotationZSinP; + //////////////////////////////////////////////////////////////////////////////// + /// Z rotation sin-. + //////////////////////////////////////////////////////////////////////////////// + mmReal rRotationZSinM; + //////////////////////////////////////////////////////////////////////////////// + /// Z rotation cos+. + //////////////////////////////////////////////////////////////////////////////// + mmReal rRotationZCosP; + //////////////////////////////////////////////////////////////////////////////// + /// Z rotation cos-. + //////////////////////////////////////////////////////////////////////////////// + mmReal rRotationZCosM; + } s3DTransformation; + + //////////////////////////////////////////////////////////////////////////////// + /// This structure defines point set. + //////////////////////////////////////////////////////////////////////////////// + typedef struct + { + //////////////////////////////////////////////////////////////////////////////// + /// Vector of pont indexes. + //////////////////////////////////////////////////////////////////////////////// + std::vector vIndexes; + } sFittingPoints; + + //////////////////////////////////////////////////////////////////////////////// + /// Function solves set of linear equations. All fields of table p_sTB have to be + /// non zeros. + /// + /// @param[in] p_psTA input table (size p_iN*p_iN) + /// @param[in,out] p_psTB input/output table (size p_iN) + /// @param[in] p_iN size of tables + //////////////////////////////////////////////////////////////////////////////// + void SolveSetOfLinearEquations(mmReal* p_psTA, + mmReal* p_psTB, + mmInt p_iN); + + //////////////////////////////////////////////////////////////////////////////// + /// Function returns smallest power of 2 but bigger than input number. + /// + /// @param[in] p_iInputValue input number + /// @return bigger smallest power of 2 + //////////////////////////////////////////////////////////////////////////////// + mmInt GetSmallestsBiggerPowerOf2(mmInt p_iInputValue); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates vector product in 3D. + /// + /// @param[in] p_sVec1 input vector 1 + /// @param[in] p_sVec2 input vector 2 + /// @return vector + //////////////////////////////////////////////////////////////////////////////// + mmMath::sPoint3D CalcVectorProduct3D(mmMath::sPoint3D p_sVec1, + mmMath::sPoint3D p_sVec2); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates circle by minimum RMS criterion. + /// + /// @param[in] p_sCircle2DParams calculated params of circle + /// @return circle definition + //////////////////////////////////////////////////////////////////////////////// + mmMath::sCircle2D CalcCircle2DFormulaByMinRMS(sCircle2DCalc p_sCircle2DParams); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates RMS value from set of distances between p_sPoint3D point + /// and each point in vector pointed by p_pvInPoints. + /// + /// @param[in] p_sPoint3D input point, + /// @param[in] p_pvInPoints pointer to vector of points, + /// @return RMS value calculated. + //////////////////////////////////////////////////////////////////////////////// + mmReal CalcPoint3DToPointsRMSError(mmMath::sPoint3D p_sPoint3D, + std::vector* p_pvInPoints); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates RMS value from set of distances between circle center + /// p_sPoint3D point and each point in vector pointed by p_pvInPoints representing + /// points on circumference of a circle. Radius is calculated on base of square + /// root average sum of distances from circle center and rest of points. + /// + /// @param[in] p_sPoint3D circle center, + /// @param[in] p_pvInPoints pointer to vector of points on circumference of a crcle, + /// @return RMS value calculated. + //////////////////////////////////////////////////////////////////////////////// + mmReal CalcCircle3DCenterToPointsRMSError(mmMath::sPoint3D p_sPoint3D, + std::vector* p_pvInPoints); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates formula of circle 3D on base of ponts stored in vector. + /// + /// @param[in] p_pvInPoints pointer to vector of points on circumference of a crcle, + /// @return circle 3D formula calculated. + //////////////////////////////////////////////////////////////////////////////// + mmMath::sCircle3D CalcCircle3DFormulaByMinRMS(std::vector* p_pvInPoints); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates sphere by minimum RMS criterion. + /// + /// @param[in] p_psSphere3DParams calculated params of sphere, + /// @return sphere definition. + //////////////////////////////////////////////////////////////////////////////// + mmMath::sSphere3D CalcSphere3DFormulaByMinRMS(sSphere3DCalc* p_psSphere3DParams); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates sphere by minimum RMS criterion. + /// + /// @param[in] p_pvInPoints pointer to vector of points representing sphere, + /// @return sphere definition. + //////////////////////////////////////////////////////////////////////////////// + mmMath::sSphere3D CalcSphere3DFormulaByMinRMS(std::vector* p_pvInPoints); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates ellipse by minimum RMS criterion. + /// + /// @param[in] p_sEllipse2DParams calculated params of ellipse + /// @return ellipse definition + //////////////////////////////////////////////////////////////////////////////// + mmMath::sEllipse2D CalcEllipse2DFormulaByMinRMS(sEllipse2DCalc p_sEllipse2DParams); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates 2D line formula from two points. + /// + /// @param[in] p_sPoint1 point of line + /// @param[in] p_sPoint2 point of line + /// @return line definition + //////////////////////////////////////////////////////////////////////////////// + mmMath::sLine2D CalcLine2D(mmMath::sPoint2D p_sPoint1, + mmMath::sPoint2D p_sPoint2); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates 3D line formula from two points. + /// + /// @param[in] p_sPoint1 point of line + /// @param[in] p_sPoint2 point of line + /// @return line definition + //////////////////////////////////////////////////////////////////////////////// + mmMath::sLine3D CalcLine3D(mmMath::sPoint3D p_sPoint1, + mmMath::sPoint3D p_sPoint2); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates 3D line formula from many points. If A=B=C=0 then + /// line calculation error. + /// + /// @param[in] p_pvPoints pointer to vector with 3D points, + /// @param[out] p_psLineFormula line formula, + /// @return TRUE if success, FALSE otherwise. + //////////////////////////////////////////////////////////////////////////////// + bool CalcBestLine3D(std::vector* p_pvPoints, + mmMath::sLine3D* p_psLineFormula); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates 3D line formula from precalculated sphere calc params + /// and central point (point of line). + /// + /// @param[in] p_sLineCalcValues precalculated values for line formula calculation, + /// @param[in] p_sCentralPoint point of line (in most cases average point), + /// @param[out] p_psLineFormula line formula, + /// @return TRUE if success, FALSE otherwise + //////////////////////////////////////////////////////////////////////////////// + bool CalcBestLine3D(mmMath::sLine3DCalc p_sLineCalcValues, + mmMath::sPoint3D p_sCentralPoint, + mmMath::sLine3D* p_psLineFormula); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates 3D plane formula from three points. + /// + /// @param[in] p_sPoint1 point of plane + /// @param[in] p_sPoint2 point of plane + /// @param[in] p_sPoint3 point of plane + /// @return plane formula + //////////////////////////////////////////////////////////////////////////////// + mmMath::sPlane3D CalcPlane3D(mmMath::sPoint3D p_sPoint1, + mmMath::sPoint3D p_sPoint2, + mmMath::sPoint3D p_sPoint3); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates 3D plane formula from point and vector. + /// + /// @param[in] p_sPoint point of plane + /// @param[in] p_sVector normal vector of plane + /// @return plane formula + //////////////////////////////////////////////////////////////////////////////// + mmMath::sPlane3D CalcPlane3D(mmMath::sPoint3D p_sPoint, + mmMath::sPoint3D p_sVector); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates 3D plane formula from set of points. + /// + /// @param[in] p_vPoints vector with points for plane calculation + /// @param[out] p_prError if not NULL the plane fitting RMS error + /// @return plane formula + //////////////////////////////////////////////////////////////////////////////// + mmMath::sPlane3D CalcBestPlane3D(std::vector p_vPoints, + mmReal* p_prError = NULL); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates 3D plane formula from set of points. + /// + /// @param[in] p_prInXYZPoints ponter to array of (x,y,z) points for plane calculation + /// @param[in] p_iXYZPointsCount point count n array p_prInXYZPoints + /// @param[out] p_prError if not NULL the plane fitting RMS error + /// @param[out] p_prMaxError if not NULL the plane fitting maximum error + /// @return plane formula + //////////////////////////////////////////////////////////////////////////////// + mmMath::sPlane3D CalcBestPlane3D(mmReal* p_prInXYZPoints, + mmInt p_iXYZPointsCount, + mmReal* p_prError = NULL, + mmReal* p_prMaxError = NULL); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates 3D plane formula from a precalculated structure. + /// + /// @param[in] p_psPlaneCalcParams pointer to precalculated mmMath::sPlane3DCalc + /// structure + /// @return vector with possible plane formulas + //////////////////////////////////////////////////////////////////////////////// + std::vector CalcBestPossiblePlanes3D(mmMath::sPlane3DCalc* p_psPlaneCalcParams); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates 3D point projection on 3D plane. + /// + /// @param[in] p_sPlane3D input plane formula + /// @param[in] p_sPoint3D input point coordinates + /// @return point coordinates + //////////////////////////////////////////////////////////////////////////////// + mmMath::sPoint3D CalcPoint3DProjectionOnPlane3D(mmMath::sPlane3D p_sPlane3D, + mmMath::sPoint3D p_sPoint3D); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates 3D point representing intersection of two 3D lines. + /// In case of not crossed lines the closest point to these two lines is + /// returned. + /// + /// @param[in] p_sLine1 input first line formula + /// @param[in] p_sLine2 input second line formula + /// @param[out] p_psPoint coordnates of calculated point + /// @return TRUE if success, FALSE otherwise + //////////////////////////////////////////////////////////////////////////////// + bool CalcLinesIntersection2D(mmMath::sLine2D p_sLine1, + mmMath::sLine2D p_sLine2, + mmMath::sPoint2D* p_psPoint); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates two points from two lines. These points are closest + /// to other line and laying on one line. + /// + /// @param[in] p_sLine1 first line + /// @param[in] p_sLine2 second line + /// @param[out] p_psPointOnLine1 resultant point from line 1 + /// @param[out] p_psPointOnLine2 resultant point from line 2 + /// @return TRUE if success, FALSE otherwise + //////////////////////////////////////////////////////////////////////////////// + bool CalcLineToLineClosestPoints(mmMath::sLine3D p_sLine1, + mmMath::sLine3D p_sLine2, + mmMath::sPoint3D* p_psPointOnLine1, + mmMath::sPoint3D* p_psPointOnLine2); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates 3D distance between line and point. + /// + /// @param[in] p_sPoint point + /// @param[in] p_sLine line + /// @return distance + //////////////////////////////////////////////////////////////////////////////// + mmReal CalcPointToLineDistance3D(mmMath::sPoint3D p_sPoint, + mmMath::sLine3D p_sLine); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates 3D distance between plane and point. + /// + /// @param[in] p_sPoint3D point + /// @param[in] p_sPlane3D line + /// @return distance + //////////////////////////////////////////////////////////////////////////////// + mmReal CalcPointToPlaneDistance3D(mmMath::sPoint3D p_sPoint3D, + mmMath::sPlane3D p_sPlane3D); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates 3D point projection on 3D line. + /// + /// @param[in] p_sPoint input point coordinates + /// @param[in] p_sLine input line formula + /// @return point coordinates + //////////////////////////////////////////////////////////////////////////////// + mmMath::sPoint3D CalcPoint3DProjectionOnLine3D(mmMath::sPoint3D p_sPoint, + mmMath::sLine3D p_sLine); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates 3D distance between point and point. + /// + /// @param[in] p_sPoint1 point 1 + /// @param[in] p_sPoint2 point 2 + /// @return distance + //////////////////////////////////////////////////////////////////////////////// + mmReal CalcPointToPointDistance3D(mmMath::sPoint3D p_sPoint1, + mmMath::sPoint3D p_sPoint2); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates 3D distance between point and point. + /// + /// @param[in] p_rPoint1X point 1 x coord + /// @param[in] p_rPoint1Y point 1 y coord + /// @param[in] p_rPoint1Z point 1 z coord + /// @param[in] p_sPoint2X point 2 x coord + /// @param[in] p_sPoint2Y point 2 y coord + /// @param[in] p_sPoint2Z point 2 z coord + /// @return distance + //////////////////////////////////////////////////////////////////////////////// + mmReal CalcPointToPointDistance3D(mmReal p_rPoint1X, + mmReal p_rPoint1Y, + mmReal p_rPoint1Z, + mmReal p_rPoint2X, + mmReal p_rPoint2Y, + mmReal p_rPoint2Z); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates 3D vector length. + /// + /// @param[in] p_sVector vector coordinates + /// @return vector length + //////////////////////////////////////////////////////////////////////////////// + mmReal CalcVector3DLength(mmMath::sPoint3D p_sVector); + + //////////////////////////////////////////////////////////////////////////////// + /// Function normalizes coordinates of 3D vector. + /// + /// @param[in] p_sInVector input vector coordinates + /// @return normalzed vector + //////////////////////////////////////////////////////////////////////////////// + mmMath::sPoint3D NormalizeVector3D(mmMath::sPoint3D p_sInVector); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates point after transformation. + /// + /// @param[in] p_psPoint pointer to point + /// @param[in] p_psTransformation pointer to transformation matrix + /// @return calculated point + //////////////////////////////////////////////////////////////////////////////// + mmMath::sPoint3D TransformPoint(mmMath::sPoint3D* p_psPoint, + mmMath::s3DTransformation* p_psTransformation); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates point after transformation using pre-calculated rotations. + /// + /// @param[in] p_psPoint pointer to point + /// @param[in] p_psTransformation pointer to transformation matrix + /// @return calculated point + //////////////////////////////////////////////////////////////////////////////// + mmMath::sPoint3D TransformPointFast(mmMath::sPoint3D* p_psPoint, + mmMath::s3DTransformation* p_psTransformation); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates point after inverse transformation. + /// + /// @param[in] p_psPoint pointer to point + /// @param[in] p_psTransformation pointer to transformation matrix + /// @return calculated point + //////////////////////////////////////////////////////////////////////////////// + mmMath::sPoint3D UntransformPoint(mmMath::sPoint3D* p_psPoint, + mmMath::s3DTransformation* p_psTransformation); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates vector after rotations from transformation. + /// + /// @param[in] p_psVector pointer to vector + /// @param[in] p_psTransformation pointer to transformation matrix + /// @return calculated vector + //////////////////////////////////////////////////////////////////////////////// + mmMath::sPoint3D TransformVector(mmMath::sPoint3D* p_psVector, + mmMath::s3DTransformation* p_psTransformation); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates vector after inverse rotations from transformation. + /// + /// @param[in] p_psVector pointer to vector + /// @param[in] p_psTransformation pointer to transformation matrix + /// @return calculated vector + //////////////////////////////////////////////////////////////////////////////// + mmMath::sPoint3D UntransformVector(mmMath::sPoint3D* p_psVector, + mmMath::s3DTransformation* p_psTransformation); + + //////////////////////////////////////////////////////////////////////////////// + /// Function transforms vector from local to global coords according to + /// defined axes of global coordinate set. + /// + /// @param[in] p_sGlobalXAxis vector with X axis of global coord set + /// @param[in] p_sGlobalYAxis vector with Y axis of global coord set + /// @param[in] p_sGlobalZAxis vector with Z axis of global coord set + /// @param[in] p_sLocalVector vector in local coords to transform + /// @return calculated vector in global coords + //////////////////////////////////////////////////////////////////////////////// + mmMath::sPoint3D CalcVectorInGlobalCoords(mmMath::sPoint3D p_sGlobalXAxis, + mmMath::sPoint3D p_sGlobalYAxis, + mmMath::sPoint3D p_sGlobalZAxis, + mmMath::sPoint3D p_sLocalVector); + + //////////////////////////////////////////////////////////////////////////////// + /// Function transforms vector from global to local coords according to + /// defined axes of global coordinate set. + /// + /// @param[in] p_sGlobalXAxis vector with X axis of global coord set + /// @param[in] p_sGlobalYAxis vector with Y axis of global coord set + /// @param[in] p_sGlobalZAxis vector with Z axis of global coord set + /// @param[in] p_sGlobalVector vector in global coords to transform + /// @return calculated vector in local coords + //////////////////////////////////////////////////////////////////////////////// + mmMath::sPoint3D CalcVectorInLocalCoords(mmMath::sPoint3D p_sGlobalXAxis, + mmMath::sPoint3D p_sGlobalYAxis, + mmMath::sPoint3D p_sGlobalZAxis, + mmMath::sPoint3D p_sGlobalVector); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates error from p_vStablePoints to p_vToFitPoints + /// using min RMS criterion. + /// + /// @param[in] p_pvStablePoints pointer to set of stable points + /// @param[in] p_pvToFitPoints pointer to set of points to transform + /// @param[in] p_psTransformation pointer to transformation matrix + /// @return calculated error + //////////////////////////////////////////////////////////////////////////////// + mmReal CalcPointsToPointsMinRMSError(std::vector* p_pvStablePoints, + std::vector* p_pvToFitPoints, + mmMath::s3DTransformation* p_psTransformation); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates best translation (with minimal RMS error) between + /// groups of points with threshold distance. + /// + /// @param[in] p_pvStablePoints pointer to set of stable points + /// @param[in] p_pvToFitPoints pointer to set of points to transform + /// @param[in] p_psTransformation pointer to transformation matrix + /// @param[in] p_rIterationDist transformation distance threshold + /// @return calculated error + //////////////////////////////////////////////////////////////////////////////// + mmReal CalcPointsToPointsBestTranslation(std::vector* p_pvStablePoints, + std::vector* p_pvToFitPoints, + mmMath::s3DTransformation* p_psTransformation, + mmReal p_rIterationDist); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates translation between first points in vectors after + /// transformation. + /// + /// @param[in] p_pvStablePoints pointer to set of stable points + /// @param[in] p_pvToFitPoints pointer to set of points to transform + /// @param[in] p_psTransformation pointer to transformation matrix + /// @return calculated error + //////////////////////////////////////////////////////////////////////////////// + mmReal CalcFirstPointsTranslation(std::vector* p_pvStablePoints, + std::vector* p_pvToFitPoints, + mmMath::s3DTransformation* p_psTransformation); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates simple transformation from p_vStablePoints to p_vToFitPoints + /// using first three poits angles criterion. + /// + /// @param[in] p_vStablePoints set of stable points + /// @param[in] p_vToFitPoints set of points to transform + /// @param[in] p_rIterValue iteration value in [mm] + /// @param[out] p_prFittingError if not NULL then fttng RMS error is returned + /// @return calculated transformation + //////////////////////////////////////////////////////////////////////////////// + mmMath::s3DTransformation CalcInitialPointsToPointsTransformation(std::vector p_vStablePoints, + std::vector p_vToFitPoints, + mmReal p_rIterValue = 1.0, + mmReal* p_prFittingError = NULL); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates transformation from p_vStablePoints to p_vToFitPoints + /// using min RMS criterion. + /// + /// @param[in] p_vStablePoints set of stable points + /// @param[in] p_vToFitPoints set of points to transform + /// @param[in] p_rMaxIterValue maximum iteration value in [mm] + /// @param[in] p_rMinIterValue minimum iteration value in [mm] + /// @param[in] p_bLockTranslations if equal to TRUE then translationa are locked + /// @param[in] p_psInitialTransformation initial transformation for iterations + /// @param[out] p_prFittingError if not NULL then fttng RMS error is returned + /// @return calculated transformation + //////////////////////////////////////////////////////////////////////////////// + mmMath::s3DTransformation CalcPointsToPointsTransformation(std::vector p_vStablePoints, + std::vector p_vToFitPoints, + mmReal p_rMaxIterValue = 5.0, + mmReal p_rMinIterValue = 0.000001, + bool p_bLockTranslations = false, + mmMath::s3DTransformation* p_psInitialTransformation = NULL, + mmReal* p_prFittingError = NULL); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates transformation from p_vStablePoints to p_vToFitPoints + /// with assumption that points representing a rigid body. It uses min RMS + /// criterion. + /// + /// @param[in] p_vStablePoints set of stable points + /// @param[in] p_vToFitPoints set of points to transform + /// @param[in] p_rMaxIterValue maximum iteration value in [mm] + /// @param[in] p_rMinIterValue minimum iteration value in [mm] + /// @param[in] p_psInitialTransformation initial transformation for iterations + /// @param[out] p_prFittingError if not NULL then fttng RMS error is returned + /// @return calculated transformation + //////////////////////////////////////////////////////////////////////////////// + mmMath::s3DTransformation CalcRigidBodyTransformation(std::vector p_vStablePoints, + std::vector p_vToFitPoints, + mmReal p_rMaxIterValue = 5.0, + mmReal p_rMinIterValue = 0.000001, + mmMath::s3DTransformation* p_psInitialTransformation = NULL, + mmReal* p_prFittingError = NULL); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates transformation from p_sStableVector to p_sToFitVector + /// with assumption that only rotations are used. + /// + /// @param[in] p_sStableVector stable vector + /// @param[in] p_sToFitVector to transform vector + /// @param[in] p_bLockXRotation defines if X rotation is used + /// @param[in] p_bLockYRotation defines if Y rotation is used + /// @param[in] p_bLockZRotation defines if Z rotation is used + /// @param[in] p_rMaxIterValueInDeg maximum iteration value in [deg] + /// @param[in] p_rMinIterValueInDeg minimum iteration value in [deg] + /// @param[out] p_prFittingError if not NULL then error is returned + /// @return calculated transformation + //////////////////////////////////////////////////////////////////////////////// + mmMath::s3DTransformation CalcVectorToVectorTransformation(mmMath::sPoint3D p_sStableVector, + mmMath::sPoint3D p_sToFitVector, + bool p_bLockXRotation = false, + bool p_bLockYRotation = false, + bool p_bLockZRotation = false, + mmReal p_rMaxIterValueInDeg = 5.0, + mmReal p_rMinIterValueInDeg = 0.0000001, + mmReal* p_prFittingError = NULL); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates plane and line intersection in 3D. + /// + /// @param[in] p_sPlane plane formula + /// @param[in] p_sLine line formula + /// @return calculated point + //////////////////////////////////////////////////////////////////////////////// + mmMath::sPoint3D CalcPlaneAndLineIntersection3D(mmMath::sPlane3D p_sPlane, + mmMath::sLine3D p_sLine); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates 3 order polynomial X to Y. + /// + /// @param[in] p_sInValues plane formula + /// @return definition of polynomial + //////////////////////////////////////////////////////////////////////////////// + mmMath::s3OrderPolynomialXtoY Calc3OrderPolynomialYtoY(mmMath::s3OrderPolynomialXtoYCalc p_sInValues); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates if 2D point is located inside rectangle 2D. + /// + /// @param[in] p_sPoint11 point 1 coordinates + /// @param[in] p_sPoint12 point 2 coordinates + /// @param[in] p_sPoint21 point 3 coordinates + /// @param[in] p_sPoint22 point 4 coordinates + /// @param[in] p_sPoint coordinates of calculated point + /// @return TRUE if it is inside, FALSE otherwise + //////////////////////////////////////////////////////////////////////////////// + bool IsPointInsideRectangle2D(mmMath::sPoint2D p_sPoint11, + mmMath::sPoint2D p_sPoint12, + mmMath::sPoint2D p_sPoint21, + mmMath::sPoint2D p_sPoint22, + mmMath::sPoint2D p_sPoint); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates linear weights of pont inside rectangle. + /// + /// @param[in] p_sPoint11 point 1 coordinates + /// @param[in] p_sPoint12 point 2 coordinates + /// @param[in] p_sPoint21 point 3 coordinates + /// @param[in] p_sPoint22 point 4 coordinates + /// @param[in] p_sPoint coordinates of calculated point + /// @param[out] p_prWeightX pointer to resulting X coords weight + /// @param[out] p_prWeightY pointer to resulting Y coords weight + //////////////////////////////////////////////////////////////////////////////// + void CalcXYWeightsFromRectangle2D(mmMath::sPoint2D p_sPoint11, + mmMath::sPoint2D p_sPoint12, + mmMath::sPoint2D p_sPoint21, + mmMath::sPoint2D p_sPoint22, + mmMath::sPoint2D p_sPoint, + mmReal* p_prWeightX, + mmReal* p_prWeightY); + + //////////////////////////////////////////////////////////////////////////////// + /// Function searches for largest group of points in two sets. Criterion of + /// selection is based on rule that all distances between ponts insode group + /// should be the same for both sets with accuracy less than p_rDistanceThreshold. + /// + /// @param[in] p_pv1stGroupOfPoints pointer to vector with 1st group + /// @param[in] p_pv2ndGroupOfPoints pointer to vector with 2nd group + /// @param[in] p_rDistanceThreshold distance threshold + /// @param[out] p_pvFoundPointIndexes pointer to vector which stores indexes + /// of largest group points + /// @return number of points in largest group + //////////////////////////////////////////////////////////////////////////////// + mmInt FindLargerGroupOfFittingPointsFromOrderedGroups(std::vector* p_pv1stGroupOfPoints, + std::vector* p_pv2ndGroupOfPoints, + mmReal p_rDistanceThreshold, + std::vector* p_pvFoundPointIndexes); + + //////////////////////////////////////////////////////////////////////////////// + /// Function calculates angle between two 3D vectors. + /// + /// @param[in] p_psP3D1 pointer to normalized vector 1 + /// @param[in] p_psP3D2 pointer to normalized vector 2 + /// @return angle in degrees between vectors + //////////////////////////////////////////////////////////////////////////////// + mmReal CalcNormalizedVector3DToNormalizedVector3DAngle(mmMath::sPoint3D* p_psP3D1, + mmMath::sPoint3D* p_psP3D2); +}; + +#endif diff --git a/include/mmCalcMethod.h b/include/mmCalcMethod.h new file mode 100644 index 0000000..0b1d471 --- /dev/null +++ b/include/mmCalcMethod.h @@ -0,0 +1,95 @@ +#pragma once + +#include +#include + +namespace mmImages { + + class mmCalcKernelI; + + class mmCMParameter + { + public: + mmCMParameter(): m_sName(L""), + m_eType(mmXML::g_eXMLUnknownDataType), + m_bIsOutput(false) { } + mmCMParameter(mmString p_sName, + mmXML::mmXMLDataType p_eType, + void* p_psValue, + bool p_bIsOutput = false) + { + m_sName = p_sName; + m_eType = p_eType; + m_bIsOutput = p_bIsOutput; + + switch (m_eType) { + case mmXML::g_eXMLReal: + m_pValue.reset(new mmReal(*reinterpret_cast(p_psValue))); + break; + case mmXML::g_eXMLInt: + m_pValue.reset(new mmInt(*reinterpret_cast(p_psValue))); + break; + case mmXML::g_eXMLString: + case mmXML::g_eXMLImageName: + case mmXML::g_eXMLDataLayerName: + m_pValue.reset(new mmString(*reinterpret_cast(p_psValue))); + break; + case mmXML::g_eXMLBool: + m_pValue.reset(new bool(*reinterpret_cast(p_psValue))); + break; + } + } + ~mmCMParameter() { } + + mmString m_sName; + mmXML::mmXMLDataType m_eType; + mmXML::mmXMLNodePosition m_sPosition; + std::tr1::shared_ptr m_pValue; + bool m_bIsOutput; + }; + + class mmCalcMethod: public mmImagesCalculationMethodI, + public mmCalcMethodExtI, + public mmLog::mmLogSender + { + protected: // methods + virtual bool Calculate() = 0; + virtual void ExecBeforeSingleImageCalc(mmImageI* p_psCurrentImage) = 0; + virtual void ExecAfterSingleImageCalc(mmImageI* p_psCurrentImage) = 0; + virtual void RetrieveParameters() = 0; + + virtual void ForEachImage(mmCalcKernelI* p_psKernel); + virtual void SetParam(mmString p_sName, mmXML::mmXMLDataType p_eType, void* p_psValue, bool p_bIsOutput = false); + virtual const void* GetParam(mmString p_sName); + virtual void GetParam(mmString p_sName, void* p_pValue); + virtual void UpdateParameters(); + virtual std::vector GetImageNames(); + virtual std::vector GetDLNames(mmUInt const p_iImage); + + private: // fields + mmReal m_rProgress; + mmInt m_iThreadsCount; + bool m_bIsExecuting; + bool m_bStopExecution; + bool m_bFinishImage; + std::vector m_vParameters; + std::map m_mNextRows; // next available row for each image in structure which is identified by name + + private: + mmImages::mmImagesCalculationMethodI::sCalculationMethodParams GetCalculationMethodInfo(void); + void SetCalculationMethodParameters(mmImages::mmImageStructureI* p_psImageStructure, mmImages::mmImagesCalculationMethodI::sCalculationAutomationParams* p_psAutomationParams = NULL); + + void UserAction(mmString p_sXMLParams); + void UserAction(wchar_t* p_pcXMLParamsBuffer, mmInt p_iXMLParamsBufferSize); + + bool Execute(void); + void StopExecution(void); + bool IsExecuting(void); + mmReal GetProgress(void); + + public: // methods + mmCalcMethod(mmLog::mmLogReceiverI *p_psLogReceiver = NULL, + mmString p_sClassName = L""); + virtual ~mmCalcMethod(); + }; +}; diff --git a/include/mmError.h b/include/mmError.h new file mode 100644 index 0000000..257e909 --- /dev/null +++ b/include/mmError.h @@ -0,0 +1,227 @@ +//****************************************************************************** +//****************************************************************************** +// +// Error codes support +// +// Description: Definition of error suport class. +// +//****************************************************************************** +//****************************************************************************** +#ifndef mmErrorH +#define mmErrorH + +#include + +//////////////////////////////////////////////////////////////////////////////// +/// Base class for error description. +//////////////////////////////////////////////////////////////////////////////// +class mmError +{ + private: // fields + //////////////////////////////////////////////////////////////////////////////// + /// Error ID. + //////////////////////////////////////////////////////////////////////////////// + mmInt m_iErrorID; + public: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Constructor requires error ID. + /// + /// @param[in] p_iErrID – error identifier. + //////////////////////////////////////////////////////////////////////////////// + mmError(mmInt p_iErrID); + + //////////////////////////////////////////////////////////////////////////////// + /// Returns error code. + /// + /// @return error code. + //////////////////////////////////////////////////////////////////////////////// + mmInt GetErrorCode(void); + + //////////////////////////////////////////////////////////////////////////////// + /// Returns error string. + //////////////////////////////////////////////////////////////////////////////// + mmString GetErrorString(void); +}; + +//////////////////////////////////////////////////////////////////////////////// +/// Unknown error. +//////////////////////////////////////////////////////////////////////////////// +#define mmeUnknownError 20000 +//////////////////////////////////////////////////////////////////////////////// +/// Allocation error. +//////////////////////////////////////////////////////////////////////////////// +#define mmeBadAlloc 20001 +//////////////////////////////////////////////////////////////////////////////// +/// Input string for processing is too short. +//////////////////////////////////////////////////////////////////////////////// +#define mmeInputStringIsTooSmall 20002 +//////////////////////////////////////////////////////////////////////////////// +/// Log receiver object is already registered in log redirector. +//////////////////////////////////////////////////////////////////////////////// +#define mmeLogReceiverObjectAlreadyRegistered 20003 +//////////////////////////////////////////////////////////////////////////////// +/// Log receiver object is not registered in log redirector. +//////////////////////////////////////////////////////////////////////////////// +#define mmeLogReceiverObjectIsNotRegistered 20004 +//////////////////////////////////////////////////////////////////////////////// +/// Thread throws this error when creation of thread fails. +//////////////////////////////////////////////////////////////////////////////// +#define mmeThreadCreateThreadError 20008 +//////////////////////////////////////////////////////////////////////////////// +/// Thread can't register execution class because thread state is inapriopriate. +//////////////////////////////////////////////////////////////////////////////// +#define mmeThreadCantRegisterExecutionClass 20009 +//////////////////////////////////////////////////////////////////////////////// +/// Thread resume error. +//////////////////////////////////////////////////////////////////////////////// +#define mmeThreadResumeError 20010 +//////////////////////////////////////////////////////////////////////////////// +/// Bad thread state for run. +//////////////////////////////////////////////////////////////////////////////// +#define mmeThreadBadThreadState 20011 +//////////////////////////////////////////////////////////////////////////////// +/// Unknown thread state occurs. +//////////////////////////////////////////////////////////////////////////////// +#define mmeThreadUnknownThreadState 20012 +//////////////////////////////////////////////////////////////////////////////// +/// Error occurs when ExclusiveLock is deleted and his state is still locked. +//////////////////////////////////////////////////////////////////////////////// +#define mmeExclusiveLockLocked 20100 +//////////////////////////////////////////////////////////////////////////////// +/// Error occurs when ExclusiveLock is Unlocked and his state is unlocked already. +//////////////////////////////////////////////////////////////////////////////// +#define mmeExclusiveLockUnlocked 20101 +//////////////////////////////////////////////////////////////////////////////// +/// Error occurs when ReadWriteLock is deleted and his state is still locked. +//////////////////////////////////////////////////////////////////////////////// +#define mmeReadWriteLockBadEndLockCount 20102 +//////////////////////////////////////////////////////////////////////////////// +/// Error occurs when ReadWriteLock is deleted and some object waits for write +/// access. +//////////////////////////////////////////////////////////////////////////////// +#define mmeReadWriteLockWaitForWrite 20103 +//////////////////////////////////////////////////////////////////////////////// +/// Error occurs when ReadWriteLock is unlocked from read and read state is +/// unlocked already. +//////////////////////////////////////////////////////////////////////////////// +#define mmeReadWriteLockReadUnlocked 20104 +//////////////////////////////////////////////////////////////////////////////// +/// Error occurs when ReadWriteLock is unlocked from write and write state is +/// unlocked already. +//////////////////////////////////////////////////////////////////////////////// +#define mmeReadWriteLockWriteUnlocked 20105 + +//////////////////////////////////////////////////////////////////////////////// +/// Unknown error of file access/creation/delete occurs. +//////////////////////////////////////////////////////////////////////////////// +#define mmeFileIOUnknownError 20200 +//////////////////////////////////////////////////////////////////////////////// +/// During file/directory creation/access of unexisting path/file occurs. +//////////////////////////////////////////////////////////////////////////////// +#define mmeFileIONoSuchFileOrDirectory 20201 +//////////////////////////////////////////////////////////////////////////////// +/// During file/directory access/creation/delete permission error occurs. +//////////////////////////////////////////////////////////////////////////////// +#define mmeFileIOPermissionToFileDenied 20202 +//////////////////////////////////////////////////////////////////////////////// +/// During temporary directory search error occurs. +//////////////////////////////////////////////////////////////////////////////// +#define mmeFileIONoTemporaryDirectory 20203 +//////////////////////////////////////////////////////////////////////////////// +/// During file opening error occurs. +//////////////////////////////////////////////////////////////////////////////// +#define mmeFileIOCantOpenFile 20204 +//////////////////////////////////////////////////////////////////////////////// +/// During file operation, file is not opened, yet. +//////////////////////////////////////////////////////////////////////////////// +#define mmeFileIOFileIsNotOpened 20205 +//////////////////////////////////////////////////////////////////////////////// +/// Error during file reading. +//////////////////////////////////////////////////////////////////////////////// +#define mmeFileIOCantReadFromFile 20206 +//////////////////////////////////////////////////////////////////////////////// +/// Error during file writing. +//////////////////////////////////////////////////////////////////////////////// +#define mmeFileIOCantWriteToFile 20207 +//////////////////////////////////////////////////////////////////////////////// +/// Error during file position setting. +//////////////////////////////////////////////////////////////////////////////// +#define mmeFileIOBadFilePosition 20208 + +//////////////////////////////////////////////////////////////////////////////// +/// Error during operation on attribute. No such attribute. +//////////////////////////////////////////////////////////////////////////////// +#define mmeXMLNoSuchAttribute 20300 +//////////////////////////////////////////////////////////////////////////////// +/// Error during operation on node. No such node. +//////////////////////////////////////////////////////////////////////////////// +#define mmeXMLNoSuchNode 20301 +//////////////////////////////////////////////////////////////////////////////// +/// Error during parsing XML representation. +//////////////////////////////////////////////////////////////////////////////// +#define mmeXMLParseError 20302 +//////////////////////////////////////////////////////////////////////////////// +/// Error during using XML structure. Invalid structure. +//////////////////////////////////////////////////////////////////////////////// +#define mmeXMLBadXMLStructure 20303 + +//////////////////////////////////////////////////////////////////////////////// +/// Error during reading pixel format - unknown format. +//////////////////////////////////////////////////////////////////////////////// +#define mmeImageProcessingUnknownPixelType 20500 +//////////////////////////////////////////////////////////////////////////////// +/// Error during loading bitmap file, bad format. +//////////////////////////////////////////////////////////////////////////////// +#define mmeImageProcessingBadBitmapPixelFormat 20501 + + +//////////////////////////////////////////////////////////////////////////////// +/// Unknown Images calculation method +//////////////////////////////////////////////////////////////////////////////// +#define mmeImagesStructureUnknownImagesCalculationMethod 30001 +//////////////////////////////////////////////////////////////////////////////// +/// Cannot add new data layer into empty structure +//////////////////////////////////////////////////////////////////////////////// +#define mmeImageStructureCantAddNewDataLayerIntoEmptyStructure 30002 +//////////////////////////////////////////////////////////////////////////////// +/// User wanted to get data from non-existing channel +//////////////////////////////////////////////////////////////////////////////// +#define mmeImageStructureNoChannel 30003 +//////////////////////////////////////////////////////////////////////////////// +/// There is no such datalayer +//////////////////////////////////////////////////////////////////////////////// +#define mmeImageStructureNoSuchAdditionalDataLayer 30004 +#define mmeHardwareBadRangeForParamsValue 20401 + +#define mmeHardwareCantCapture 20402 +//////////////////////////////////////////////////////////////////////////////// +/// Error during image reading from detector, index out of range. +//////////////////////////////////////////////////////////////////////////////// +#define mmeHardwareImageOutOfRange 20403 +//////////////////////////////////////////////////////////////////////////////// +/// Error during initialisation of hardware component. +//////////////////////////////////////////////////////////////////////////////// +#define mmeHardwareInitialisationError 20404 +//////////////////////////////////////////////////////////////////////////////// +/// Error during accessing hardware when it is not initialized. +//////////////////////////////////////////////////////////////////////////////// +#define mmeHardwareNotInitialised 20405 +//////////////////////////////////////////////////////////////////////////////// +/// Error in detector name for initialization. +//////////////////////////////////////////////////////////////////////////////// +#define mmeHardwareUnknownDetector 20406 +//////////////////////////////////////////////////////////////////////////////// +/// Error in projector name for initialization. +//////////////////////////////////////////////////////////////////////////////// +#define mmeHardwareUnknownProjector 20407 +//////////////////////////////////////////////////////////////////////////////// +/// Error in manipulator name for initialization. +//////////////////////////////////////////////////////////////////////////////// +#define mmeHardwareUnknownManipulator 20408 +//////////////////////////////////////////////////////////////////////////////// +/// Error during setting hardware parameters +//////////////////////////////////////////////////////////////////////////////// +#define mmeHardwareCantSetParameter 20409 + + +#endif diff --git a/include/mmGlobalDefs.h b/include/mmGlobalDefs.h new file mode 100644 index 0000000..3386b98 --- /dev/null +++ b/include/mmGlobalDefs.h @@ -0,0 +1,42 @@ +//****************************************************************************** +//****************************************************************************** +// +// +// +//****************************************************************************** +//****************************************************************************** +#ifndef mmGlobalDefsH +#define mmGlobalDefsH + +#include + +//////////////////////////////////////////////////////////////////////////////// +/// Definition of type representing real value +//////////////////////////////////////////////////////////////////////////////// +typedef double mmReal; + +//////////////////////////////////////////////////////////////////////////////// +/// Definition of type representing real(float) value +//////////////////////////////////////////////////////////////////////////////// +typedef float mmFloat; + +//////////////////////////////////////////////////////////////////////////////// +/// Definition of type representing integer value +//////////////////////////////////////////////////////////////////////////////// +typedef int mmInt; + +typedef unsigned mmUInt; + +typedef struct { + mmUInt iLeft; + mmUInt iTop; + mmUInt iWidth; + mmUInt iHeight; +} mmRect; + +//////////////////////////////////////////////////////////////////////////////// +/// Definition of type representing std::string value +//////////////////////////////////////////////////////////////////////////////// +typedef std::wstring mmString; + +#endif diff --git a/include/mmInterfaceInitializers.h b/include/mmInterfaceInitializers.h new file mode 100644 index 0000000..9a04ed9 --- /dev/null +++ b/include/mmInterfaceInitializers.h @@ -0,0 +1,148 @@ +//****************************************************************************** +//****************************************************************************** +// +// Interface initalizers +// +// +// Description: Set of functions for unified interface initialization. +// +//****************************************************************************** +//****************************************************************************** +#ifndef mmInterfaceInitializersH +#define mmInterfaceInitializersH + +#include +#include +#include +#include + +#include +#include + +//////////////////////////////////////////////////////////////////////////////// +/// Namespace for interface initializers. +//////////////////////////////////////////////////////////////////////////////// +namespace mmInterfaceInitializers +{ + //////////////////////////////////////////////////////////////////////////////// + /// Initializes interface mmSynchronize::mmExclusiveLockI. In case of bad alloc + /// error throws mmError(mmeBadAlloc). + /// + /// @param[in] p_psLogReceiver pointer to log object + /// @return pointer to initialized object + //////////////////////////////////////////////////////////////////////////////// + mmSynchronize::mmExclusiveLockI* CreateExclusiveLock(mmLog::mmLogReceiverI* p_psLogReceiver = NULL); + + //////////////////////////////////////////////////////////////////////////////// + /// Initializes interface mmSynchronize::mmReadWriteLockI. In case of + /// bad alloc error throws mmError(mmeBadAlloc). + /// + /// @param[in] p_psLogReceiver pointer to log object + /// @return pointer to initialized object + //////////////////////////////////////////////////////////////////////////////// + mmSynchronize::mmReadWriteLockI* CreateReadWriteLock(mmLog::mmLogReceiverI* p_psLogReceiver = NULL); + + //////////////////////////////////////////////////////////////////////////////// + /// Initializes interface mmFileIO::mmFileUtilsI. In case of + /// bad alloc error throws mmError(mmeBadAlloc). + /// + /// @param[in] p_psLogReceiver pointer to log object + /// @return pointer to initialized object + //////////////////////////////////////////////////////////////////////////////// + mmFileIO::mmFileUtilsI* CreateFileUtils(mmLog::mmLogReceiverI* p_psLogReceiver = NULL); + + //////////////////////////////////////////////////////////////////////////////// + /// Initializes interface mmFileIO::mmTextFileReadI. In case of + /// bad alloc error throws mmError(mmeBadAlloc). + /// + /// @param[in] p_psLogReceiver pointer to log object + /// @return pointer to initialized object + //////////////////////////////////////////////////////////////////////////////// + mmFileIO::mmTextFileReadI* CreateTextFileForRead(mmLog::mmLogReceiverI* p_psLogReceiver = NULL); + + //////////////////////////////////////////////////////////////////////////////// + /// Initializes interface mmFileIO::mmBinaryFileReadI. In case of + /// bad alloc error throws mmError(mmeBadAlloc). + /// + /// @param[in] p_psLogReceiver pointer to log object + /// @return pointer to initialized object + //////////////////////////////////////////////////////////////////////////////// + mmFileIO::mmBinaryFileReadI* CreateBinaryFileForRead(mmLog::mmLogReceiverI* p_psLogReceiver = NULL); + + //////////////////////////////////////////////////////////////////////////////// + /// Initializes interface mmFileIO::mmTextFileWriteI. In case of + /// bad alloc error throws mmError(mmeBadAlloc). + /// + /// @param[in] p_psLogReceiver pointer to log object + /// @return pointer to initialized object + //////////////////////////////////////////////////////////////////////////////// + mmFileIO::mmTextFileWriteI* CreateTextFileForWrite(mmLog::mmLogReceiverI* p_psLogReceiver = NULL); + + //////////////////////////////////////////////////////////////////////////////// + /// Initializes interface mmFileIO::mmBinaryFileWriteI. In case of + /// bad alloc error throws mmError(mmeBadAlloc). + /// + /// @param[in] p_psLogReceiver pointer to log object + /// @return pointer to initialized object + //////////////////////////////////////////////////////////////////////////////// + mmFileIO::mmBinaryFileWriteI* CreateBinaryFileForWrite(mmLog::mmLogReceiverI* p_psLogReceiver = NULL); + + //////////////////////////////////////////////////////////////////////////////// + /// Initializes interface mmLog::mmLogReceiverI. In case of + /// bad alloc error throws mmError(mmeBadAlloc). + /// + /// @param[in] p_sLogFileName name of log file + /// @return pointer to initialized object + //////////////////////////////////////////////////////////////////////////////// + mmLog::mmLogReceiverI* CreateLogFile(mmString p_sLogFileName); + + //////////////////////////////////////////////////////////////////////////////// + /// Initializes interface mmXML::mmXMLDocI. In case of + /// bad alloc error throws mmError(mmeBadAlloc). + /// + /// @param[in] p_psLogReceiver pointer to log object + /// @return pointer to initialized object + //////////////////////////////////////////////////////////////////////////////// + mmXML::mmXMLDocI* CreateXMLDocument(mmLog::mmLogReceiverI* p_psLogReceiver = NULL); + + //////////////////////////////////////////////////////////////////////////////// + /// Initializes interface mmXML::mmXMLNodeI. In case of + /// bad alloc error throws mmError(mmeBadAlloc). + /// + /// @param[in] p_psLogReceiver pointer to log object + /// @return pointer to initialized object + //////////////////////////////////////////////////////////////////////////////// + mmXML::mmXMLNodeI* CreateXMLNode(mmLog::mmLogReceiverI* p_psLogReceiver = NULL); + + //////////////////////////////////////////////////////////////////////////////// + /// Initializes interface mmThread::mmThreadI. In case of + /// bad alloc error throws mmError(mmeBadAlloc). + /// + /// @param[in] p_psLogReceiver pointer to log object + /// @return pointer to initialized object + //////////////////////////////////////////////////////////////////////////////// + mmThread::mmThreadI* CreateDefaultThread(mmLog::mmLogReceiverI* p_psLogReceiver = NULL); + + //////////////////////////////////////////////////////////////////////////////// + /// Initializes interface mmImages::mmImagesStructureI. In case of + /// bad alloc error throws mmError(mmeBadAlloc). + /// + /// @param[in] p_psLogReceiver pointer to log object + /// @return pointer to initialized object + //////////////////////////////////////////////////////////////////////////////// + mmImages::mmImageStructureI* CreateDefaultImageStructure(mmImages::mmImageI::mmCallbackI * p_psCallback, + mmLog::mmLogReceiverI* p_psLogReceiver); + + //////////////////////////////////////////////////////////////////////////////// + /// Initializes interface mmImages::mmImagesCalculationMethodContainerI. + /// In case of bad alloc error throws mmError(mmeBadAlloc). + /// + /// @param[in] p_psUIMainWindow pointer to UI main window object + /// @param[in] p_psLogReceiver pointer to log object + /// @return pointer to initialized object + //////////////////////////////////////////////////////////////////////////////// + mmImages::mmImagesCalculationMethodContainerI* CreateDefaultImagesCalculationMethodContainer(mmLog::mmLogReceiverI* p_psLogReceiver = NULL); + +}; + +#endif diff --git a/include/mmOperatingSystemCalls.h b/include/mmOperatingSystemCalls.h new file mode 100644 index 0000000..49bfb11 --- /dev/null +++ b/include/mmOperatingSystemCalls.h @@ -0,0 +1,121 @@ +//****************************************************************************** +//****************************************************************************** +// +// Operating system calls +// +// Description: All operating system calls for the system. +// +//****************************************************************************** +//****************************************************************************** +#ifndef mmOperatingSystemCallsH +#define mmOperatingSystemCallsH +#include +#include + +#include + +#include +#include +#include + +#define OS_NAME "WindowsNT" + +//////////////////////////////////////////////////////////////////////////////// +/// Namespace with all operating system calls. Hides system dependency for +/// the system. +//////////////////////////////////////////////////////////////////////////////// +namespace mmOperatingSystem +{ + //////////////////////////////////////////////////////////////////////////////// + /// Returns current thread identifier. + /// + /// @return thread ID + //////////////////////////////////////////////////////////////////////////////// + mmInt GetCurrentThreadID(void); + + //////////////////////////////////////////////////////////////////////////////// + /// Function creates directory in specified location. In case of error it throws + /// mmeFileIONoSuchFileOrDirectory, mmeFileIOPermissionToFileDenied + /// or mmeUnknownError. + /// + /// @param[in] p_sDirName name with full path for new directory + //////////////////////////////////////////////////////////////////////////////// + void CreateDir(mmString p_sDirName); + //////////////////////////////////////////////////////////////////////////////// + /// Function deletes directory from specified location. In case of error it throws + /// mmeFileIONoSuchFileOrDirectory, mmeFileIOPermissionToFileDenied + /// or mmeUnknownError. + /// + /// @param[in] p_sDirName name with full path for deleted directory + //////////////////////////////////////////////////////////////////////////////// + void RemoveDir(mmString p_sDirName); + //////////////////////////////////////////////////////////////////////////////// + /// Function checks if specified directory exist. + /// + /// @param[in] p_sDirName path to checked directory + /// @return TRUE if directory exists, FALSE otherwise. + //////////////////////////////////////////////////////////////////////////////// + bool IsExistingDir(mmString p_sDirName); + //////////////////////////////////////////////////////////////////////////////// + /// Function returns directory to application executable file. + /// + /// @return full path to application executable. + //////////////////////////////////////////////////////////////////////////////// + mmString GetApplicationDirectory(void); + //////////////////////////////////////////////////////////////////////////////// + /// Function returns application executable file name. + /// + /// @return name only of application executable. + //////////////////////////////////////////////////////////////////////////////// + mmString GetApplicationName(void); + //////////////////////////////////////////////////////////////////////////////// + /// Function returns full path to current working directory. In case of error + /// it throws mmeUnknownError. + /// + /// @return path to current directory + //////////////////////////////////////////////////////////////////////////////// + mmString GetCurrentWorkingDir(void); + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns vector with elemens located in specified directory. + /// In case of error it throws mmeFileIONoSuchFileOrDirectory or mmeUnknownError. + /// + /// @param[in] p_sDirName path to directory + /// @param[in] p_sDirWildcards string with wildcards definition + /// @return vector with directory content. + //////////////////////////////////////////////////////////////////////////////// + std::vector GetDirectoryElements(mmString p_sDirName, + mmString p_sDirWildcards); + + //////////////////////////////////////////////////////////////////////////////// + /// Function checks if requested file exist. + /// + /// @param[in] p_sFileName name with full path to file + /// @return TRUE if file exists, FALSE otherwise. + //////////////////////////////////////////////////////////////////////////////// + bool IsExistingFile(mmString p_sFileName); + + //////////////////////////////////////////////////////////////////////////////// + /// Function returns time in seconds from application start. Returned time + /// can be used for measuring calculation times. + /// + /// @return time in seconds from application start + //////////////////////////////////////////////////////////////////////////////// + mmReal GetApplicationTime(void); + + //////////////////////////////////////////////////////////////////////////////// + /// This function stops thread execution for p_iMiliSeconds. + /// + /// @param[in] p_iMiliSeconds miliseconds + //////////////////////////////////////////////////////////////////////////////// + void StopThread(mmInt p_iMiliSeconds); + + //////////////////////////////////////////////////////////////////////////////// + /// Method returns string with unique ID. + /// + /// @return ID string + //////////////////////////////////////////////////////////////////////////////// + mmString GetUniqueIDString(void); +}; + +#endif diff --git a/include/mmPixel.h b/include/mmPixel.h new file mode 100644 index 0000000..8923576 --- /dev/null +++ b/include/mmPixel.h @@ -0,0 +1,76 @@ +#ifndef mmPixelH +#define mmPixelH + +#include + +struct mmPixel8; +struct mmPixel24; +struct mmPixel32; + +struct mmPixel8 { + mmPixel8(void); + mmPixel8(mmReal const p_rI); + + static mmUInt const iComponents; + + mmReal rI; +}; + +struct mmPixel24 { + mmPixel24(void); + mmPixel24(mmReal const p_rR, mmReal const p_rG, mmReal const p_rB); + mmPixel24(mmPixel8 const & p_smmPixel8); + + static mmUInt const iComponents; + + mmReal rR, rG, rB; +}; + +struct mmPixel32 { + mmPixel32(void); + mmPixel32(mmReal const p_rR, mmReal const p_rG, mmReal const p_rB, mmReal const p_rA); + mmPixel32(mmPixel8 const & p_smmPixel8); + mmPixel32(mmPixel24 const & p_smmPixel24); + + static mmUInt const iComponents; + + mmReal rR, rG, rB, rA; +}; + +extern mmPixel8 operator + (mmPixel8 p_sP1, mmPixel8 const & p_sP2); +extern mmPixel8 operator - (mmPixel8 p_sP1, mmPixel8 const & p_sP2); +extern mmPixel8 operator += (mmPixel8 & p_sP1, mmPixel8 const & p_sP2); +extern mmPixel8 operator -= (mmPixel8 & p_sP1, mmPixel8 const & p_sP2); + +extern mmPixel8 operator * (mmPixel8 p_sP, mmReal const p_sS); +extern mmPixel8 operator * (mmReal const p_sS, mmPixel8 p_sP); +extern mmPixel8 operator / (mmPixel8 p_sP, mmReal const p_sS); +extern mmPixel8 operator *= (mmPixel8 & p_sP, mmReal const p_sS); +extern mmPixel8 operator *= (mmReal const p_sS, mmPixel8 & p_sP); +extern mmPixel8 operator /= (mmPixel8 & p_sP, mmReal const p_sS); + +extern mmPixel24 operator + (mmPixel24 p_sP1, mmPixel24 const & p_sP2); +extern mmPixel24 operator - (mmPixel24 p_sP1, mmPixel24 const & p_sP2); +extern mmPixel24 operator += (mmPixel24 & p_sP1, mmPixel24 const & p_sP2); +extern mmPixel24 operator -= (mmPixel24 & p_sP1, mmPixel24 const & p_sP2); + +extern mmPixel24 operator * (mmPixel24 p_sP, mmReal const p_sS); +extern mmPixel24 operator * (mmReal const p_sS, mmPixel24 p_sP); +extern mmPixel24 operator / (mmPixel24 p_sP, mmReal const p_sS); +extern mmPixel24 operator *= (mmPixel24 & p_sP, mmReal const p_sS); +extern mmPixel24 operator *= (mmReal const p_sS, mmPixel24 & p_sP); +extern mmPixel24 operator /= (mmPixel24 & p_sP, mmReal const p_sS); + +extern mmPixel32 operator + (mmPixel32 p_sP1, mmPixel32 const & p_sP2); +extern mmPixel32 operator - (mmPixel32 p_sP1, mmPixel32 const & p_sP2); +extern mmPixel32 operator += (mmPixel32 & p_sP1, mmPixel32 const & p_sP2); +extern mmPixel32 operator -= (mmPixel32 & p_sP1, mmPixel32 const & p_sP2); + +extern mmPixel32 operator * (mmPixel32 p_sP, mmReal const p_sS); +extern mmPixel32 operator * (mmReal const p_sS, mmPixel32 p_sP); +extern mmPixel32 operator / (mmPixel32 p_sP, mmReal const p_sS); +extern mmPixel32 operator *= (mmPixel32 & p_sP, mmReal const p_sS); +extern mmPixel32 operator *= (mmReal const p_sS, mmPixel32 & p_sP); +extern mmPixel32 operator /= (mmPixel32 & p_sP, mmReal const p_sS); + +#endif \ No newline at end of file diff --git a/include/mmStringUtilities.h b/include/mmStringUtilities.h new file mode 100644 index 0000000..d8c8ff4 --- /dev/null +++ b/include/mmStringUtilities.h @@ -0,0 +1,177 @@ +//****************************************************************************** +//****************************************************************************** +// +// String utilities +// Description: This namespace extends functionality of std::string. +// +//****************************************************************************** +//****************************************************************************** +#ifndef mmStringUtilitiesH +#define mmStringUtilitiesH + +#include +#include + +#include +#include + +#include + +//////////////////////////////////////////////////////////////////////////////// +/// Namespace with extension of std::string functionality. +//////////////////////////////////////////////////////////////////////////////// +namespace mmStringUtilities +{ + //////////////////////////////////////////////////////////////////////////////// + /// Converts boolean value to string. + /// + /// @param[in] p_bInput boolean value + /// @return string representation of p_bInput + //////////////////////////////////////////////////////////////////////////////// + mmString BoolToString(bool p_bInput); + //////////////////////////////////////////////////////////////////////////////// + /// Converts integer value into string. + /// + /// @param[in] p_iInput integer value + /// @param[in] p_iLength output string lenght (fill by 0) + /// @return string representation of p_iInput + //////////////////////////////////////////////////////////////////////////////// + mmString MMIntToString(mmInt p_iInput, + mmInt p_iLength = 0); + //////////////////////////////////////////////////////////////////////////////// + /// Converts real value to string + /// + /// @param[in] p_rInput real value + /// @param[in] p_iPrecision number of digits after dot + /// @return output string. + //////////////////////////////////////////////////////////////////////////////// + mmString MMRealToString(mmReal p_rInput,mmInt p_iPrecision = -1); + //////////////////////////////////////////////////////////////////////////////// + /// Converts pointer to string. + /// + /// @param[in] p_pInput input pointer + /// @return output string. + //////////////////////////////////////////////////////////////////////////////// + mmString PointerToString(void* p_pInput); + + //////////////////////////////////////////////////////////////////////////////// + /// Converts image pixel format to human readable string + //////////////////////////////////////////////////////////////////////////////// + mmString PixelFormatToString(mmImageProcessing::ePixelType p_ePixelType); + + //////////////////////////////////////////////////////////////////////////////// + /// Converts string to image pixel format + //////////////////////////////////////////////////////////////////////////////// + mmImageProcessing::ePixelType StringToPixelFormat(mmString p_sStr); + + //////////////////////////////////////////////////////////////////////////////// + /// Converts string to integer value + /// + /// @param[in] p_sStr input string + /// @return output integer + //////////////////////////////////////////////////////////////////////////////// + mmInt StringToMMInt(mmString p_sStr); + //////////////////////////////////////////////////////////////////////////////// + /// Converts string to mmReal value + /// + /// @param[in] p_sStr input string + /// @return output mmReal + //////////////////////////////////////////////////////////////////////////////// + mmReal StringToMMReal(mmString p_sStr); + //////////////////////////////////////////////////////////////////////////////// + /// Converts string to boolean value. + /// + /// @param[in] p_sStr input string + /// @return output boolean + //////////////////////////////////////////////////////////////////////////////// + bool StringToBool(mmString p_sStr); + + //////////////////////////////////////////////////////////////////////////////// + /// This function returns formatted date/time string. + /// + /// @return formatted date/time string + //////////////////////////////////////////////////////////////////////////////// + mmString GetCurrentDateTimeString(void); + + //////////////////////////////////////////////////////////////////////////////// + /// Converts integer value representing seconds into string HH:MM:SS. + /// + /// @param[in] p_iInput integer value + /// @return string representation of p_iInput + //////////////////////////////////////////////////////////////////////////////// + mmString MMIntToHHMMSSString(mmInt p_iInput); + + //////////////////////////////////////////////////////////////////////////////// + /// Converts std::string to mmString format using STL mechanism. + /// + /// @param[in] p_sInputString single byte string, + /// @return converted mmString. + //////////////////////////////////////////////////////////////////////////////// + mmString MMCharStringToMMString(const std::string p_sInputString); + + //////////////////////////////////////////////////////////////////////////////// + /// Converts mmString to std::strng format using STL mechanism. + /// + /// @param[in] p_sInputString mmString string, + /// @return converted std::string. + //////////////////////////////////////////////////////////////////////////////// + std::string MMStringToCharString(const mmString p_sInputString); + + //////////////////////////////////////////////////////////////////////////////// + /// Converts mmString to vector with integer values. + /// + /// @param[in] p_sInputString mmString string, + /// @return vector of ints. + //////////////////////////////////////////////////////////////////////////////// + std::vector MMStringToVectorOfInt(const mmString p_sInputString); + + //////////////////////////////////////////////////////////////////////////////// + /// Converts mmString to vector with sub-string values. Delimiter is space char. + /// + /// @param[in] p_sInputString mmString string, + /// @return vector of mmStrings. + //////////////////////////////////////////////////////////////////////////////// + std::vector MMStringToVectorOfMMString(const mmString p_sInputString); + + //////////////////////////////////////////////////////////////////////////////// + /// Uppers input mmString. + /// + /// @param[in] p_sInputString mmString string, + /// @return uppered string. + //////////////////////////////////////////////////////////////////////////////// + mmString MMStringToUpper(const mmString p_sInputString); + //////////////////////////////////////////////////////////////////////////////// + /// Tokenizes input string. + /// + /// @param[in] p_sInputString mmString string, + /// @param[out] v_vcTokens vector of tokens, + /// @param[inopt] _p_sFromString pointer to function able to convert a string to + /// the specified output type, not required if the output type is a basic type + /// that can be converted using STL streams. + //////////////////////////////////////////////////////////////////////////////// + template< class T > + void Tokenize( mmString p_tString, wchar_t p_wcDelimiter, std::vector &p_vcTokens, T (*_p_sFromString)( mmString& ) = NULL ) { + std::wstringstream v_sStream( p_tString ); + std::wstringstream v_sTokenStream; + wchar_t v_wcTmp; + T v_sToken; + std::wstring v_wsToken; + p_vcTokens.clear(); + while( ! v_sStream.eof() ) { + v_sStream >> v_wcTmp; + if( v_wcTmp == p_wcDelimiter || v_sStream.eof() ) { + if( _p_sFromString != NULL ) { + v_sTokenStream >> v_wsToken; + v_sToken = (*_p_sFromString)( v_wsToken ); + } else + v_sTokenStream >> v_sToken; + if( ! ! v_sTokenStream ) + p_vcTokens.push_back( v_sToken ); + v_sTokenStream.clear(); + } else + v_sTokenStream << v_wcTmp; + } + } +}; + +#endif diff --git a/include/mmXMLIOUtilities.h b/include/mmXMLIOUtilities.h new file mode 100644 index 0000000..c6c6ce5 --- /dev/null +++ b/include/mmXMLIOUtilities.h @@ -0,0 +1,63 @@ +//--------------------------------------------------------------------------- + +#ifndef mmXMLIOUtilitiesH +#define mmXMLIOUtilitiesH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include + +using namespace mmStringUtilities; + +namespace mmXML { + typedef std::size_t mmUInt; + typedef struct { mmInt iGroupIndex; mmInt iLeafIndex; } mmXMLNodePosition; + typedef struct { mmXMLNodeI * _v_xNode; mmXMLNodePosition sPosition; } mmXMLPositionedNode; + enum mmXMLDataType { g_eXMLReal = 0x00, g_eXMLInt=0x01, g_eXMLString=0x02, g_eXMLBool=0x03, g_eXMLImageName=0x04, g_eXMLDataLayerName=0x05, g_eXMLUnknownDataType=0x07 }; + enum mmXMLAutoType { g_eXMLAutoInput=0x00, g_eXMLAutoOutput=0x01 }; + + class mmXMLNodePath { + public: + typedef struct { mmString tName; mmInt iIndex; } mmXMLNodeID; + mmXMLNodePath( void ); + mmXMLNodePath( mmString const & p_usPath ); + mmXMLNodePath& operator += ( mmString const & p_tPath ); + mmXMLNodePath& operator += ( mmXMLNodeID const & p_sNode ); + void operator = ( mmString const & p_tPath ); + bool operator == ( mmXMLNodePath const & p_sNodePath ) const; + operator mmXMLNodeID() const; + void Reset( void ) const; + bool End( void ) const; + mmString ToString( void ) const; + void Reverse( void ); + void Norm( void ); + private: + struct MakeZero { void operator () ( mmXMLNodeID & p_sNode ) const { p_sNode.iIndex = 0; } }; + std::list m_lsPath; + mutable std::list::const_iterator m_lsiCurrent; + void AddString( mmString const & p_tPath ); + }; + + bool IsValidNodePosition( mmXMLNodePosition p_xNodePosition ); + mmXMLPositionedNode CreateAutomation( mmXMLDocI * _p_xDoc, mmXMLAutoType p_eXMLAutoType ); + mmXMLPositionedNode CreateAutomationInput( mmXMLDocI * _p_xDoc ); + mmXMLPositionedNode CreateAutomationOutput( mmXMLDocI * _p_xDoc ); + mmXMLNodePosition AddParam( mmXMLPositionedNode * _p_xPositionedRootNode, mmString p_tName, mmXMLDataType p_eType, void * _p_DefaultValue = NULL ); + mmXMLNodePosition AddParam( mmXMLPositionedNode * _p_xPositionedRootNode, mmString p_tName, mmXMLDataType p_eType, mmString p_tDefaultValue ); + void CopyInputParams( mmXMLDocI * _p_xDoc, mmImages::mmImagesCalculationMethodI::sCalculationAutomationParams * _p_sAutomationParams ); + void CopyOutputParams( mmXMLDocI * _p_xDoc, mmImages::mmImagesCalculationMethodI::sCalculationAutomationParams * _p_sAutomationParams ); + void UpdateOutputParam( mmImages::mmImagesCalculationMethodI::sCalculationAutomationParams * _p_sAutomationParams, mmXMLNodePosition p_xNodePosition, void * _p_OutputValue ); + void UpdateOutputParam( mmImages::mmImagesCalculationMethodI::sCalculationAutomationParams * _p_sAutomationParams, mmXMLNodePosition p_xNodePosition, mmString p_tOutputValue ); + bool GetValueByName( mmXML::mmXMLDocI * _p_xDoc, mmString p_tParamName, void * _p_OutputPointer ); + bool GetValue( mmXMLDocI * _p_xDoc, mmXMLNodePosition p_xNodePosition, void * _p_OutputPointer ); + bool SetValueByName( mmXML::mmXMLDocI * _p_xDoc, mmString p_tParamName, void * _p_InputPointer ); + bool SetValue( mmXMLDocI * _p_xDoc, mmXMLNodePosition p_xNodePosition, void * _p_InputPointer ); + mmString GetTypeTransition( mmXMLDataType p_eDataType ); + mmXMLDataType GetTypeTransition( mmString p_tType ); + mmString ConvertToString( mmXMLDataType p_eType, void * _p_Data ); + mmXMLNodeI* GetNodeAt( mmXMLNodeI* _p_sRootNode, mmXMLNodePath const & p_sNodePath, bool p_bCreateNode ); +} + +#endif diff --git a/lib/Debug/libcalc2dmath.lib b/lib/Debug/libcalc2dmath.lib new file mode 100644 index 0000000000000000000000000000000000000000..eb2662865c24fc7f9760ceb68e0ecaa60a77a9b6 GIT binary patch literal 919536 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

kb_p)K;q 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

%nah!z;6t{oB2J;?~nXm<=2Ng zVmQBX{ATd`3BNz_dxPIzDatRu1^g<~%vItyh2ORO9^&@`zYkIv2l5-wZzjKf^hwU- zx18TU_Op6A!KihJ|>Hou4Xjoyd(h5WALcQ3!bv`uW}VIG-p8rl&Qjm5X~VoEi% zo28JQqto_VOv`NILN=Fnlg$&~)SB6JOok1^ccmb}Ki9Dfy|mB$au@7iwodJq?{a^x z+oL%%_f^KX_WrK9p^u_@bxmle*tPdp;vefkJNa{Ui@wm*q2;}ay~GrwoxJ_-_%B08 z8l{e5mxpug7e11W3_S)et8%sXp$v)=1N>t4xjF^cIf=a6@-)MUDI=!4LmZ4R(IIcBy z<7Yl)yIHY(&bBmtODw&y5|Y#nvm20>vyJd5V~p@9o?afMDGJj$y{3co^jgw)Fulu^ zo-n-+8~60Cf-AkbZKZcB`OBktdRJNg<}7~`=}qLXC0%#kR{pL{q<2Fiz0&L`y_?@g zddrrF^6A~~@?aXIFn_!0Er#Wx3a<3_6rwv-vtKwML^Z|rzc$3_AGTigNuS(m)VT@H4L+2>Q*%oT8x$B&7-e6p3 z-D8ve(>aPU1|IJF(&jm!XV10itQdOwT$|2OjPb-+zC}^D7|B|Y1pc_)?rR;s>2r_o zqKW;kG9J3J>(lqevM_x1p}(qp`o5fLj>&EAVrDu-5{k2&<-cp&-d`?2qy$vFT$`VV z=^A#)yr}|n&308&2qqG%JkAv*Rymz3O{_9J7bZ3rU%6aba#l#Tn%DulfF&nN?Ah@p z^UX7Lt1z+RiNvmzS5ac^RhK4K?>b8CX86`}b`btsO{@YGCw5GH$#D1}OzbS&6Ny#H zDo(7GveLv_VGDCspWD_FTf42qDnM~!RdS@TF~sUbxEi!c1b_gkD&;DAfyB<==P3j2=PLhY5mRn}rVy zD-(#wkMzNvO~CW-C!nj5Z^Ok+a&G6|KxzghG{duL9@;U7ypQz4L*aFydmnhD7uL

@1xsS~ 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

22c!o=(>9yog!E7==G@QsMV-c)i z(TZsUZ&9_aG)l77Lu4tHY8d%}f^(CLmA zaao3l%R)rV>LqfCEIzX2DuiHK&*x!F#Z*qA!#lT8#t6>ezIBoPR-&ox#53#ul zg%BU}`saV@x_9T}Ntzd1CSlFP`GHh)FsIJKmL=n^*H(M!)NRC^qClNVQhWjRCCx=1 zZ3Sz}g+!Z5`C>%~Wbv^(rm)N*GKI%dW^XEycGnWonX{6aQ#jSAJVm){)Gil!WeGNt z3z;ls#}}(iAd8RPF@-75~a4hRal!J8? zr}Z;-`jr=0Y-NE@DyCmsf&DytF$Y)RMZ?|>tybEGVkfjy)hb-Mh!a#^s|rqh=m?Tl zr3w-ra?r?#tU`q$y}N-w4u1D1+0K#kvKu*tTUY8&49fKDP9)aGlUbz)fl$(2yn!jo zu*gFZtB5>>g{4x~g(NvU#7eiNbwFUEDaq5J@d&}iwvid5j9Wd+oUL8iacjI|7Rg;?63 z$)utwEPBXfg`sgQIueZ~^X^8+Shj1UwrWk}(7x>xmASDwWmG2rcgms!_tdZ{94|tp z6<(r3JY%C;yk}xe;ZzOs6y>f1yIjgu0e1XStgkXNDZIzQmK0^ z98XB+TKbfXS`M2k*hre&f|F$F4Z)ed`7Y$lEv~W)u!^c^g%y)kqcBv6<4|%oLn8&d z@JIVNGO5z5#h$$RRbtO9t~wkzMO6iH5^3q`hq*ypZw|RZ<6pEJp{w6=n+m3nrl^Tb6B+-~Gf|-cSWQ%7u8}r~Jv63xv{$EmpvakBvb0 zB@ih^WFq%2vDX!W((s`S1d3{D<(PgZG6SyG-f##XE3z&pF|JyzbDV(D+?^+K#<2Zj zL3f96;nr&$5bz1tx;tZJy8k~DyIk9-%q2$k$n7eRQ9|353vFK9k+X`p8_)tAx_17NP^it^({pay%g&B?{y9fm9~ydP8k6GSCqnZ>A*L`yh24 zI2%I`l4-9Gz)!*5hl!A03AJJzot~x2Dqt#Qa1#BAbRINY)1gM@=OLqLYx>G%?;s=-54Fybm6O5$fng( zw#Z(5Qf0|qlF-T3l|0!3yd-J49Uj?X`PKgL2(1%I)sTC-;97DalY=P=*ht#tE;a=r zU-7Y+BU=-qDOym-0iEmP7@-i!H)h z5;?elP+E6^)KXN*M&X@1)HM%I#NDt;*+9Hh9rtit#5qq|ob% zNa3-`MOEb5UZF}E*b~G*BkP*7hQC$7kKRV#T8AnG(64@AEmn+nG@Lh;e zQjG@ixY{KZVf(>RIDK0c?t%^Evo*ZrwQZR3*-J;lRk)2vmyXbE%~{+;C;3REVVQbE zt#IjUU?ILrCj5o~tbNg}rq+~NxJZ_z7JieY4%T8eCS(HavNqZ8Qx80Fw&_1Lb+wBY z&08?9uG;kTZ1tbD^VQ#1PhF8r*VV3Cn!tIETw)cU;m*zUuklPhP!(5%Rch@bH8ua= zn(FEW3l_|tT~l2%f6+lT_;K}AkLUBxy`FaOVUecJg`eHF_0`Ya*zw)Ve*2?6zTAEP zi4)s;rfl4a9J%{5j2YA(gDgQflnrCh-nW`EX)E+E@ z%-00DfM;5O$qlA7xxhO<&l5iFpX@K1Tr#aaIAI@;XS;XJf|^`nT$6kF7h8GGpHZRx zoBpE73e-^?cXN3c)#}ho;!IwhYoG4{aclTLFdplLCI7id+;8ygID2# zEVPf|+0FPRH+!G)g$wpw)sc*4Gr7z_e)jTYZZw*j-JKuBI|`_jxz($dH>~PUrdP#k z=f+d1J!WqQ@*LV-k0(=}IRl=CgID!nu#sD}IGP^K9lfeC6T>hZSBxU3Xe_#_v!!=c z=LpXR>WnZz{_$r94S(Qrm^MB$R&>_{QVk0A-IW4() z)r%H*=EO5O&zzM>&zu#WI?tTWLHxJB)-$K66+d@0LarPC-QbziocV&4vvvPD&2jUy z^)Wd5+!0jRoCIBhix&Yi+5EvM@bF09v)w5bHEU|U(HlG-Z!LUcnr9-j-uwF7KF`j} zx0(3-^PMLqdp-2O`>{XwXMY|*fBOHl73x$m@9Y6Xoepbtx}Mi*&QPc8W2=(sSZXw$ zST#PJ7|vujc&2$zUGM+i%Ds2_`RX}uobq<%f^Yg?EtMU^ZAPe0ume{;-JiTXb-;~# zJYMtT;Mx27Un`Zp0YN!8cL?mWb{snE+tEPfo40N8_>b0HnDhU+RCWw6ZAP&Qv>}(w zt;%IavoZWLoxu$WxM_=L`r~^)KWWz3NgrP@{EdruyW#2U{cn_-X)c;##W~`fXB*}` zUHjSZUpV!qq4%jPxu z4J-P0zpnn+%J5mg+H%q}@BhXBhf-A^%_SnZx+}>nlfCa}XH~HqF?)VpPTCu}ho`3F@{QmR)no{B1`5F8xXC8G$@Tk-Oxm|8j z#{rv0@AYrHZHbyAYQptL7F-kiFm8*>|K>x|>@9n?eH@3JU zJnQ zO2rR+Jrdhx)$3LM>7}wcnpNerhZkPExa}|NmhXS>HQ!or;okmvrNR?K41D3XAN=Z+ zGfsJG__x2=Z`B`u`GUW*R50%OPi0~Z{`|||KkkCbJN)Ifzkln|u7_qG?LW0tI8IgJ zGC~GlJJj0cSvL8GGwXKv@V47N`q1Y|`S()37||7IX>INbcPro zCv4%Fl*%5>CsR1T4)&KXfAyyO z9u1zEJapgF@4RclH2=P(vXhzIz*rpUSN7ShC9&{;gMRqo85_3w;Ow{k`<05OHkQl) zeg7?IRaIQO*M%qDJ>}ymJwNR9?_VmKk(oOkyL{yQS3es3t8dB4m)!K7Zl8a}jwRM) zZfpe3nje^(OsAmy>NzjodSr6LyU%ZZ%4g60>a<7wOLr0eeVnvt2!A6kD;#}?nb zynFtinqEKeXMZ}+f8vZ1O)^Gn1&YCYq8o4b-?rh8{Tp72-gfevKk@IkONn$Eb@cP- zv(JX+xLinp4NBpG|et)N`~bp%-OLO2BVDKIAhcPf4p?x?_crJu{Cw4zvZ7&RVsd9EE^pG z`lNfeYMu1iAv5YOefxr~Hom-rf2;DKYrtOJ`0gQB{_Dh5!R=#v|6?!T`TnUTv&U)G zLAeM8IsE>vo=?w?TzT$utB(J?{qPrF^IukKm74jFtzGr$qZ4OV-kd&T=79$!oBUrc zwTm0qd;J%$e=_`ybLO6T-7%r3_P?xe%>VP+5^I%|Po@W`bB=Gb<=FV~i{AdZzq{?s zIj_Cxuc<2$o=fD{43DtpfAkv%R37`U-rBK^)7HK6(;H{_+e?Ly4G*JpM*qq9?|=9B zvknj3b^63@*KO?IJ-L^^qf~y{#DC!D_y7K@pPYE}eouKG`=oK*ss3=O{G5sZ+jq9@ zyJP!jd|g*vJ9t@B<{p1%srObsz{0DpayGrGcnD`ZE|7!PL z_pJJL*N zTy@X4KAHDOZ1mMP{W~36V%r@au8XHLW2|w7?_PB0?brY29wO*p77L_?YsN`SnArB zwsiW+BhTLV`(Hfp)Y2^u-tW4WZ@q!QTcX~W4)LWJDE_4BWyDwGdR8~qYTZI%?R3SP&Xsu#?1(IfqZy)kbTHRTjiYm;crfPeD|v+&0d#% z`_XGV&-2$(zNHNKwA#4;nwKA6Km6vK9Uq3rTZ^F>ya1N-2A(_lbeQ@J@$B?|B!OQS-Ab^ z^{H_D7cg6KAoJLsTJ7oQlm%PJK?H zzNAs-w+FjA!|g4B0c&ZO@T>Pc`n})1mh#Ulm5p2WsoMnm_gAex>D@i*e=u?G zGr!B8{K-51x>DKrKBK~(@%Ej&w|)GV;MReA|L~2^cYM$1xp7RZ>6SoiOH(8MuOX03 zV-G!vO_^Lilf>3cc95OiFx0eALpSS~_CQB-bGW0Wg>IxZrJj!y)b;Z-1NHOS-Ngpl zuDrfq*oD{k-8v0Qg_=6M@Y!&qPANA!-K$gD0}bKU&c<+vE=tW9Q@hsbF`d>LXzU7y z8|hQ$Mx{oLTs_3^#LM=QQnp{{oDR%<+FM$hTj-kCj48RjTDx)F%L?vyI<7Uaq_d@? zb8$nfNv)JCwO-IU9f43+L#Qd#PPf$J4jF^3U90tH9oH6UY-BJd4E)RAL_i8KxcD%dwXkJlSwhSXJLQ;SjWJ( zTAJEA!b{poEn{kXr38PUJZ@-&?cs21u(JvA&Cm#Gf3#pD+)~H12fDgi8-t-Gbdht$ znA){c({);FAk?&^E7*o6ZB!~{ezur|N7AH!p5&(Nc}tr#eVWRTo;)(%#k5(9ZH|A2g(y z#2xHS#lg-})6{eXIzvl3TJUZMNt2HBzisr#0{UYf{lRpmzXUud(T4Zdoc1r!eE7c$ zjWlS`)zTGq!m+~G<2GrygSwg7 zfw?2!2>3krpYHXjjkLBY*xAs&B)B917iLw*#_|>1PVxWYo!HNfDMF2n?TZ(q`$-wy zO-S);V~WS(oP$<|MZVv^SQ;*meWt;Q$ zMEIUhYinamTU&D|P+e17H*fxegBC7|_Q$Xa5)9!$2J>=d8YP5+Ck>pM#>R%W=9VVR z84VemrXWul#h0`!>1b`}YzP>qPbTr+iw#<~1sa;WP_#}{XGlw1_4Cy)V;b@mdYyZW zs8C>WLsN5m^Wr8;fenQ1cml;^Wz+&{Ko$c^GzBnXD2y^VIn{>p&rmn^4^%l4ANji?v8;9^) z@w^jC-cMYuC#-G=cZK0H4J>9TRqUln<9$qetJ|*kdgf;1(R{Qj>zUNh8SY-jjva5+ zam?I&Vmx29A?EQkbT&5eU)ztF+pu(5Rc}MkGqW+cEXaRdqW;=r{B^PVYrFB+HucvA z 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Ç%6-qOnAsTF!6W)0qaY0G%%L|LTw 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%0Dp1 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 C1(Iw4 literal 0 HcmV?d00001 diff --git a/lib/x64/Debug/libcalc2dmath.lib b/lib/x64/Debug/libcalc2dmath.lib new file mode 100644 index 0000000000000000000000000000000000000000..dae3135577343941b08996f63ae8d872acad0c17 GIT binary patch literal 1266004 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

8?abF-izOgU=YP7e2i-WaOa4GzHD^ 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�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

&7E!>8qZ*D+U&hX(amr0U3v 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 OR;3oHfW)BMQN;ns2u0EW literal 0 HcmV?d00001 diff --git a/lib/x64/Release/libcalc2dmath.lib b/lib/x64/Release/libcalc2dmath.lib new file mode 100644 index 0000000000000000000000000000000000000000..0d49bdfa71936b3b983a8e093c156e5e801b404b GIT binary patch literal 1111598 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%0D~QOGoA`+Q3et>?$Okn!BJ$5Fk)KnSWhD0^ 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 +#include +#include +#include + + +using namespace mmImages; + +int _tmain(int argc, _TCHAR* argv[]) +{ + mmImagesCalculationManagement calc_mgr(3, NULL); + mmImagesCalculationMethodContainerForWindows methods_mgr(NULL); + std::auto_ptr image(mmInterfaceInitializers::CreateDefaultImageStructure(NULL, NULL)); + + //methods_mgr.GetAvailableImagesCalculationMethods(); + + return 0; +} + diff --git a/proj/calc2d/calc2d.vcxproj b/proj/calc2d/calc2d.vcxproj new file mode 100644 index 0000000..725a5ab --- /dev/null +++ b/proj/calc2d/calc2d.vcxproj @@ -0,0 +1,169 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {51B17ACA-BAC0-408E-8145-B366393F0734} + Win32Proj + calc2d + calc2d + + + + Application + true + Unicode + + + Application + true + Unicode + + + Application + false + true + Unicode + + + Application + false + true + Unicode + + + + + + + + + + + + + + + + + + + true + $(SolutionDir)bin\$(IntDir) + $(Platform)\$(Configuration)\ + + + true + $(SolutionDir)bin\$(IntDir) + $(Platform)\$(Configuration)\ + + + false + $(SolutionDir)bin\$(IntDir) + $(Platform)\$(Configuration)\ + + + false + $(SolutionDir)bin\$(IntDir) + $(Platform)\$(Configuration)\ + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(SolutionDir)\include;$(SolutionDir)\proj\libcalc2d\include + + + Console + true + $(SolutionDir)lib\$(Configuration) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);libcalc2d.lib + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(SolutionDir)\include;$(SolutionDir)\proj\libcalc2d\include + + + Console + true + $(SolutionDir)lib\$(Platform)\$(Configuration)\ + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);libcalc2d.lib + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(SolutionDir)\include;$(SolutionDir)\proj\libcalc2d\include + + + Console + true + true + true + $(SolutionDir)lib\$(Configuration) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);libcalc2d.lib + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(SolutionDir)\include;$(SolutionDir)\proj\libcalc2d\include + + + Console + true + true + true + $(SolutionDir)lib\$(Platform)\$(Configuration)\ + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);libcalc2d.lib + + + + + + + + + + + + + + \ No newline at end of file diff --git a/proj/calc2d/calc2d.vcxproj.filters b/proj/calc2d/calc2d.vcxproj.filters new file mode 100644 index 0000000..9e22c24 --- /dev/null +++ b/proj/calc2d/calc2d.vcxproj.filters @@ -0,0 +1,33 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/proj/calc2d/stdafx.cpp b/proj/calc2d/stdafx.cpp new file mode 100644 index 0000000..4db124b --- /dev/null +++ b/proj/calc2d/stdafx.cpp @@ -0,0 +1,8 @@ +// stdafx.cpp : source file that includes just the standard includes +// calc2d.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file diff --git a/proj/calc2d/stdafx.h b/proj/calc2d/stdafx.h new file mode 100644 index 0000000..47a0d02 --- /dev/null +++ b/proj/calc2d/stdafx.h @@ -0,0 +1,15 @@ +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#pragma once + +#include "targetver.h" + +#include +#include + + + +// TODO: reference additional headers your program requires here diff --git a/proj/calc2d/targetver.h b/proj/calc2d/targetver.h new file mode 100644 index 0000000..90e767b --- /dev/null +++ b/proj/calc2d/targetver.h @@ -0,0 +1,8 @@ +#pragma once + +// Including SDKDDKVer.h defines the highest available Windows platform. + +// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and +// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. + +#include diff --git a/proj/libcalc2d/Calculation2D.vcxproj b/proj/libcalc2d/Calculation2D.vcxproj new file mode 100644 index 0000000..fbab503 --- /dev/null +++ b/proj/libcalc2d/Calculation2D.vcxproj @@ -0,0 +1,228 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + libcalc2d + {81764A51-4B0F-4310-ACD1-059BFC9BEDDE} + OGX2Dlib + Win32Proj + + + + StaticLibrary + Unicode + + + StaticLibrary + Unicode + + + StaticLibrary + Unicode + + + StaticLibrary + Unicode + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(SolutionDir)lib\$(IntDir) + $(Platform)\$(Configuration)\ + $(SolutionDir)lib\$(IntDir) + $(Platform)\$(Configuration)\ + $(SolutionDir)lib\$(IntDir) + $(Platform)\$(Configuration)\ + $(SolutionDir)lib\$(IntDir) + $(Platform)\$(Configuration)\ + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + include;$(SolutionDir)\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + $(IntDir) + $(IntDir)vc90.pdb + $(IntDir) + Level3 + EditAndContinue + 4290;%(DisableSpecificWarnings) + + + $(TargetPath) + $(SolutionDir)lib\$(Configuration)\ + libcalc2dmath.lib + + + + + X64 + + + Disabled + include;$(SolutionDir)\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + $(IntDir) + $(IntDir)vc90.pdb + $(IntDir) + Level3 + ProgramDatabase + 4290;%(DisableSpecificWarnings) + + + $(TargetPath) + $(SolutionDir)lib\$(Platform)\$(Configuration)\ + libcalc2dmath.lib + + + + + include;$(SolutionDir)\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + MultiThreadedDLL + + + $(IntDir) + $(IntDir)vc90.pdb + $(IntDir) + Level3 + ProgramDatabase + + + $(TargetPath) + $(SolutionDir)lib\$(Configuration)\ + libcalc2dmath.lib + + + + + X64 + + + include;$(SolutionDir)\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + MultiThreadedDLL + + + $(IntDir) + $(IntDir)vc90.pdb + $(IntDir) + Level3 + ProgramDatabase + + + $(TargetPath) + $(SolutionDir)lib\$(Platform)\$(Configuration)\ + libcalc2dmath.lib + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/proj/libcalc2d/Calculation2D.vcxproj.filters b/proj/libcalc2d/Calculation2D.vcxproj.filters new file mode 100644 index 0000000..db4b807 --- /dev/null +++ b/proj/libcalc2d/Calculation2D.vcxproj.filters @@ -0,0 +1,213 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {dc45dcdb-97dd-4abd-8727-5b1b64bade58} + + + {f534c902-48c7-43ec-84dd-588d49756582} + + + {b741e4f8-6938-4dfd-99dd-8be396e0e8e4} + + + {5aede797-ab77-4d8d-8b8e-1c8a9b328c9e} + + + {621a138a-09d3-4093-9466-ba38ab70d61b} + + + {b0121389-a342-49bb-81bf-9c8296be7655} + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {d008bc18-972e-4846-b53e-f6f6cccbe2f5} + + + {b393c518-01ad-4742-942d-46bc49eae3ec} + + + {637739e5-1851-4aec-a0f0-a2755940c22d} + + + {36855bdd-24c0-4f23-bfee-ea4a61063a7a} + + + {cd5eadb5-036f-4273-bb12-9d9e71b1f834} + + + {b840c7a4-ea33-45ff-8ad9-73ff4e7d1bad} + + + + + Header Files\Calculation + + + Header Files\Calculation + + + Header Files\Calculation + + + Header Files\Calculation + + + Header Files\Images + + + Header Files\Log + + + Header Files\Log + + + Header Files\System + + + Header Files\System + + + Header Files\System + + + Header Files\System + + + Header Files\XML + + + Header Files\Interfaces + + + Header Files\Interfaces + + + Header Files\Interfaces + + + Header Files\Interfaces + + + Header Files\Interfaces + + + Header Files\Interfaces + + + Header Files\Interfaces + + + Header Files\Interfaces + + + Header Files\Interfaces + + + Header Files\Interfaces + + + Header Files\Log + + + Header Files\System + + + Header Files\XML + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files\Images + + + + + Source Files + + + Source Files + + + Source Files\Images + + + Source Files\Images + + + Source Files\XML + + + Source Files\XML + + + Source Files\Log + + + Source Files\Log + + + Source Files\Log + + + Source Files\Calculation + + + Source Files\Calculation + + + Source Files\Calculation + + + Source Files\Calculation + + + Source Files\System + + + Source Files\System + + + Source Files\System + + + Source Files\System + + + Source Files\System + + + Source Files\Interfaces + + + Source Files\Interfaces + + + Source Files\Interfaces + + + Source Files\Interfaces + + + \ No newline at end of file diff --git a/proj/libcalc2d/include/fileio/mmFileIOStd.h b/proj/libcalc2d/include/fileio/mmFileIOStd.h new file mode 100644 index 0000000..81ca828 --- /dev/null +++ b/proj/libcalc2d/include/fileio/mmFileIOStd.h @@ -0,0 +1,316 @@ +//****************************************************************************** +//****************************************************************************** +// +// FileIO STD implementation +// +// +// Description: This header defines implementation of all interfaces from +// FileIO namespace. +// +//****************************************************************************** +//****************************************************************************** +#ifndef mmFileIOSTDH +#define mmFileIOSTDH + +#include + +#include +#include + +namespace mmFileIO +{ + //////////////////////////////////////////////////////////////////////////////// + /// Function returns current file position. + /// + /// @param[in] p_psFile pointer to file object + /// @return file position in bytes counted from beginning. + //////////////////////////////////////////////////////////////////////////////// + mmInt GetFilePosition(std::ifstream* p_psFile); + + //////////////////////////////////////////////////////////////////////////////// + /// Function returns current file position. + /// + /// @param[in] p_psFile pointer to file object + /// @return file position in bytes counted from beginning. + //////////////////////////////////////////////////////////////////////////////// + mmInt GetFilePosition(std::wifstream* p_psFile); + + //////////////////////////////////////////////////////////////////////////////// + /// Function returns current file position. + /// + /// @param[in] p_psFile pointer to file object + /// @return file position in bytes counted from beginning. + //////////////////////////////////////////////////////////////////////////////// + mmInt GetFilePosition(std::ofstream* p_psFile); + + //////////////////////////////////////////////////////////////////////////////// + /// Function returns current file position. + /// + /// @param[in] p_psFile pointer to file object + /// @return file position in bytes counted from beginning. + //////////////////////////////////////////////////////////////////////////////// + mmInt GetFilePosition(std::wofstream* p_psFile); + + //////////////////////////////////////////////////////////////////////////////// + /// Function sets current file position. + /// + /// @param[in] p_psFile pointer to file object + /// @param[in] p_iFilePos file position in bytes counted from beginning. + //////////////////////////////////////////////////////////////////////////////// + void SetFilePosition(std::ifstream* p_psFile,mmInt p_iFilePos); + + //////////////////////////////////////////////////////////////////////////////// + /// Function sets current file position. + /// + /// @param[in] p_psFile pointer to file object + /// @param[in] p_iFilePos file position in bytes counted from beginning. + //////////////////////////////////////////////////////////////////////////////// + void SetFilePosition(std::wifstream* p_psFile,mmInt p_iFilePos); + + //////////////////////////////////////////////////////////////////////////////// + /// Function sets current file position. + /// + /// @param[in] p_psFile pointer to file object + /// @param[in] p_iFilePos file position in bytes counted from beginning. + //////////////////////////////////////////////////////////////////////////////// + void SetFilePosition(std::ofstream* p_psFile,mmInt p_iFilePos); + + //////////////////////////////////////////////////////////////////////////////// + /// Function sets current file position. + /// + /// @param[in] p_psFile pointer to file object + /// @param[in] p_iFilePos file position in bytes counted from beginning. + //////////////////////////////////////////////////////////////////////////////// + void SetFilePosition(std::wofstream* p_psFile,mmInt p_iFilePos); + + //////////////////////////////////////////////////////////////////////////////// + /// Function returns file length in bytes. + /// + /// @param[in] p_psFile pointer to file object + /// @return length of file in bytes. + //////////////////////////////////////////////////////////////////////////////// + mmInt GetFileLenght(std::ifstream* p_psFile); + + //////////////////////////////////////////////////////////////////////////////// + /// Function returns file length in bytes. + /// + /// @param[in] p_psFile pointer to file object + /// @return length of file in bytes. + //////////////////////////////////////////////////////////////////////////////// + mmInt GetFileLenght(std::wifstream* p_psFile); + + //////////////////////////////////////////////////////////////////////////////// + /// Function returns file length in bytes. + /// + /// @param[in] p_psFile pointer to file object + /// @return length of file in bytes. + //////////////////////////////////////////////////////////////////////////////// + mmInt GetFileLenght(std::ofstream* p_psFile); + + //////////////////////////////////////////////////////////////////////////////// + /// Function returns file length in bytes. + /// + /// @param[in] p_psFile pointer to file object + /// @return length of file in bytes. + //////////////////////////////////////////////////////////////////////////////// + mmInt GetFileLenght(std::wofstream* p_psFile); + + //////////////////////////////////////////////////////////////////////////////// + /// This class implements mmFileIO::mmFileUtilsI interface with use of + /// C++ STD library. It defines functions supporting file/directory manipulation. + //////////////////////////////////////////////////////////////////////////////// + class mmFileUtilsSTD: public mmFileUtilsI, + mmLog::mmLogSender + { + public: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Constructor. + /// + /// @param[in] p_psLogReceiver pointer to log object. + //////////////////////////////////////////////////////////////////////////////// + mmFileUtilsSTD(mmLog::mmLogReceiverI *p_psLogReceiver = NULL); + //////////////////////////////////////////////////////////////////////////////// + /// Destructor. + //////////////////////////////////////////////////////////////////////////////// + ~mmFileUtilsSTD(); + + void CreateDir(mmString p_sDirName); + void CreateDirStructure(mmString p_sDirName); + void ClearDir(mmString p_sDirName); + void RemoveDir(mmString p_sDirName,bool p_bWithElements); + + bool IsExistingDir(mmString p_sDirName); + mmString GetTemporaryDir(void); + mmString GetApplicationDir(void); + std::vector GetDirElements(mmString p_sDirName, + mmString p_sDirWildcards); + bool IsEmptyDir(mmString p_sDirName); + + void RemoveFile(mmString p_sFileName); + bool IsExistingFile(mmString p_sFileName); + mmString GetPathToFile(mmString p_sFileName); + }; + + //////////////////////////////////////////////////////////////////////////////// + /// This class implements mmFileIO::mmTextFileReadI interface with use of + /// C++ STD library. + //////////////////////////////////////////////////////////////////////////////// + class mmTextFileReadSTD: public mmTextFileReadI, + mmLog::mmLogSender + { + private: // fields + //////////////////////////////////////////////////////////////////////////////// + /// Pointer to file object from STD library. + //////////////////////////////////////////////////////////////////////////////// + std::wifstream* m_psFile; + //////////////////////////////////////////////////////////////////////////////// + /// File name which is open. + //////////////////////////////////////////////////////////////////////////////// + mmString m_sFileName; + public: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Class constructor. + /// + /// @param[in] p_psLogReceiver pointer to log object. + //////////////////////////////////////////////////////////////////////////////// + mmTextFileReadSTD(mmLog::mmLogReceiverI *p_psLogReceiver = NULL); + //////////////////////////////////////////////////////////////////////////////// + /// Destructor. + //////////////////////////////////////////////////////////////////////////////// + ~mmTextFileReadSTD(); + + void Open(mmString p_sFileName); + void Close(void); + bool ReadChar(wchar_t* p_pcChar); + bool ReadLine(mmString* p_psFileLine); + mmInt ReadLines(std::vector* p_psLines,mmInt p_iLinesCount); + mmInt GetLenght(void); + mmInt ReadWholeFile(wchar_t* p_pcFileContent); + bool Eof(void); + bool IsActiveFile(void); + mmInt GetActualFilePosition(void); + mmString GetFileName(void); + }; + + //////////////////////////////////////////////////////////////////////////////// + /// This class implements mmFileIO::mmTextFileWriteI interface with use of + /// C++ STD library. + //////////////////////////////////////////////////////////////////////////////// + class mmTextFileWriteSTD: public mmTextFileWriteI, + mmLog::mmLogSender + { + private: // fields + //////////////////////////////////////////////////////////////////////////////// + /// pointer to file object from STD library. + //////////////////////////////////////////////////////////////////////////////// + std::wofstream* m_psFile; + //////////////////////////////////////////////////////////////////////////////// + /// File name. + //////////////////////////////////////////////////////////////////////////////// + mmString m_sFileName; + public: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Constructor. + /// + ///`@param[in] p_psLogReceiver pointer to log object. + //////////////////////////////////////////////////////////////////////////////// + mmTextFileWriteSTD(mmLog::mmLogReceiverI *p_psLogReceiver = NULL); + //////////////////////////////////////////////////////////////////////////////// + /// Destructor. + //////////////////////////////////////////////////////////////////////////////// + ~mmTextFileWriteSTD(); + + void Open(mmString p_sFileName, + eOpenFileMode p_eOpenMode); + void Close(void); + void WriteChar(wchar_t p_cChar); + void WriteLine(mmString p_sFileLine); + void WriteLines(std::vector* p_psLines); + void WriteBuffer(wchar_t const* p_pcBuffer,mmInt p_iBufferSize); + void WriteEol(void); + void Flush(void); + bool IsActiveFile(void); + mmString GetFileName(void); + }; + + //////////////////////////////////////////////////////////////////////////////// + /// This class implements mmFileIO::mmBinaryFileReadI interface with use of + /// C++ STD library. + //////////////////////////////////////////////////////////////////////////////// + class mmBinaryFileReadSTD: public mmBinaryFileReadI, + mmLog::mmLogSender + { + private: // fields + //////////////////////////////////////////////////////////////////////////////// + /// Pointer to file object from STD library. + //////////////////////////////////////////////////////////////////////////////// + std::ifstream* m_psFile; + //////////////////////////////////////////////////////////////////////////////// + /// File name which is open. + //////////////////////////////////////////////////////////////////////////////// + mmString m_sFileName; + public: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Class constructor. + /// + /// @param[in] p_psLogReceiver pointer to log object. + //////////////////////////////////////////////////////////////////////////////// + mmBinaryFileReadSTD(mmLog::mmLogReceiverI *p_psLogReceiver = NULL); + //////////////////////////////////////////////////////////////////////////////// + /// Destructor. + //////////////////////////////////////////////////////////////////////////////// + ~mmBinaryFileReadSTD(); + + void Open(mmString p_sFileName); + void Close(void); + bool ReadBuffer(void* p_pBuffer,mmInt p_iSize); + mmInt GetLenght(void); + bool Eof(void); + bool IsActiveFile(void); + mmInt GetActualFilePosition(void); + void SetActualFilePosition(mmInt p_iFilePos); + mmString GetFileName(void); + }; + + //////////////////////////////////////////////////////////////////////////////// + /// This class implements mmFileIO::mmBinaryFileWriteI interface with use of + /// C++ STD library. + //////////////////////////////////////////////////////////////////////////////// + class mmBinaryFileWriteSTD: public mmBinaryFileWriteI, + mmLog::mmLogSender + { + private: // fields + //////////////////////////////////////////////////////////////////////////////// + /// pointer to file object from STD library. + //////////////////////////////////////////////////////////////////////////////// + std::ofstream* m_psFile; + //////////////////////////////////////////////////////////////////////////////// + /// File name. + //////////////////////////////////////////////////////////////////////////////// + mmString m_sFileName; + public: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Constructor. + /// + ///`@param[in] p_psLogReceiver pointer to log object. + //////////////////////////////////////////////////////////////////////////////// + mmBinaryFileWriteSTD(mmLog::mmLogReceiverI *p_psLogReceiver = NULL); + //////////////////////////////////////////////////////////////////////////////// + /// Destructor. + //////////////////////////////////////////////////////////////////////////////// + ~mmBinaryFileWriteSTD(); + + void Open(mmString p_sFileName, + mmFileIO::eOpenFileMode p_eOpenMode); + void Close(void); + bool WriteBuffer(void* p_pBuffer,mmInt p_iSize); + mmInt GetLenght(void); + bool IsActiveFile(void); + mmInt GetActualFilePosition(void); + void SetActualFilePosition(mmInt p_iFilePos); + mmString GetFileName(void); + void Flush(void); + }; +}; + +#endif diff --git a/proj/libcalc2d/include/images/mmImagesCalculationManagement.h b/proj/libcalc2d/include/images/mmImagesCalculationManagement.h new file mode 100644 index 0000000..f9d182f --- /dev/null +++ b/proj/libcalc2d/include/images/mmImagesCalculationManagement.h @@ -0,0 +1,65 @@ +//****************************************************************************** +//****************************************************************************** +// +// Images calculation management class +// +// +// Description: This header defines mmImages calculation management class +// +//****************************************************************************** +//****************************************************************************** +#ifndef mmIImagesCalculationManagementH +#define mmIImagesCalculationManagementH + +#include +#include +#include +#include + +namespace mmImages +{ + + + //////////////////////////////////////////////////////////////////////////////// + /// Class for images calculation management. + //////////////////////////////////////////////////////////////////////////////// + class mmImagesCalculationManagement: public mmLog::mmLogSender, public mmThread::mmThreadExecutionI + { + private: + bool m_bIsActiveCalculation; + + + mmImages::mmImageStructureI* m_psImageStructure; + std::vector m_vRunningThreads; + mmInt m_iCalculationThreadCount; + + // control thread + bool m_bTerminateControlThreadExecution; + mmThread::mmThreadI* m_psControlThread; + mmInt m_iThreadExecutionSleepTime; + mmReal m_rProgress; + private: + void StopRunningThreads(void); + public: + mmImagesCalculationManagement(mmInt p_iCalcThreadCount, mmLog::mmLogReceiverI *p_psLogReceiver); + //////////////////////////////////////////////////////////////////////////////// + /// Destructor. + //////////////////////////////////////////////////////////////////////////////// + ~mmImagesCalculationManagement(); + + void CalculateImages(mmImages::mmImagesCalculationMethodI* p_psImagesCalculationMethod, mmImages::mmImageStructureI* p_psImageStructure, + mmImages::mmImagesCalculationMethodI::sCalculationAutomationParams* p_psAutomationParams = NULL); + + bool IsCalculating(void); + + bool Execute(void); + void StopExecution(void); + bool IsExecuting(void); + mmReal GetProgress(void); + + void UserAction(mmString p_sXMLParams); + void UserAction(wchar_t* p_pcXMLParamsBuffer, mmInt p_iXMLParamsBufferSize); + }; +}; + +#endif diff --git a/proj/libcalc2d/include/images/mmImagesCalculationMethodContainerWindows.h b/proj/libcalc2d/include/images/mmImagesCalculationMethodContainerWindows.h new file mode 100644 index 0000000..c7d81c6 --- /dev/null +++ b/proj/libcalc2d/include/images/mmImagesCalculationMethodContainerWindows.h @@ -0,0 +1,95 @@ +//****************************************************************************** +//****************************************************************************** +// +// images calculation method Container for Windows OS class +// +// +// Description: This header defines implementation of +// mmImages::mmImagesCalculationMethodContainerI interface +// for Windows OS using dlls. +// +//****************************************************************************** +//****************************************************************************** +#ifndef mmImagesCalculationMethodContainerForWindowsOSH +#define mmImagesCalculationMethodContainerForWindowsOSH + +#include +#include + + +//////////////////////////////////////////////////////////////////////////////// +/// Definition of function type returning number of supported images +/// calculation method types. +//////////////////////////////////////////////////////////////////////////////// +typedef mmInt (__stdcall *mmDLLGetSupportedImagesCalculationMethodCount)(void); + +//////////////////////////////////////////////////////////////////////////////// +/// Definition of function type returning structure +/// mmImages::mmImagesCalculationMethodI::sCalculationMethodParams +/// defining supported images calculation method. +//////////////////////////////////////////////////////////////////////////////// +typedef mmImages::mmImagesCalculationMethodI::sCalculationMethodParams (__stdcall *mmDLLGetSupportedImagesCalculationMethodDef)(mmInt); + +namespace mmImages +{ + //////////////////////////////////////////////////////////////////////////////// + /// Implementation of mmImages::mmImagesCalculationMethodContainerI interface for + /// windows operating system with using of dll loading. + //////////////////////////////////////////////////////////////////////////////// + class mmImagesCalculationMethodContainerForWindows: public mmImagesCalculationMethodContainerI, + mmLog::mmLogSender + { + private: // definitions + //////////////////////////////////////////////////////////////////////////////// + /// Structure defining dll with images calculation method definition. + //////////////////////////////////////////////////////////////////////////////// + typedef struct + { + //////////////////////////////////////////////////////////////////////////////// + /// DLL name with full path. + //////////////////////////////////////////////////////////////////////////////// + mmString sDLLName; + //////////////////////////////////////////////////////////////////////////////// + /// Definition of images calculation method supported by this DLL. + //////////////////////////////////////////////////////////////////////////////// + std::vector vImagesCalculationMethodDefs; + } sImagesCalculationMethodInDLL; + private: // fields + //////////////////////////////////////////////////////////////////////////////// + /// This vector stores available Images calculation method definitions. + //////////////////////////////////////////////////////////////////////////////// + std::vector m_vAvailableDLLs; + + private: // methods + //////////////////////////////////////////////////////////////////////////////// + /// This method fills all DLLs stored in application directory into m_vAvailableDLLs + /// structure. + //////////////////////////////////////////////////////////////////////////////// + void SearchForDLLLibraries(void); + //////////////////////////////////////////////////////////////////////////////// + /// This method searches for DLLs supporting images calculation method + /// interface and writes found calculation method names into m_vAvailableDLLs + /// structure. + //////////////////////////////////////////////////////////////////////////////// + void SearchForImagesCalculationMethodsInDLLLibraries(void); + public: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Constructor. + /// + /// @param[in] p_psMainWindow pointer to main window object + /// @param[in] p_psLogReceiver pointer to log object + //////////////////////////////////////////////////////////////////////////////// + mmImagesCalculationMethodContainerForWindows(mmLog::mmLogReceiverI *p_psLogReceiver = NULL); + + //////////////////////////////////////////////////////////////////////////////// + /// Destructor. + //////////////////////////////////////////////////////////////////////////////// + ~mmImagesCalculationMethodContainerForWindows(); + + std::vector GetAvailableImagesCalculationMethods(void); + mmImages::mmImagesCalculationMethodI* InitializeImagesCalculationMethod(mmString p_sCalculationMethodName); + }; +}; + +#endif + diff --git a/proj/libcalc2d/include/images/mmImagesCalculationMethodDLLBroker.h b/proj/libcalc2d/include/images/mmImagesCalculationMethodDLLBroker.h new file mode 100644 index 0000000..7876f10 --- /dev/null +++ b/proj/libcalc2d/include/images/mmImagesCalculationMethodDLLBroker.h @@ -0,0 +1,85 @@ +//****************************************************************************** +//****************************************************************************** +// +// DLL images Calculation Method Broker class +// +// +// Description: This header defines implementation of +// mmImages::mmImagesCalculationMethodI interface for broker +// functionality between main application and DLL code +// (it is required because STL library fails in DLL). +// +//****************************************************************************** +//****************************************************************************** +#ifndef mmImagesCalculationMethodDLLBrokerH +#define mmImagesCalculationMethodDLLBrokerH + +#include +#include + +#include + +#include + +//////////////////////////////////////////////////////////////////////////////// +/// Definition of function type returning initialised specified images +/// calculation method. +//////////////////////////////////////////////////////////////////////////////// +typedef mmImages::mmImagesCalculationMethodI* (__stdcall *mmDLLImagesCalculationMethod_Create)(mmInterfacesStorage::mmGlobalInterfacesStorage*,const wchar_t*); + +//////////////////////////////////////////////////////////////////////////////// +/// Definition of function type freeing images calculation method object. +//////////////////////////////////////////////////////////////////////////////// +typedef void (__stdcall *mmDLLImagesCalculationMethod_Destroy)(mmImages::mmImagesCalculationMethodI*); + +namespace mmImages +{ + //////////////////////////////////////////////////////////////////////////////// + /// Implementation of mmImages::mmImagesCalculationMethodI interface for + /// DLL broker. + //////////////////////////////////////////////////////////////////////////////// + class mmImagesCalculationMethodDLLBroker: public mmImagesCalculationMethodI, + public mmLog::mmLogSender + { + private: // fields + HINSTANCE m_hDLLHandle; + mmImages::mmImagesCalculationMethodI* m_psInitializedImagesCalculationMethod; + + + mmDLLImagesCalculationMethod_Create m_psDLLImagesCalculationMethod_Create; + mmDLLImagesCalculationMethod_Destroy m_psDLLImagesCalculationMethod_Destroy; + public: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Constructor. + /// + /// @param[in] p_sDLLName name of DLL with images calculation method + /// definition + /// @param[in] p_sImagesCalculationMethodName name of images + /// calculation method to initialize + /// @param[in] p_psLogReceiver pointer to log object + //////////////////////////////////////////////////////////////////////////////// + mmImagesCalculationMethodDLLBroker(mmString p_sDLLName, mmString p_sImagesCalculationMethodName, + mmLog::mmLogReceiverI *p_psLogReceiver = NULL); + + //////////////////////////////////////////////////////////////////////////////// + /// Destructor. + //////////////////////////////////////////////////////////////////////////////// + ~mmImagesCalculationMethodDLLBroker(); + + mmImages::mmImagesCalculationMethodI::sCalculationMethodParams GetCalculationMethodInfo(void); + void SetCalculationMethodParameters(mmImages::mmImageStructureI* p_psImageStructure, + mmImages::mmImagesCalculationMethodI::sCalculationAutomationParams* p_psAutomationParams = NULL); + + void UserAction(mmString p_sXMLParams); + void UserAction(wchar_t* p_pcXMLParamsBuffer, + mmInt p_iXMLParamsBufferSize); + + bool Execute(void); + void StopExecution(void); + bool IsExecuting(void); + mmReal GetProgress(void); + }; +}; + +#endif + diff --git a/proj/libcalc2d/include/images/mmImagesComplexCalculationManagement.h b/proj/libcalc2d/include/images/mmImagesComplexCalculationManagement.h new file mode 100644 index 0000000..9d76cb4 --- /dev/null +++ b/proj/libcalc2d/include/images/mmImagesComplexCalculationManagement.h @@ -0,0 +1,262 @@ +//****************************************************************************** +//****************************************************************************** +// +// Images complex calculation management class +// +// Description: This header defines mmImages complex calculation management class +// +//****************************************************************************** +//****************************************************************************** +#ifndef mmImagesComplexCalculationManagementH +#define mmImagesComplexCalculationManagementH + +#include +#include + +#include +#include +#include +#include +#include + +namespace mmImages +{ + extern const wchar_t* g_pComplexCalcXML_PatternContainer_Node; + + extern const wchar_t* g_pComplexCalcXML_Pattern_Node; + extern const wchar_t* g_pComplexCalcXML_PatternName_Node; + extern const wchar_t* g_pComplexCalcXML_PatternIDName_Node; + extern const wchar_t* g_pComplexCalcXML_PatternDescription_Node; + extern const wchar_t* g_pComplexCalcXML_PatternInputParams_Node; + extern const wchar_t* g_pComplexCalcXML_PatternInputParam_Node; + extern const wchar_t* g_pComplexCalcXML_PatternInputParam_Constant_Attr; + extern const wchar_t* g_pComplexCalcXML_PatternInputParamName_Node; + extern const wchar_t* g_pComplexCalcXML_PatternInputParamType_Node; + extern const wchar_t* g_pComplexCalcXML_PatternInputParamValue_Node; + extern const wchar_t* g_pComplexCalcXML_PatternInputParamValueModifiedNodeName_Node; + extern const wchar_t* g_pComplexCalcXML_PatternOutputParams_Node; + extern const wchar_t* g_pComplexCalcXML_PatternOutputParam_Node; + extern const wchar_t* g_pComplexCalcXML_PatternOutputParamName_Node; + extern const wchar_t* g_pComplexCalcXML_PatternOutputParamType_Node; + extern const wchar_t* g_pComplexCalcXML_PatternOutputParamValue_Node; + extern const wchar_t* g_pComplexCalcXML_PatternOutputParamValueModifiedNodeName_Node; + extern const wchar_t* g_pComplexCalcXML_PatternOutputParamValueModifiedSecondNodeName_Node; + extern const wchar_t* g_pComplexCalcXML_PatternOutputParamOperation_Node; + extern const wchar_t* g_pComplexCalcXML_PatternDefinition_Node; + extern const wchar_t* g_pComplexCalcXML_PatternCalcMethod_Node; + extern const wchar_t* g_pComplexCalcXML_PatternCalcMethodIDName_Node; + extern const wchar_t* g_pComplexCalcXML_PatternInternalAction_Node; + extern const wchar_t* g_pComplexCalcXML_PatternInternalActionName_Node; + +// PB // +// extern const wchar_t* g_pComplexCalcXML_Action_AddSimpleCalculationMethod; +// extern const wchar_t* g_pComplexCalcXML_Action_AddOutputValueFromExisting; +// extern const wchar_t* g_pComplexCalcXML_Action_MixOutputValuesFromExisting; +// extern const wchar_t* g_pComplexCalcXML_Action_AddInputValueFromExistingOrConst; +// extern const wchar_t* g_pComplexCalcXML_Action_AddInputValueConstDecision; +// extern const wchar_t* g_pComplexCalcXML_Action_CreateSimplifiedCloudStructure; +// extern const wchar_t* g_pComplexCalcXML_Action_DeleteSimplifiedCloudStructure; + +// PB // +// extern const wchar_t* g_pComplexCalcXML_Action_AddWhileLoop; +// extern const wchar_t* g_pComplexCalcXML_Action_AddEndWhile; +// extern const wchar_t* g_pComplexCalcXML_Action_CopyBinaryOutputToInputValue; +// extern const wchar_t* g_pComplexCalcXML_Action_CopyIntOutputToInputValue; +// extern const wchar_t* g_pComplexCalcXML_Action_CopyRealOutputToInputValue; + +// PB // +// extern const wchar_t* g_pComplexCalcXML_PatternInputParamUserSpecified; +// extern const wchar_t* g_pComplexCalcXML_PatternInputParamConstant_Real; +// extern const wchar_t* g_pComplexCalcXML_PatternInputParamConstant_Int; + + + extern const wchar_t* g_pComplexCalcXML_PatternOutputFormula_Addition; + extern const wchar_t* g_pComplexCalcXML_PatternOutputFormula_Subtraction; + extern const wchar_t* g_pComplexCalcXML_PatternOutputFormula_Multiplication; + extern const wchar_t* g_pComplexCalcXML_PatternOutputFormula_Division; + extern const wchar_t* g_pComplexCalcXML_PatternOutputFormula_Power; + extern const wchar_t* g_pComplexCalcXML_PatternOutputFormula_Minimum; + extern const wchar_t* g_pComplexCalcXML_PatternOutputFormula_Maximum; + extern const wchar_t* g_pComplexCalcXML_PatternOutputFormula_Equal; + extern const wchar_t* g_pComplexCalcXML_PatternOutputFormula_Less; + extern const wchar_t* g_pComplexCalcXML_PatternOutputFormula_Greater; + + //////////////////////////////////////////////////////////////////////////////// + /// Interface for images complex calculation management change receiver. + //////////////////////////////////////////////////////////////////////////////// + class mmImagesComplexCalculationManagementStateChangeReceiverI + { + public: + //////////////////////////////////////////////////////////////////////////////// + /// Virtual destructor. + //////////////////////////////////////////////////////////////////////////////// + virtual ~mmImagesComplexCalculationManagementStateChangeReceiverI() {}; + + virtual void StartOfComplexCalculation(void) = 0; + virtual void StopOfComplexCalculation(void) = 0; + + virtual void ListOfComplexCalculationPatternsUpdated(void) = 0; + }; + + //////////////////////////////////////////////////////////////////////////////// + /// Class for images complex calculation management. + //////////////////////////////////////////////////////////////////////////////// + class mmImagesComplexCalculationManagement: public mmLog::mmLogSender, + public mmThread::mmThreadExecutionI + { + public: // defs + typedef struct + { + mmString sName; + mmString sIDName; + mmString sDescription; + } sComplexCalculationInfo; + private: // defs + typedef struct + { + mmString sIDName; + mmImages::mmImageStructureI* psImageStructure; + } sComplexCalculationDefinition; + private: + bool m_bIsActiveCalculation; + mmImages::mmImagesCalculationMethodContainerI* m_psImageCalculationMethodContainer; + mmImages::mmImageStructureI* m_psImageStructure; + mmImages::mmImagesCalculationManagement* m_psImageCalculationManagement; + + // control thread + bool m_bTerminateControlThreadExecution; + mmThread::mmThreadI* m_psControlThread; + mmInt m_iThreadExecutionSleepTime; + + // structures with information about simple calculation methods + std::vector m_vSimpleCalculationMethodsInfo; + + // XML with new pattern definition + mmXML::mmXMLDocI* m_psXMLCurrentPatternDefinition; + bool m_bIsNew; + + // XML with complex patterns container + mmXML::mmXMLDocI* m_psXMLComplexPatternContainer; + mmString m_sComplexPatternContainerXMLFile; + + // state change receiver + mmImagesComplexCalculationManagementStateChangeReceiverI* m_psStateChangeReceiver; + + // execution queue + std::deque m_vCalculationSheme; + mmSynchronize::mmExclusiveLockI* m_psThreadSynchronizationEL; + + // simplified clouds stack + std::stack m_vSimplifiedImage; + + // XML with currently calculated pattern definition + mmXML::mmXMLNodeI* m_psXMLCalculatedPatternDefinition; + sComplexCalculationDefinition m_sCurrentComplexCalculation; + mmImages::mmImagesCalculationMethodI* m_psCurrentCalculationMethod; + mmInt m_iCurrentComplexCalculationItem; + private: +// PB // +// mmString CreateComplexCalculationPatternUI( mmXML::mmXMLDocI* p_psXMLComplexCalculationPatternDefinition, +// bool p_bIsReadOnly); +// mmString GetFromUIDefinitionForSingleCalculationMethod( mmString p_sCalculationMethodIDName, +// bool* p_pbNoParams); + +// PB // +// mmImages::mmImagesCalculationMethodI::sCalculationMethodParams* GetCalculationMethodInfo(mmString p_sCalculationMethodIDName); +// mmString GetCalculationMethodName(mmString p_sCalculationMethodIDName); + +// PB // +// mmString UpdateInputOutputParameters(mmString p_psInOutParams); + +// PB // +// mmString GetFromUIReadableInputParameterName( mmString p_sTitle, +// mmString p_sDescription, +// mmString p_sParamName); + +// PB // +// mmString CreateNewOutputValueFromExistingUI(mmXML::mmXMLDocI* p_psXMLComplexCalculationPatternDefinition); +// mmString CreateNewOutputValueFromMixOfTwoExistingUI(mmXML::mmXMLDocI* p_psXMLComplexCalculationPatternDefinition); +// mmString CreateNewConstantInputValueUI(mmXML::mmXMLDocI* p_psXMLComplexCalculationPatternDefinition); +// mmString CreateNewConstantInputDecisionUI(void); + +// PB // +// void AddSingleCalculationMethodIntoPattern( mmString p_sCalculationMethodParams, +// mmXML::mmXMLDocI* p_psXMLComplexCalculationPatternDefinition); + + void LoadComplexPatternsFromFile(mmString p_sCPFile); +// PB // +// void SaveComplexPatternsIntoFile(mmString p_sCPFile); +// void AddComplexPatternIntoContainer(mmXML::mmXMLDocI* p_psXMLComplexCalculationPatternDefinition); +// void UpdateComplexPatternInContainer(mmXML::mmXMLDocI* p_psXMLComplexCalculationPatternDefinition); + + mmXML::mmXMLNodeI* GetComplexCalculationPatternDefinition(mmString p_sCCPIDName); + + mmXML::mmXMLNodeI* GetInputParamsOfCCPattern(mmString p_sCCPIDName); + mmXML::mmXMLNodeI* GetOutputParamsOfCCPattern(mmString p_sCCPIDName); + +// PB // +// void AddInternalWHILELoop(void); +// void AddInternalENDWHILELoop(void); +// void AddInternalCopyBinaryOutToInVariable(void); +// void AddInternalCopyIntOutToInVariable(void); +// void AddInternalCopyRealOutToInVariable(void); +// mmString GetUIDefinitionForInternalAction( mmString p_sInternalActionName, +// mmString p_sIAInParams, +// mmString p_sIAOutParams, +// bool* p_pbNoParams); +// mmString GetUIDefinitionForMultiSelectValues(mmString p_sUIData); +// void AddInternalMethodIntoPattern( mmString p_sInOutParams, +// mmXML::mmXMLDocI* p_psXMLComplexCalculationPatternDefinition); + +// PB // +// void InitializeCurrentComplexCalculationPatternExecution(void); + + bool ManageCurrentComplexCalculationPatternExecution(void); +// PB // +// void GetComplexCalculationPatternInputParamsFromUI(mmXML::mmXMLNodeI* p_psComplexCalculationDefinition); + + mmImages::mmImagesCalculationMethodI::sCalculationAutomationParams InitializeParamsOfSimpleCalculationMethod( mmXML::mmXMLNodeI* p_psXMLCalcPatternDefinition, + mmInt p_iCalculationMethodToInitializeID); +// PB // + void UpdateOutputParamsOfSimpleCalculationMethod( mmXML::mmXMLNodeI* p_psXMLCalcPatternDefinition, + mmInt p_iCalculationMethodToUpdateID); + + mmString GetValueOfParameter(mmXML::mmXMLNodeI* p_psXMLCalcPatternDefinition, + mmString p_sParamName); + void SetValueOfParameter(mmXML::mmXMLNodeI* p_psXMLCalcPatternDefinition, + mmString p_sParamName, + mmString p_sParamValue); + + public: + mmImagesComplexCalculationManagement( mmImages::mmImagesCalculationMethodContainerI* p_psImageCalculationMethodContainer, + mmImages::mmImagesCalculationManagement* p_psImageCalculationManagement, + mmLog::mmLogReceiverI *p_psLogReceiver); + //////////////////////////////////////////////////////////////////////////////// + /// Destructor. + //////////////////////////////////////////////////////////////////////////////// + ~mmImagesComplexCalculationManagement(); + + mmInt GetCountOfComplexCalculationPatterns(void); + mmImages::mmImagesComplexCalculationManagement::sComplexCalculationInfo GetComplexCalculationPatternInfo(mmInt p_iPatternID); + + void ExecuteComplexCalculationPattern( mmString p_sPatternIDName, + mmImages::mmImageStructureI* p_psImageStructure); + + void RegisterStateChangeReceiver(mmImagesComplexCalculationManagementStateChangeReceiverI* p_psStateChangeReceiver); + void UnregisterStateChangeReceiver(mmImagesComplexCalculationManagementStateChangeReceiverI* p_psStateChangeReceiver); + + bool IsCalculating(void); + + bool Execute(void); + void StopExecution(void); + bool IsExecuting(void); + mmReal GetProgress(void); + + mmString GetInputParamsOfComplexCalculationPattern(mmString p_sCCPIDName); + mmString GetOutputParamsOfComplexCalculationPattern(mmString p_sCCPIDName); + mmString SetInputParamsOfComplexCalculationPattern(mmString p_sCCPIDName, mmString p_sNewParams); + mmString SetOutputParamsOfComplexCalculationPattern(mmString p_sCCPIDName, mmString p_sNewParams); + }; +}; + +#endif diff --git a/proj/libcalc2d/include/images/mmImagesStructure.h b/proj/libcalc2d/include/images/mmImagesStructure.h new file mode 100644 index 0000000..39728a0 --- /dev/null +++ b/proj/libcalc2d/include/images/mmImagesStructure.h @@ -0,0 +1,136 @@ +//****************************************************************************** +//****************************************************************************** +// +// Images implementation +// +// Autor: Maciek Karaszewski +// Version: 2009.09.09 +// +// Description: This header defines implementation of +// mmImages::mmImagesStructure +// +//****************************************************************************** +//****************************************************************************** +#ifndef mmImagesStructureH +#define mmImagesStructureH + +#include +#include +#include + +#include + +namespace mmImages +{ + class mmLayer : public mmLayerI { + public: + mmLayer(mmString const & p_sName, mmUInt const p_iWidth, mmUInt const p_iHeight, mmReal const p_rDefaultValue, mmCallbackI * const p_psCallback); + ~mmLayer(void); + public: + void Resize(mmUInt const p_iWidth, mmUInt const p_iHeight); + public: // mmLayerI implementation + virtual mmUInt GetWidth(void) const; + virtual mmUInt GetHeight(void) const; + virtual mmReal GetDefaultValue(void) const; + + virtual mmStats GetStats(void) const; + + virtual mmString GetName(void) const; + virtual void SetName(mmString const & p_sName); + + virtual bool GetRows(mmUInt const p_iStart, mmUInt const p_iCount, mmReal p_prValues[]) const; + virtual bool SetRows(mmUInt const p_iStart, mmUInt const p_iCount, mmReal const p_prValues[]); + + virtual bool GetPixels(mmRect const & p_sRect, mmReal p_prValues[]) const; + virtual bool SetPixels(mmRect const & p_sRect, mmReal const p_prValues[]); + private: + mmUInt m_iWidth; + mmUInt m_iHeight; + mmString m_sName; + mmReal m_rDefaultValue; + mmReal * m_prValues; + mmStats m_sStats; + mmCallbackI * const m_psCallback; + mmSynchronize::mmReadWriteLockI * const m_psLock; + }; + + class mmImage : public mmImageI, private mmLayerI::mmCallbackI { + public: + mmImage(mmString const & p_sName, mmUInt const p_iWidth, mmUInt const p_iHeight, mmPixelType const p_ePixelType, mmImageI::mmCallbackI * const p_psCallback); + ~mmImage(void); + public: // mmImageI implementation + virtual mmUInt GetWidth(void) const; + virtual mmUInt GetHeight(void) const; + virtual void Resize(mmUInt const p_iWidth, mmUInt const p_iHeight); + + virtual mmPixelType GetPixelType(void) const; + + virtual mmString GetName(void) const; + virtual void SetName(mmString const & p_sName); + + virtual mmLayerI * GetChannel(mmUInt const p_iIndex) const; + + virtual bool GetRows(mmUInt const p_iStart, mmUInt const p_iCount, mmPixel8 p_psValues[]) const; + virtual bool GetRows(mmUInt const p_iStart, mmUInt const p_iCount, mmPixel24 p_psValues[]) const; + virtual bool GetRows(mmUInt const p_iStart, mmUInt const p_iCount, mmPixel32 p_psValues[]) const; + + virtual bool SetRows(mmUInt const p_iStart, mmUInt const p_iCount, mmPixel8 const p_psValues[]); + virtual bool SetRows(mmUInt const p_iStart, mmUInt const p_iCount, mmPixel24 const p_psValues[]); + virtual bool SetRows(mmUInt const p_iStart, mmUInt const p_iCount, mmPixel32 const p_psValues[]); + + virtual bool GetPixels(mmRect const & p_sRect, mmPixel8 p_psValues[]) const; + virtual bool GetPixels(mmRect const & p_sRect, mmPixel24 p_psValues[]) const; + virtual bool GetPixels(mmRect const & p_sRect, mmPixel32 p_psValues[]) const; + + virtual bool SetPixels(mmRect const & p_sRect, mmPixel8 const p_psValues[]); + virtual bool SetPixels(mmRect const & p_sRect, mmPixel24 const p_psValues[]); + virtual bool SetPixels(mmRect const & p_sRect, mmPixel32 const p_psValues[]); + + virtual void SetRegionOfInterest(mmRect const & p_sRegion); + virtual mmRect GetRegionOfInterest(void) const; + + virtual mmUInt CreateLayer(mmString const & p_sName, mmReal const p_rDefaultValue); + virtual mmUInt GetLayerCount(void) const; + virtual mmLayerI * GetLayer(mmUInt const p_iIndex) const; + virtual mmLayerI * GetLayer(mmString const & p_sName) const; + virtual bool DeleteLayer(mmUInt const p_iIndex); + virtual bool DeleteLayer(mmString const & p_sName); + + virtual void SetMetadata(mmString const & p_sMetadata); + virtual mmString GetMetadata(void); + private: // mmLayerI::mmCallbackI implementation + virtual void OnLayerCreate(mmLayerI * p_psLayer); + virtual void OnLayerDestroy(mmLayerI * p_psLayer); + virtual void OnLayerPropertiesChange(mmLayerI * p_psLayer); + virtual void OnLayerValuesChange(mmLayerI * p_psLayer); + private: + mmUInt m_iWidth; + mmUInt m_iHeight; + mmString m_sName; + mmPixelType m_ePixelType; + std::list m_sChannels; + std::list m_sLayers; + mmRect m_sRegionOfInterest; + mmString m_sMetadata; + mmImageI::mmCallbackI * const m_psCallback; + }; + + class mmImageStructure : public mmImageStructureI { + public: + mmImageStructure(mmImageI::mmCallbackI * const p_psCallback); + ~mmImageStructure(void); + public: // mmImageStructureI implementation + virtual mmUInt CreateImage(mmString const & p_sName, mmUInt const p_iWidth, mmUInt const p_iHeight, mmImageI::mmPixelType const p_ePixelType); + virtual mmUInt GetImageCount(void) const; + virtual mmImageI * GetImage(mmUInt const p_iIndex) const; + virtual mmImageI * GetImage(mmString const & p_sName) const; + virtual bool DeleteImage(mmUInt const p_iIndex); + virtual bool DeleteImage(mmString const & p_sName); + private: + std::list m_sImages; + mmImageI::mmCallbackI * m_psCallback; + }; +}; + +#endif + diff --git a/proj/libcalc2d/include/log/mmLogFile.h b/proj/libcalc2d/include/log/mmLogFile.h new file mode 100644 index 0000000..d4b2b38 --- /dev/null +++ b/proj/libcalc2d/include/log/mmLogFile.h @@ -0,0 +1,46 @@ +//****************************************************************************** +//****************************************************************************** +// +// Log File class +// +// +// Description: This class implements interface mmLogReceiverI and it supports +// file logging. +// +//****************************************************************************** +//****************************************************************************** +#ifndef mmLogFileH +#define mmLogFileH + +#include +#include + +namespace mmLog +{ + //////////////////////////////////////////////////////////////////////////////// + /// Implementation of log receiver interface for file logging. + //////////////////////////////////////////////////////////////////////////////// + class mmLogFile: public mmLogReceiverI + { + private: // fields + //////////////////////////////////////////////////////////////////////////////// + /// Pointer to file object where log information is stored. + //////////////////////////////////////////////////////////////////////////////// + mmFileIO::mmTextFileWriteI* m_psLogFile; + public: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Constructor. + /// + /// @param[in] p_sLogFileName name of log file to open + //////////////////////////////////////////////////////////////////////////////// + mmLogFile(mmString p_sLogFileName); + //////////////////////////////////////////////////////////////////////////////// + /// Destructor. + //////////////////////////////////////////////////////////////////////////////// + ~mmLogFile(); + + void SendLogMessage(eLogMessagePriority p_ePriority,mmString* p_psString); + }; +}; + +#endif diff --git a/proj/libcalc2d/include/log/mmLogRedirector.h b/proj/libcalc2d/include/log/mmLogRedirector.h new file mode 100644 index 0000000..ea043f4 --- /dev/null +++ b/proj/libcalc2d/include/log/mmLogRedirector.h @@ -0,0 +1,102 @@ +//****************************************************************************** +//****************************************************************************** +// +// Log Redirector class +// +// +// Description: This class is used for redirecting log messages from the +// system to log receivers clients like console, file, network +// log server, etc. +// +//****************************************************************************** +//****************************************************************************** +#ifndef mmLogRedirectorH +#define mmLogRedirectorH + +#include + +#include +#include +#include + +namespace mmLog +{ + //////////////////////////////////////////////////////////////////////////////// + /// Implements interface mmLog::mmLogReceiverI. It allows to register many log + /// receivers with their own log priorities. When redirector receive a log + /// message then it sends this message to all registered receivers. + //////////////////////////////////////////////////////////////////////////////// + class mmLogRedirector: public mmLogReceiverI + { + private: // definitions + //////////////////////////////////////////////////////////////////////////////// + /// Structure defining log receiver to forward log messages into. + //////////////////////////////////////////////////////////////////////////////// + typedef struct + { + //////////////////////////////////////////////////////////////////////////////// + /// Lowest priority for messages received by pReceiver object. + //////////////////////////////////////////////////////////////////////////////// + eLogMessagePriority ePriority; + //////////////////////////////////////////////////////////////////////////////// + /// Pointer to log receiver object, if NULL then receiver is not active. + //////////////////////////////////////////////////////////////////////////////// + mmLogReceiverI* pReceiver; + } sLogReceiver; + private: // fields + //////////////////////////////////////////////////////////////////////////////// + /// Vector with registered log receivers. + //////////////////////////////////////////////////////////////////////////////// + std::vector m_sReceiverTable; + //////////////////////////////////////////////////////////////////////////////// + /// Synchronize log redirector work. + //////////////////////////////////////////////////////////////////////////////// + mmSynchronize::mmExclusiveLockI* m_psExclusiveLock; + private: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Checks if p_pLogReceiver is registered already. + /// + /// @param[in] p_pLogReceiver pointer to log receiver object to check + /// @return TRUE if is registered already, FALSE otherwise. + //////////////////////////////////////////////////////////////////////////////// + bool IsRegistered(mmLogReceiverI* p_pLogReceiver); + //////////////////////////////////////////////////////////////////////////////// + /// Returns index with free field in m_sReceiverTable, if there is no free place + /// it creates new one and return its index. + /// + /// @return index of free field + //////////////////////////////////////////////////////////////////////////////// + mmInt GetFreeReceiverTableIndex(void); + public: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Constructor. + //////////////////////////////////////////////////////////////////////////////// + mmLogRedirector(); + //////////////////////////////////////////////////////////////////////////////// + /// Destructor. + //////////////////////////////////////////////////////////////////////////////// + ~mmLogRedirector(); + + //////////////////////////////////////////////////////////////////////////////// + /// Method registers new class for receiving log messages. If object is already + /// registered then throws mmError(mmeLogReceiverObjectAlreadyRegistered). + /// + /// @param[in] p_eMinPriority minimal priority of received messages for this log + /// receiver object + /// @param[in] p_pLogReceiver pointer to log object + //////////////////////////////////////////////////////////////////////////////// + void RegisterLogReceiver(eLogMessagePriority p_eMinPriority, + mmLogReceiverI* p_pLogReceiver); + //////////////////////////////////////////////////////////////////////////////// + /// Unregisters log receiver object. If object is not registered throws + /// mmError(mmeLogReceiverObjectIsNotRegistered). + /// + /// @param[in] p_pLogReceiver pointer to log receiver. + //////////////////////////////////////////////////////////////////////////////// + void UnregisterLogReceiver(mmLogReceiverI* p_pLogReceiver); + + void SendLogMessage(eLogMessagePriority p_ePriority,mmString* p_psString); + }; +}; + +#endif diff --git a/proj/libcalc2d/include/synchronize/mmSynchronizeWindowsImpl.h b/proj/libcalc2d/include/synchronize/mmSynchronizeWindowsImpl.h new file mode 100644 index 0000000..d15ebde --- /dev/null +++ b/proj/libcalc2d/include/synchronize/mmSynchronizeWindowsImpl.h @@ -0,0 +1,101 @@ +//****************************************************************************** +//****************************************************************************** +// +// Synchronization implementation for Windows systems +// +// +// Description: Implementation of synchronization behavior for Windows +// operating systems basing on CriticalSection +// +//****************************************************************************** +//****************************************************************************** +#ifndef mmSynchronizeWindowsImplH +#define mmSynchronizeWindowsImplH + +#include + +#include +#include + +namespace mmSynchronize +{ + //////////////////////////////////////////////////////////////////////////////// + /// Implements interface mmExclusiveLockI. It uses Windows CRITICAL_SECTION. + //////////////////////////////////////////////////////////////////////////////// + class mmExclusiveLockCSWindows: public mmExclusiveLockI, mmLog::mmLogSender + { + private: // fields + //////////////////////////////////////////////////////////////////////////////// + /// Windows critical section. + //////////////////////////////////////////////////////////////////////////////// + CRITICAL_SECTION m_sCriticalSection; + public: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Contructor initializes critical section object. + /// + /// @param[in] p_psLogReceiver pointer to mmLogReceiverI object. + //////////////////////////////////////////////////////////////////////////////// + mmExclusiveLockCSWindows(mmLog::mmLogReceiverI *p_psLogReceiver = NULL); + //////////////////////////////////////////////////////////////////////////////// + /// Destructor. In case of unlocked state throws error + /// mmError(mmeExclusiveLockUnlocked). + //////////////////////////////////////////////////////////////////////////////// + ~mmExclusiveLockCSWindows(); + + virtual bool TryLock(void); + virtual void Lock(void); + virtual void Unlock(void); + }; + + //////////////////////////////////////////////////////////////////////////////// + /// Implements interface mmReadWriteLockI. It uses mmExclusiveLockCSWindows + /// and supports functionality for multiple reads and single exclusive write. + //////////////////////////////////////////////////////////////////////////////// + class mmReadWriteLockCSWindows: public mmReadWriteLockI, mmLog::mmLogSender + { + private: // fields + //////////////////////////////////////////////////////////////////////////////// + /// Pointer to m5ExclusiveLockI object. This object is used for synchronizing + /// state of m_iReadWriteCount counter. + //////////////////////////////////////////////////////////////////////////////// + mmExclusiveLockI* m_psExclusiveLock; + //////////////////////////////////////////////////////////////////////////////// + /// Counter for synchronization state: = -1 - locked for write + /// = 0 - unlocked + /// = n - locked for read by n-threads + //////////////////////////////////////////////////////////////////////////////// + mmInt m_iReadWriteCount; + //////////////////////////////////////////////////////////////////////////////// + /// Defines if any object waits for write access (TRUE) or not (FALSE). + /// If TRUE then other objects waiting for read access are stopped. + //////////////////////////////////////////////////////////////////////////////// + bool m_bWaitForWriteLock; + public: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Constructor initializes state of object. If allocation error occurs + /// then throws exception mmError(mmeBadAlloc). + /// + ///@param[in] p_psLogReceiver pointer to mmLogReceiverI object. + //////////////////////////////////////////////////////////////////////////////// + mmReadWriteLockCSWindows(mmLog::mmLogReceiverI *p_psLogReceiver = NULL); + //////////////////////////////////////////////////////////////////////////////// + /// Destructor deinitialize m_psExclusiveLock object. In case of bad end + /// conditions throws exception (if m_iReadWriteCount!=0 then throws + /// mmError(mmeReadWriteLockBadEndLockCount), if m_bWaitForWriteLock=true then + /// throws mmError(mmeReadWriteLockWaitForWrite)). + //////////////////////////////////////////////////////////////////////////////// + ~mmReadWriteLockCSWindows(); + + virtual bool TryLockForRead(void); + virtual void LockForRead(void); + virtual void UnlockFromRead(void); + + virtual bool TryLockForWrite(void); + virtual void LockForWrite(void); + virtual void UnlockFromWrite(void); + + virtual mmInt GetLockState(bool* p_pbWaitForWrite); + }; +}; + +#endif diff --git a/proj/libcalc2d/include/thread/mmThreadWindowsImpl.h b/proj/libcalc2d/include/thread/mmThreadWindowsImpl.h new file mode 100644 index 0000000..98a731c --- /dev/null +++ b/proj/libcalc2d/include/thread/mmThreadWindowsImpl.h @@ -0,0 +1,82 @@ +//****************************************************************************** +//****************************************************************************** +// +// Thread class (Windows implementation) +// +// +// Description: Implementation of mmThreadI for Windows operating systems. +// +//****************************************************************************** +//****************************************************************************** +#ifndef mmThreadWindowsImplH +#define mmThreadWindowsImplH + +#include + +#include + +#include +#include +#include + +namespace mmThread +{ + //////////////////////////////////////////////////////////////////////////////// + /// This class implements mmThreads::mmThreadI interface. It uses Windows API. + //////////////////////////////////////////////////////////////////////////////// + class mmThreadWindows: public mmThreadI, mmLog::mmLogSender + { + private: // fields + //////////////////////////////////////////////////////////////////////////////// + /// Windows thread handle. + //////////////////////////////////////////////////////////////////////////////// + HANDLE m_hWinThreadHandle; + //////////////////////////////////////////////////////////////////////////////// + /// Thread state. + //////////////////////////////////////////////////////////////////////////////// + eStatus m_eThreadStatus; + //////////////////////////////////////////////////////////////////////////////// + /// Pointer to object with implementation mmThreadExecutionI which perform + /// thread calculation. + //////////////////////////////////////////////////////////////////////////////// + mmThreadExecutionI* m_psThreadExecutionClass; + //////////////////////////////////////////////////////////////////////////////// + /// Synchronize object for thread data. + //////////////////////////////////////////////////////////////////////////////// + mmSynchronize::mmExclusiveLockI* m_psExclusiveLock; + private: // methods + //////////////////////////////////////////////////////////////////////////////// + /// This method is always called during new thread creation. It calls + /// ThreadExecute method for mmThreadWindows object pointed by + /// p_pThreadClassPointer pointer. + /// + /// @param[in] p_pThreadClassPointer pointer to mmThreadWindows object + /// @return state of thread. + //////////////////////////////////////////////////////////////////////////////// + static DWORD WINAPI ThreadRedirectFunction(LPVOID p_pThreadClassPointer); + //////////////////////////////////////////////////////////////////////////////// + /// This method is called by ThreadRedirectFunction for call Execute method + /// from mmThreadExecutionI object stored in m_psThreadExecutionClass. + //////////////////////////////////////////////////////////////////////////////// + void ThreadExecute(void); + public: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Constructor. In case of allocation error it throws mmError(mmeBadAlloc). + /// + /// @param[in] p_psLogReceiver pointer to log object. + //////////////////////////////////////////////////////////////////////////////// + mmThreadWindows(mmLog::mmLogReceiverI *p_psLogReceiver = NULL); + //////////////////////////////////////////////////////////////////////////////// + /// Destructor. + //////////////////////////////////////////////////////////////////////////////// + ~mmThreadWindows(); + + void RegisterThreadExecutionClass(mmThreadExecutionI* p_psThreadExecutionObject); + void Run(void); + void Stop(void); + eStatus GetStatus(void); + mmReal GetProgress(void); + }; +}; + +#endif diff --git a/proj/libcalc2d/include/windows/mmDllSupport.h b/proj/libcalc2d/include/windows/mmDllSupport.h new file mode 100644 index 0000000..10caab6 --- /dev/null +++ b/proj/libcalc2d/include/windows/mmDllSupport.h @@ -0,0 +1,32 @@ +//****************************************************************************** +//****************************************************************************** +// +// DLL support for Windows OS class +// +// +// Description: This header defines useful functions for Windows OS using dlls. +// +//****************************************************************************** +//****************************************************************************** +#ifndef mmDLLSupportForWindowsOSH +#define mmDLLSupportForWindowsOSH + +#include + +namespace mmDLLSupport +{ + //////////////////////////////////////////////////////////////////////////////// + /// This function searches in DLL export table for specified symbol and returns + /// full exported symbol. + /// + /// @param[in] p_sDLLName DLL name with full path + /// @param[in] p_sName name of symbol + /// @return full name of symbol in DLL export table + //////////////////////////////////////////////////////////////////////////////// + mmString FindSymbolInDLLExportTable(mmString p_sDLLName, + mmString p_sName); +}; + +#endif + + diff --git a/proj/libcalc2d/include/xml/mmXMLBB.h b/proj/libcalc2d/include/xml/mmXMLBB.h new file mode 100644 index 0000000..d424075 --- /dev/null +++ b/proj/libcalc2d/include/xml/mmXMLBB.h @@ -0,0 +1,217 @@ +//****************************************************************************** +//****************************************************************************** +// +// MSXML2 XML implementation +// +// Description: These classes implement functionality of wotking with XML files +// and data. +// +//****************************************************************************** +//****************************************************************************** +#ifndef mmXMLBBH +#define mmXMLBBH +#define MADMAC +#include "interfaces\mmIXML.h" +#import named_guids +using namespace MSXML2; + + + +#ifdef MADMAC +#include +//#include +#endif + +namespace mmXML +{ + //////////////////////////////////////////////////////////////////////////////// + /// Implementation of mmXMLNodeI interface based on Borland objects. + //////////////////////////////////////////////////////////////////////////////// + class mmXMLNodeBB: public mmXMLNodeI +#ifdef MADMAC + , mmLog::mmLogSender +#endif + { + private: // fields + //////////////////////////////////////////////////////////////////////////////// + /// Node name. + //////////////////////////////////////////////////////////////////////////////// + mmString m_sNodeName; + //////////////////////////////////////////////////////////////////////////////// + /// Value of node. Used if vector of childs is empty. + //////////////////////////////////////////////////////////////////////////////// + mmString m_sNodeValue; + //////////////////////////////////////////////////////////////////////////////// + /// Vector with child nodes. + //////////////////////////////////////////////////////////////////////////////// + std::vector m_sChilds; + //////////////////////////////////////////////////////////////////////////////// + /// Vector with attributes of node. + //////////////////////////////////////////////////////////////////////////////// + std::vector m_sAttributes; + mmXML::mmXMLNodeI * m_psParent; + public: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Constructor. + /// + /// @param[in] p_psLogReceiver pointer to log object. + //////////////////////////////////////////////////////////////////////////////// +#ifdef MADMAC + mmXMLNodeBB(mmLog::mmLogReceiverI *p_psLogReceiver = NULL); +#else + mmXMLNodeBB(); +#endif + //////////////////////////////////////////////////////////////////////////////// + /// Destructor. + //////////////////////////////////////////////////////////////////////////////// + ~mmXMLNodeBB(); + + mmString GetName(void); + void SetName(mmString p_sName); + bool IsLeaf(void); + std::vector GetAttributes(void); + void AddAttribute(mmString p_sAttrName,mmString p_sAttrValue); +#ifdef MADMAC + void RemoveAttribute(mmString p_sAttrName); +#else + // bez wyjatkow, zwraca false jezeli wystapil blad + bool RemoveAttribute(mmString p_sAttrName); +#endif + void RemoveAllAttributes(void); + bool IsAttribute(mmString p_sAttrName); +#ifdef MADMAC + mmString GetAttributeValue(mmString p_sAttrName); +#else + // bez wyjatkow, zwraca pustego stringa w przypadku bledu + mmString GetAttributeValue(mmString p_sAttrName); +#endif + void SetAttributeValue(mmString p_sAttrName,mmString p_sAttrValue); + mmString GetText(void); + void SetText(mmString p_sText); + std::vector GetChilds(void); + mmXML::mmXMLNodeI* AddChild(mmString p_sChildName); + void AddChildWithStructure(mmXMLNodeI* p_psChildNode); + mmXML::mmXMLNodeI* FindChild(mmString p_sChildName); + mmXML::mmXMLNodeI* FindNextChild(mmXML::mmXMLNodeI* p_psCurrentChild, mmString p_sChildName); +#ifdef MADMAC + mmXML::mmXMLNodeI* GetChild(mmInt p_iChildIndex); + void RemoveChild(mmString p_sChildName); + void RemoveChild(mmInt p_iChildIndex); + +#else + // bez wyjatkow, zwraca NULL jezeli wystapil blad + mmXML::mmXMLNodeI* GetChild(mmInt p_iChildIndex); + // bez wyjatkow, zwraca false jezeli wystapil blad + bool RemoveChild(mmString p_sChildName); + // bez wyjatkow, zwraca false jezeli wystapil blad + bool RemoveChild(mmInt p_iChildIndex); +#endif + + void RemoveAllChilds(void); + mmXML::mmXMLNodeI* GetParent( void ); + mmXML::mmXMLNodeI* GetNextSibling( void ); + mmXML::mmXMLNodeI* GetPrevSibling( void ); + }; + + //////////////////////////////////////////////////////////////////////////////// + /// Implementation of mmXMLDocI interface. It uses Borland implementation. + //////////////////////////////////////////////////////////////////////////////// + class mmXMLDocBB: public mmXMLDocI +#ifdef MADMAC + ,mmLog::mmLogSender +#endif + { + private: // fields + //////////////////////////////////////////////////////////////////////////////// + /// XML document implemented by BB Team. + //////////////////////////////////////////////////////////////////////////////// + + //_di_IXMLDocument m_psXMLBBDoc; + MSXML2::IXMLDOMDocumentPtr m_psXMLBBDoc; + MSXML2::IXMLDOMElementPtr m_psDocRoot; + MSXML2::IXMLDOMNodePtr m_sCurrentNode; + //////////////////////////////////////////////////////////////////////////////// + /// Root node object. + //////////////////////////////////////////////////////////////////////////////// + mmXMLNodeBB m_sRootNode; + bool m_bOLEInitialized; + mmString m_sLastError; + + private: // methods + //////////////////////////////////////////////////////////////////////////////// + /// This method deletes XMLDocument and creates new one. Next, it fills + /// node structure into new XMLDocument. + //////////////////////////////////////////////////////////////////////////////// + void SaveNodeStructureIntoXMLDocument(void); + //////////////////////////////////////////////////////////////////////////////// + /// Method adds node with its children from XML structure into XMLDocument. + /// + /// @param[in] p_sBBNode XMLDocument node interface + /// @param[in] p_psMMNode XML structure element + //////////////////////////////////////////////////////////////////////////////// + //void FillXMLNodeIntoXMLDocument(_di_IXMLNode p_sBBNode,mmXMLNodeI* p_psMMNode); + void FillXMLNodeIntoXMLDocument(MSXML2::IXMLDOMNodePtr p_sBBNode,mmXMLNodeI* p_psMMNode); + //////////////////////////////////////////////////////////////////////////////// + /// Method returns formatted string representing XML structure. + /// + /// @return string with XML structure + //////////////////////////////////////////////////////////////////////////////// + mmString GetXMLFormattedString(void); + //////////////////////////////////////////////////////////////////////////////// + /// This method fills XML structure from XMLDocument. + //////////////////////////////////////////////////////////////////////////////// + void LoadNodeStructureFromXMLDocument(void); + //////////////////////////////////////////////////////////////////////////////// + /// Method fills node with its children from XMLDocument into XML structure. + /// + /// @param[in] p_sBBNode XMLDocument node interface + /// @param[in] p_psMMNode XML structure element + //////////////////////////////////////////////////////////////////////////////// +// void FillXMLNodeFromXMLDocument(_di_IXMLNode p_sBBNode,mmXMLNodeI* p_psMMNode); + void FillXMLNodeFromXMLDocument(MSXML2::IXMLDOMNodePtr p_sBBNode,mmXMLNodeI* p_psMMNode); + public: // methods + //////////////////////////////////////////////////////////////////////////////// + /// Constructor. + /// + /// @param[in] p_psLogReceiver pointer to log object. + //////////////////////////////////////////////////////////////////////////////// +#ifdef MADMAC + mmXMLDocBB(mmLog::mmLogReceiverI *p_psLogReceiver = NULL); +#else + mmXMLDocBB( ); +#endif + //////////////////////////////////////////////////////////////////////////////// + /// Destructor. + //////////////////////////////////////////////////////////////////////////////// + ~mmXMLDocBB(); + +#ifdef MADMAC + void ParseXMLFile(mmString p_sXMLFileName); + void ParseXMLBuffer(mmString p_sXMLBuffer); + void SaveToXMLFile(mmString p_sXMLFileName); + mmXMLNodeI* GetXMLRootNode(void); +#else + bool ParseXMLFile(mmString p_sXMLFileName); + bool ParseXMLBuffer(mmString p_sXMLBuffer); + bool SaveToXMLFile(mmString p_sXMLFileName); + mmXMLNodeI* GetXMLRootNode(void); + +#endif + + mmString SaveToXMLBuffer(void); + bool IsXMLStructureValid(void); + + void CreateXMLRootNode(mmString p_sRootNodeName); + void CopyXMLRootNodeStructure(mmXMLNodeI* p_psNode); + + + bool InitializeXML( void ); + void Load_XML_From_Buffer(mmString source); + bool Load_XML_Document(mmString strFileName); + void Reset_XML_Document(); + + + }; +}; + +#endif diff --git a/proj/libcalc2d/src/fileio/mmFileIOStd.cpp b/proj/libcalc2d/src/fileio/mmFileIOStd.cpp new file mode 100644 index 0000000..b402c52 --- /dev/null +++ b/proj/libcalc2d/src/fileio/mmFileIOStd.cpp @@ -0,0 +1,1630 @@ +#include + +#include + +#include +#include +#include + +#include +#include +#include +#include + +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +//// mmFileIO - funkcje globalne +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +mmInt mmFileIO::GetFilePosition(std::ifstream* p_psFile) +{ + return p_psFile->tellg(); +} + +mmInt mmFileIO::GetFilePosition(std::wifstream* p_psFile) +{ + return p_psFile->tellg(); +} + +mmInt mmFileIO::GetFilePosition(std::ofstream* p_psFile) +{ + return p_psFile->tellp(); +} + +mmInt mmFileIO::GetFilePosition(std::wofstream* p_psFile) +{ + return p_psFile->tellp(); +} + +void mmFileIO::SetFilePosition(std::ifstream* p_psFile,mmInt p_iFilePos) +{ + p_psFile->seekg(p_iFilePos,std::ios_base::beg); +} + +void mmFileIO::SetFilePosition(std::wifstream* p_psFile,mmInt p_iFilePos) +{ + p_psFile->seekg(p_iFilePos,std::ios_base::beg); +} + +void mmFileIO::SetFilePosition(std::ofstream* p_psFile,mmInt p_iFilePos) +{ + p_psFile->seekp(p_iFilePos,std::ios_base::beg); +} + +void mmFileIO::SetFilePosition(std::wofstream* p_psFile,mmInt p_iFilePos) +{ + p_psFile->seekp(p_iFilePos,std::ios_base::beg); +} + +mmInt mmFileIO::GetFileLenght(std::ifstream* p_psFile) +{ + // zapisuję aktualną pozycję + mmInt v_iActFilePos = GetFilePosition(p_psFile); + + // idę na koniec pliku + p_psFile->seekg(0,std::ios_base::end); + // pobieram pozycję końca pliku + mmInt v_iFileLenght = GetFilePosition(p_psFile); + + // wracam na położenie początkowe + p_psFile->seekg(v_iActFilePos,std::ios_base::beg); + + // zwaracam pozycję końca pliku + return v_iFileLenght; +} + +mmInt mmFileIO::GetFileLenght(std::wifstream* p_psFile) +{ + // zapisuję aktualną pozycję + mmInt v_iActFilePos = GetFilePosition(p_psFile); + + // idę na koniec pliku + p_psFile->seekg(0,std::ios_base::end); + // pobieram pozycję końca pliku + mmInt v_iFileLenght = GetFilePosition(p_psFile); + + // wracam na położenie początkowe + p_psFile->seekg(v_iActFilePos,std::ios_base::beg); + + // zwaracam pozycję końca pliku + return v_iFileLenght; +} + +mmInt mmFileIO::GetFileLenght(std::ofstream* p_psFile) +{ + // zapisuję aktualną pozycję + mmInt v_iActFilePos = GetFilePosition(p_psFile); + + // idę na koniec pliku + p_psFile->seekp(0,std::ios_base::end); + // pobieram pozycję końca pliku + mmInt v_iFileLenght = GetFilePosition(p_psFile); + + // wracam na położenie początkowe + p_psFile->seekp(v_iActFilePos,std::ios_base::beg); + + // zwaracam pozycję końca pliku + return v_iFileLenght; +} + +mmInt mmFileIO::GetFileLenght(std::wofstream* p_psFile) +{ + // zapisuję aktualną pozycję + mmInt v_iActFilePos = GetFilePosition(p_psFile); + + // idę na koniec pliku + p_psFile->seekp(0,std::ios_base::end); + // pobieram pozycję końca pliku + mmInt v_iFileLenght = GetFilePosition(p_psFile); + + // wracam na położenie początkowe + p_psFile->seekp(v_iActFilePos,std::ios_base::beg); + + // zwaracam pozycję końca pliku + return v_iFileLenght; +} + +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +//// mmFileIO::mmFileUtilsSTD +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +mmFileIO::mmFileUtilsSTD::mmFileUtilsSTD(mmLog::mmLogReceiverI *p_psLogReceiver): + mmLog::mmLogSender(L"mmFileIO::mmFileUtilsSTD",p_psLogReceiver) +{ + SendLogMessage(mmLog::debug,mmString(L"Start Constructor")); + + SendLogMessage(mmLog::debug,mmString(L"End Constructor")); +} + +mmFileIO::mmFileUtilsSTD::~mmFileUtilsSTD() +{ + SendLogMessage(mmLog::debug,mmString(L"Start Destructor")); + + SendLogMessage(mmLog::debug,mmString(L"End Destructor")); +} + +void mmFileIO::mmFileUtilsSTD::CreateDir(mmString p_sDirName) +{ + SendLogMessage(mmLog::debug,mmString(L"Start CreateDir Name=")+ + p_sDirName); + + try + { + mmOperatingSystem::CreateDir(p_sDirName); + } + catch(mmError &v_sErr) + { + switch(v_sErr.GetErrorCode()) + { + case mmeFileIOPermissionToFileDenied: + { + SendLogMessage(mmLog::critical,mmString(L"CreateDir PermissionDenied")); + }; + break; + case mmeFileIONoSuchFileOrDirectory: + { + SendLogMessage(mmLog::critical,mmString(L"CreateDir NoSuchFileOrDirectory")); + }; + break; + case mmeFileIOUnknownError: + { + SendLogMessage(mmLog::critical,mmString(L"CreateDir UnknownError")); + }; + break; + }; + + throw v_sErr; + }; + + SendLogMessage(mmLog::debug,mmString(L"End CreateDir")); +} + +void mmFileIO::mmFileUtilsSTD::CreateDirStructure(mmString p_sDirName) +{ + std::stack v_sDirStack; + mmString v_sActDir = p_sDirName; + + SendLogMessage(mmLog::debug,mmString(L"Start CreateDirStructure Name=")+ + p_sDirName); + + // tworzę stos katalogów do utworzenia + while(!IsExistingDir(v_sActDir)) + { + v_sDirStack.push(v_sActDir); + + v_sActDir.resize(v_sActDir.find_last_of(L"\\")); + }; + + // tworzę katalogi ze stosu + while(!v_sDirStack.empty()) + { + CreateDir(v_sDirStack.top()); + + v_sDirStack.pop(); + }; + + SendLogMessage(mmLog::debug,mmString(L"End CreateDirStructure")); +} + +void mmFileIO::mmFileUtilsSTD::ClearDir(mmString p_sDirName) +{ + SendLogMessage(mmLog::debug,mmString(L"Start ClearDir Name=")+ + p_sDirName); + + // pobieram informację o zawartości wybranego katalogu + std::vector v_sDirectoryElements = GetDirElements(p_sDirName,L"*.*"); + + // usuwam wszystkie elementy wektora v_sDirectoryElements + for(mmInt v_i=0;v_i(v_sDirectoryElements.size());v_i++) + { + if(v_sDirectoryElements[v_i].bFile) + { + SendLogMessage(mmLog::debug,mmString(L"ClearDir RemovingFile=") + + v_sDirectoryElements[v_i].sName); + + RemoveFile(p_sDirName + + mmString(L"\\") + + v_sDirectoryElements[v_i].sName); + } + else + { + SendLogMessage(mmLog::debug,mmString(L"ClearDir RemovingDir=") + + v_sDirectoryElements[v_i].sName); + + RemoveDir(p_sDirName + + mmString(L"\\") + + v_sDirectoryElements[v_i].sName, + true); + }; + }; + + SendLogMessage(mmLog::debug,mmString(L"End ClearDir")); +} + +void mmFileIO::mmFileUtilsSTD::RemoveDir(mmString p_sDirName, + bool p_bWithElements) +{ + SendLogMessage(mmLog::debug,mmString(L"Start RemoveDir Name=")+ + p_sDirName); + + if(p_bWithElements) + { + ClearDir(p_sDirName); + }; + + try + { + mmOperatingSystem::RemoveDir(p_sDirName); + } + catch(mmError &v_sErr) + { + switch(v_sErr.GetErrorCode()) + { + case mmeFileIOPermissionToFileDenied: + { + SendLogMessage(mmLog::critical,mmString(L"RemoveDir PermissionDenied")); + }; + break; + case mmeFileIONoSuchFileOrDirectory: + { + SendLogMessage(mmLog::critical,mmString(L"RemoveDir NoSuchFileOrDirectory")); + }; + break; + case mmeFileIOUnknownError: + { + SendLogMessage(mmLog::critical,mmString(L"RemoveDir UnknownError")); + }; + break; + }; + + throw v_sErr; + }; + + SendLogMessage(mmLog::debug,mmString(L"End RemoveDir")); +} + +bool mmFileIO::mmFileUtilsSTD::IsExistingDir(mmString p_sDirName) +{ + bool v_bExist; + + SendLogMessage(mmLog::debug,mmString(L"Start IsExistingDir Name=")+ + p_sDirName); + + try + { + v_bExist = mmOperatingSystem::IsExistingDir(p_sDirName); + } + catch(mmError &v_sErr) + { + switch(v_sErr.GetErrorCode()) + { + case mmeFileIOUnknownError: + { + SendLogMessage(mmLog::critical,mmString(L"IsExistingDir UnknownError")); + }; + break; + }; + + throw v_sErr; + }; + + SendLogMessage(mmLog::debug,mmString(L"End IsExistingDir Res=") + + mmStringUtilities::BoolToString(v_bExist)); + + return v_bExist; +} + +mmString mmFileIO::mmFileUtilsSTD::GetTemporaryDir(void) +{ + wchar_t* v_pcTemp; + + SendLogMessage(mmLog::debug,mmString(L"Start GetTemporaryDir")); + + v_pcTemp = _wgetenv(L"TEMP"); + if(v_pcTemp == NULL) + { + SendLogMessage(mmLog::critical,mmString(L"GetTemporaryDir No_TEMP_EnvironmentVariable")); + + throw mmError(mmeFileIONoTemporaryDirectory); + }; + + mmString v_sTempDir = v_pcTemp; + + SendLogMessage(mmLog::debug,mmString(L"End GetTemporaryDir Dir=")+ + v_sTempDir); + + return v_sTempDir; +} + +mmString mmFileIO::mmFileUtilsSTD::GetApplicationDir(void) +{ + mmString v_sAppDir; + + SendLogMessage(mmLog::debug,mmString(L"Start GetApplicationDir")); + + v_sAppDir = mmOperatingSystem::GetApplicationDirectory(); + + SendLogMessage(mmLog::debug,mmString(L"End GetApplicationDir")); + + return v_sAppDir; +} + +std::vector mmFileIO::mmFileUtilsSTD::GetDirElements(mmString p_sDirName, + mmString p_sDirWildcards) +{ + std::vector v_sDirElements; + + SendLogMessage(mmLog::debug,mmString(L"Start GetDirElements Name=")+ + p_sDirName); + + try + { + v_sDirElements = mmOperatingSystem::GetDirectoryElements(p_sDirName,p_sDirWildcards); + } + catch(mmError &v_sErr) + { + switch(v_sErr.GetErrorCode()) + { + case mmeFileIONoSuchFileOrDirectory: + { + SendLogMessage(mmLog::critical,mmString(L"GetDirElements NoSuchFileOrDirectory")); + }; + break; + case mmeFileIOUnknownError: + { + SendLogMessage(mmLog::critical,mmString(L"GetDirElements UnknownError")); + }; + break; + }; + + throw v_sErr; + }; + + SendLogMessage(mmLog::debug,mmString(L"End GetDirElements")); + + return v_sDirElements; +} + +bool mmFileIO::mmFileUtilsSTD::IsEmptyDir(mmString p_sDirName) +{ + bool v_bIsEmpty = false; + + SendLogMessage(mmLog::debug,mmString(L"Start IsEmptyDir Name=")+ + p_sDirName); + + std::vector v_sDirElements = GetDirElements(p_sDirName,L"*.*"); + if(v_sDirElements.size() == 0) + { + v_bIsEmpty = true; + }; + + SendLogMessage(mmLog::debug,mmString(L"End IsEmptyDir Res=") + + mmStringUtilities::BoolToString(v_bIsEmpty)); + + return v_bIsEmpty; +} + +void mmFileIO::mmFileUtilsSTD::RemoveFile(mmString p_sFileName) +{ + SendLogMessage(mmLog::debug,mmString(L"Start RemoveFile Name=")+ + p_sFileName); + + int v_iRes = _wremove(p_sFileName.c_str()); + if(v_iRes != 0) + { + switch(errno) + { + case EACCES: + { + SendLogMessage(mmLog::critical,mmString(L"RemoveFile PermissionDenied")); + + throw mmError(mmeFileIOPermissionToFileDenied); + }; + case ENOENT: + { + SendLogMessage(mmLog::critical,mmString(L"RemoveFile NoSuchFileOrDirectory")); + + throw mmError(mmeFileIONoSuchFileOrDirectory); + }; + default: + { + SendLogMessage(mmLog::critical,mmString(L"RemoveFile UnknownError")); + + throw mmError(mmeFileIOUnknownError); + }; + }; + }; + + SendLogMessage(mmLog::debug,mmString(L"End RemoveFile")); +} + +bool mmFileIO::mmFileUtilsSTD::IsExistingFile(mmString p_sFileName) +{ + SendLogMessage(mmLog::debug,mmString(L"Start IsExistingFile Name=")+ + p_sFileName); + + bool v_bIsExisting = mmOperatingSystem::IsExistingFile(p_sFileName); + + SendLogMessage(mmLog::debug,mmString(L"End IsExistingFile Res=") + + mmStringUtilities::BoolToString(v_bIsExisting)); + + return v_bIsExisting; +} + +mmString mmFileIO::mmFileUtilsSTD::GetPathToFile(mmString p_sFileName) +{ + mmString v_sPath; + + SendLogMessage(mmLog::debug,mmString(L"Start GetPathToFile Name=")+ + p_sFileName); + + v_sPath = p_sFileName.substr(0,p_sFileName.find_last_of(L"\\")); + + SendLogMessage(mmLog::debug,mmString(L"End GetPathToFile Path=")+ + v_sPath); + + return v_sPath; +} + +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +//// mmFileIO::mmTextFileReadSTD +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +mmFileIO::mmTextFileReadSTD::mmTextFileReadSTD(mmLog::mmLogReceiverI *p_psLogReceiver): + mmLog::mmLogSender(L"mmFileIO::mmTextFileReadSTD",p_psLogReceiver) +{ + SendLogMessage(mmLog::debug,mmString(L"Start Constructor")); + + // inicjalizuję pustym plikiem i niewykorzystaną pamięcią + m_psFile = NULL; + + SendLogMessage(mmLog::debug,mmString(L"End Constructor")); +} + +mmFileIO::mmTextFileReadSTD::~mmTextFileReadSTD() +{ + SendLogMessage(mmLog::debug,mmString(L"Start Destructor")); + + this->Close(); + + SendLogMessage(mmLog::debug,mmString(L"End Destructor")); +} + +void mmFileIO::mmTextFileReadSTD::Open(mmString p_sFileName) +{ + SendLogMessage(mmLog::debug,mmString(L"Start Open FileName=") + + p_sFileName); + + // jeśli poprzednio był otwarty to zamykam + this->Close(); + + // ustalam stan obiektu + m_sFileName = p_sFileName; + + // otwieram plik + try + { + m_psFile = new std::wifstream(p_sFileName.c_str()); + } + catch(std::bad_alloc) + { + SendLogMessage(mmLog::critical,mmString(L"Open ErrorAllocationMemory")); + + throw mmError(mmeBadAlloc); + }; + + if(!(*m_psFile)) + { + SendLogMessage(mmLog::critical,mmString(L"Open BadOpen")); + + throw mmError(mmeFileIOCantOpenFile); + }; + + SendLogMessage(mmLog::debug,mmString(L"End Open")); +} + +void mmFileIO::mmTextFileReadSTD::Close(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start Close")); + + delete m_psFile; + + // inicjalizuję pustym plikiem + m_psFile = NULL; + + SendLogMessage(mmLog::debug,mmString(L"End Close")); +} + +bool mmFileIO::mmTextFileReadSTD::ReadChar(wchar_t* p_pcChar) +{ + SendLogMessage(mmLog::debug,mmString(L"Start ReadChar")); + + // sprawdzam czy plik jest zainicjowany + if(m_psFile == NULL) + { + SendLogMessage(mmLog::critical,mmString(L"ReadChar NoFileOpened")); + + throw mmError(mmeFileIOFileIsNotOpened); + }; + + // sprawdzam stan pliku + if(!(*m_psFile)) + { + SendLogMessage(mmLog::critical,mmString(L"ReadChar FileError")); + + throw mmError(mmeFileIOCantReadFromFile); + } + else + { + // czytam znak + m_psFile->get(*p_pcChar); + + // sprawdzam stan pliku + if(!(*m_psFile)) + { + SendLogMessage(mmLog::debug,mmString(L"End ReadChar Failed")); + + return false; + }; + }; + + SendLogMessage(mmLog::debug,mmString(L"End ReadChar Success")); + + return true; +} + +bool mmFileIO::mmTextFileReadSTD::ReadLine(mmString* p_psFileLine) +{ + SendLogMessage(mmLog::debug,mmString(L"Start ReadLine")); + + // sprawdzam czy plik jest zainicjowany + if(m_psFile == NULL) + { + SendLogMessage(mmLog::critical,mmString(L"ReadLine NoFileOpened")); + + throw mmError(mmeFileIOFileIsNotOpened); + }; + + // sprawdzam stan pliku + if(!(*m_psFile)) + { + SendLogMessage(mmLog::critical,mmString(L"ReadLine FileError")); + + throw mmError(mmeFileIOCantReadFromFile); + } + else + { + wchar_t v_tcTempBuf[2048]; + + // czytam linię + m_psFile->getline(v_tcTempBuf,2048); + *p_psFileLine = v_tcTempBuf; + + // sprawdzam stan pliku + if(!(*m_psFile)) + { + SendLogMessage(mmLog::debug,mmString(L"End ReadLine Failed")); + + return false; + }; + }; + + SendLogMessage(mmLog::debug,mmString(L"End ReadLine Success")); + + return true; +} + +mmInt mmFileIO::mmTextFileReadSTD::ReadLines(std::vector* p_psLines, + mmInt p_iLinesCount) +{ + mmString v_sTempString; + mmInt v_iLinesRead = 0; + + SendLogMessage(mmLog::debug,mmString(L"Start ReadLines No=") + + mmStringUtilities::MMIntToString(p_iLinesCount)); + + while(v_iLinesRead < p_iLinesCount) + { + if(this->ReadLine(&v_sTempString)) + { + v_iLinesRead++; + p_psLines->push_back(v_sTempString); + } + else + { + break; + }; + }; + + SendLogMessage(mmLog::debug,mmString(L"End ReadLines No=") + + mmStringUtilities::MMIntToString(v_iLinesRead)); + + return v_iLinesRead; +} + +mmInt mmFileIO::mmTextFileReadSTD::GetLenght(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start GetLenght")); + + // sprawdzam czy plik jest zainicjowany + if(m_psFile == NULL) + { + SendLogMessage(mmLog::critical,mmString(L"GetLenght NoFileOpened")); + + throw mmError(mmeFileIOFileIsNotOpened); + }; + + mmInt v_iFileLenght = GetFileLenght(m_psFile); + + SendLogMessage(mmLog::debug,mmString(L"End GetLenght")); + + return v_iFileLenght; +} + +mmInt mmFileIO::mmTextFileReadSTD::ReadWholeFile(wchar_t* p_pcFileContent) +{ + mmInt v_iReadCount; + + SendLogMessage(mmLog::debug,mmString(L"Start ReadWholeFile")); + + // sprawdzam czy plik jest zainicjowany + if(m_psFile == NULL) + { + SendLogMessage(mmLog::critical,mmString(L"ReadWholeFile NoFileOpened")); + + throw mmError(mmeFileIOFileIsNotOpened); + }; + + // sprawdzam stan pliku + if(!(*m_psFile)) + { + SendLogMessage(mmLog::critical,mmString(L"ReadWholeFile FileErrorBefore")); + + // błąd - plik w stanie niewłaściwym + throw mmError(mmeFileIOCantReadFromFile); + } + else + { + // przechodzę na początek pliku + m_psFile->seekg(0); + + // czytam plik do bufora + //v_iReadCount = m_psFile->readsome(p_pcFileContent,GetFileLenght(m_psFile)); + v_iReadCount = GetFileLenght(m_psFile); + m_psFile->read(p_pcFileContent,v_iReadCount); + + // sprawdzam stan pliku po odczycie + if( ( (!(*m_psFile)) && (v_iReadCount == 0) ) || (m_psFile->bad()) ) + { + SendLogMessage(mmLog::critical,mmString(L"ReadWholeFile FileError")); + + throw mmError(mmeFileIOCantReadFromFile); + } + else + { + // usuwam failbit ze stanu strumienia + if(m_psFile->fail()) + { + m_psFile->setstate(m_psFile->rdstate()-std::ios_base::failbit); + }; + }; + }; + + SendLogMessage(mmLog::debug,mmString(L"End ReadWholeFile CharsReaded=") + + mmStringUtilities::MMIntToString(v_iReadCount)); + + return v_iReadCount; +} + +bool mmFileIO::mmTextFileReadSTD::Eof(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start Eof")); + + // sprawdzam czy plik jest zainicjowany + if(m_psFile == NULL) + { + SendLogMessage(mmLog::critical,mmString(L"Eof NoFileOpened")); + + throw mmError(mmeFileIOFileIsNotOpened); + }; + + bool v_bIsEof = m_psFile->eof(); + + SendLogMessage(mmLog::debug,mmString(L"End Eof Res=")+ + mmStringUtilities::BoolToString(v_bIsEof)); + + return v_bIsEof; +} + +bool mmFileIO::mmTextFileReadSTD::IsActiveFile(void) +{ + bool v_bIsActive = true; + + SendLogMessage(mmLog::debug,mmString(L"IsActiveFile")); + + // sprawdzam czy plik jest zainicjowany + if(m_psFile == NULL) + { + v_bIsActive = false; + }; + + SendLogMessage(mmLog::debug,mmString(L"End IsActiveFile Res=")+ + mmStringUtilities::BoolToString(v_bIsActive)); + + return v_bIsActive; +} + +mmInt mmFileIO::mmTextFileReadSTD::GetActualFilePosition(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start GetActualFilePosition")); + + // sprawdzam czy plik jest zainicjowany + if(m_psFile == NULL) + { + SendLogMessage(mmLog::critical,mmString(L"GetActualFilePosition NoFileOpened")); + + throw mmError(mmeFileIOFileIsNotOpened); + }; + + mmInt v_iActFilePos = GetFilePosition(m_psFile); + + SendLogMessage(mmLog::debug,mmString(L"End GetActualFilePosition")); + + return v_iActFilePos; +} + +mmString mmFileIO::mmTextFileReadSTD::GetFileName(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start GetFileName")); + + // sprawdzam czy plik jest zainicjowany + if(m_psFile == NULL) + { + SendLogMessage(mmLog::critical,mmString(L"GetFileName NoFileOpened")); + + throw mmError(mmeFileIOFileIsNotOpened); + }; + + SendLogMessage(mmLog::debug,mmString(L"End GetFileName")); + + return m_sFileName; +} + +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +//// mmFileIO::mmTextFileWriteSTD +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +mmFileIO::mmTextFileWriteSTD::mmTextFileWriteSTD(mmLog::mmLogReceiverI *p_psLogReceiver): + mmLog::mmLogSender(L"mmFileIO::mmTextFileWriteSTD",p_psLogReceiver) +{ + SendLogMessage(mmLog::debug,mmString(L"Start Constructor")); + + m_psFile = NULL; + + SendLogMessage(mmLog::debug,mmString(L"End Constructor")); +} + +mmFileIO::mmTextFileWriteSTD::~mmTextFileWriteSTD() +{ + SendLogMessage(mmLog::debug,mmString(L"Start Destructor")); + + this->Close(); + + SendLogMessage(mmLog::debug,mmString(L"End Destructor")); +} + +void mmFileIO::mmTextFileWriteSTD::Open(mmString p_sFileName, + eOpenFileMode p_eOpenMode) +{ + SendLogMessage(mmLog::debug,mmString(L"Start Open FileName=") + + p_sFileName); + + // jeśli poprzednio był otwarty to zamykam + this->Close(); + + // ustalam stan obiektu + m_sFileName = p_sFileName; + + std::string v_sFileName = mmStringUtilities::MMStringToCharString(m_sFileName); + + // otwieram plik + try + { + // jeśli zapisywanie od końca pliku + if(p_eOpenMode == append_for_write) + { + m_psFile = new std::wofstream(v_sFileName.c_str(),std::ios_base::app); + + SendLogMessage(mmLog::debug,mmString(L"Open MoveToEof")); + } + else + { + m_psFile = new std::wofstream(v_sFileName.c_str()); + }; + } + catch(std::bad_alloc) + { + SendLogMessage(mmLog::critical,mmString(L"Open ErrorAllocationMemory")); + + throw mmError(mmeBadAlloc); + }; + + if(!(*m_psFile)) + { + SendLogMessage(mmLog::critical,mmString(L"Open BadOpen")); + + throw mmError(mmeFileIOCantOpenFile); + }; + + SendLogMessage(mmLog::debug,mmString(L"End Open")); +} + +void mmFileIO::mmTextFileWriteSTD::Close(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start Close")); + + try + { + if(m_psFile != NULL) + { + Flush(); + + m_psFile->close(); + }; + } + catch(mmError &v_sErr) + { + // zamykam plik + delete m_psFile; + + throw v_sErr; + }; + + // zamykam plik + delete m_psFile; + + // inicjalizuję stan zmiennych + m_psFile = NULL; + + SendLogMessage(mmLog::debug,mmString(L"End Close")); +} + +void mmFileIO::mmTextFileWriteSTD::WriteChar(wchar_t p_cChar) +{ + SendLogMessage(mmLog::debug,mmString(L"Start WriteChar")); + + // sprawdzam czy plik jest zainicjowany + if(m_psFile == NULL) + { + SendLogMessage(mmLog::critical,mmString(L"WriteChar NoFileOpened")); + + throw mmError(mmeFileIOFileIsNotOpened); + }; + + // sprawdzam stan pliku + if(!(*m_psFile)) + { + SendLogMessage(mmLog::critical,mmString(L"WriteChar FileError")); + + throw mmError(mmeFileIOCantWriteToFile); + } + else + { + // zapisuję znak + m_psFile->write(&p_cChar,1); + + // sprawdzam stan pliku + if(!(*m_psFile)) + { + SendLogMessage(mmLog::critical,mmString(L"WriteChar Failed")); + + throw mmError(mmeFileIOCantWriteToFile); + }; + }; + + SendLogMessage(mmLog::debug,mmString(L"End WriteChar")); +} + +void mmFileIO::mmTextFileWriteSTD::WriteLine(mmString p_sFileLine) +{ + SendLogMessage(mmLog::debug,mmString(L"Start WriteLine")); + + // sprawdzam czy plik jest zainicjowany + if(m_psFile == NULL) + { + SendLogMessage(mmLog::critical,mmString(L"WriteLine NoFileOpened")); + + throw mmError(mmeFileIOFileIsNotOpened); + }; + + // sprawdzam stan pliku + if(!(*m_psFile)) + { + SendLogMessage(mmLog::critical,mmString(L"WriteLine FileError")); + + // błąd - plik w stanie niewłaściwym + throw mmError(mmeFileIOCantWriteToFile); + } + else + { + // zapisuję linię + (*m_psFile) << p_sFileLine; + (*m_psFile) << std::endl; + + // sprawdzam stan pliku + if(!(*m_psFile)) + { + SendLogMessage(mmLog::critical,mmString(L"WriteLine Failed")); + + throw mmError(mmeFileIOCantWriteToFile); + }; + }; + + SendLogMessage(mmLog::debug,mmString(L"End WriteLine")); +} + +void mmFileIO::mmTextFileWriteSTD::WriteLines(std::vector* p_psLines) +{ + SendLogMessage(mmLog::debug,mmString(L"Start WriteLines")); + + // sprawdzam czy wskaźnik pusty + if(p_psLines == NULL) + { + SendLogMessage(mmLog::debug,mmString(L"WriteLines NoLinesToSave")); + + return; + }; + + mmInt v_iLinesToWrite = static_cast(p_psLines->size()); + mmInt v_i; + + for(v_i=0;v_iWriteLine((*p_psLines)[v_i]); + }; + + SendLogMessage(mmLog::debug,mmString(L"End WriteLinesSuccess No=") + + mmStringUtilities::MMIntToString(v_iLinesToWrite)); +} + +void mmFileIO::mmTextFileWriteSTD::WriteBuffer(wchar_t const* p_pcBuffer,mmInt p_iBufferSize) +{ + SendLogMessage(mmLog::debug,mmString(L"Start WriteBuffer")); + + // sprawdzam czy plik jest zainicjowany + if(m_psFile == NULL) + { + SendLogMessage(mmLog::critical,mmString(L"WriteBuffer NoFileOpened")); + + throw mmError(mmeFileIOFileIsNotOpened); + }; + + // sprawdzam stan pliku + if(!(*m_psFile)) + { + SendLogMessage(mmLog::critical,mmString(L"WriteBuffer FileErrorBefore")); + + throw mmError(mmeFileIOCantWriteToFile); + } + else + { + // zapisuję bufor do pliku + m_psFile->write(p_pcBuffer,p_iBufferSize); + + // sprawdzam stan pliku po zapisie + if(!(*m_psFile)) + { + SendLogMessage(mmLog::critical,mmString(L"WriteBuffer FileError")); + + throw mmError(mmeFileIOCantWriteToFile); + }; + }; + + SendLogMessage(mmLog::debug,mmString(L"End WriteBuffer")); +} + +void mmFileIO::mmTextFileWriteSTD::WriteEol(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start WriteEol")); + + // sprawdzam czy plik jest zainicjowany + if(m_psFile == NULL) + { + SendLogMessage(mmLog::critical,mmString(L"WriteEol NoFileOpened")); + + throw mmError(mmeFileIOFileIsNotOpened); + }; + + // sprawdzam stan pliku + if(!(*m_psFile)) + { + SendLogMessage(mmLog::critical,mmString(L"WriteEol FileError")); + + throw mmError(mmeFileIOCantWriteToFile); + } + else + { + // zapisuję koniec linii + (*m_psFile) << std::endl; + + // sprawdzam stan pliku + if(!(*m_psFile)) + { + SendLogMessage(mmLog::critical,mmString(L"WriteEol Failed")); + + throw mmError(mmeFileIOCantWriteToFile); + }; + }; + + SendLogMessage(mmLog::debug,mmString(L"End WriteEol")); +} + +void mmFileIO::mmTextFileWriteSTD::Flush(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start Flush")); + + // sprawdzam czy plik jest zainicjowany + if(m_psFile == NULL) + { + SendLogMessage(mmLog::critical,mmString(L"Flush NoFileOpened")); + + throw mmError(mmeFileIOFileIsNotOpened); + }; + + // sprawdzam stan pliku + if(!(*m_psFile)) + { + SendLogMessage(mmLog::critical,mmString(L"Flush FileError")); + + throw mmError(mmeFileIOCantWriteToFile); + } + else + { + // zapisuję na dysk bufory + m_psFile->flush(); + + // sprawdzam stan pliku + if(!(*m_psFile)) + { + SendLogMessage(mmLog::critical,mmString(L"Flush Failed")); + + throw mmError(mmeFileIOCantWriteToFile); + }; + }; + + SendLogMessage(mmLog::debug,mmString(L"End Flush")); +} + +bool mmFileIO::mmTextFileWriteSTD::IsActiveFile(void) +{ + bool v_bIsActive = true; + + SendLogMessage(mmLog::debug,mmString(L"Start IsActiveFile")); + + // sprawdzam czy plik jest zainicjowany + if(m_psFile == NULL) + { + v_bIsActive = false; + }; + + SendLogMessage(mmLog::debug,mmString(L"End IsActiveFile Res=")+ + mmStringUtilities::BoolToString(v_bIsActive)); + + return v_bIsActive; +} + +mmString mmFileIO::mmTextFileWriteSTD::GetFileName(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start GetFileName")); + + // sprawdzam czy plik jest zainicjowany + if(m_psFile == NULL) + { + SendLogMessage(mmLog::critical,mmString(L"GetFileName NoFileOpened")); + + throw mmError(mmeFileIOFileIsNotOpened); + }; + + SendLogMessage(mmLog::debug,mmString(L"End GetFileName")); + + return m_sFileName; +} + +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +//// mmFileIO::mmBinaryFileReadSTD +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +mmFileIO::mmBinaryFileReadSTD::mmBinaryFileReadSTD(mmLog::mmLogReceiverI *p_psLogReceiver): + mmLog::mmLogSender(L"mmFileIO::mmBinaryFileReadSTD",p_psLogReceiver) +{ + SendLogMessage(mmLog::debug,mmString(L"Start Constructor")); + + // inicjalizuję pustym plikiem i niewykorzystaną pamięcią + m_psFile = NULL; + + SendLogMessage(mmLog::debug,mmString(L"End Constructor")); +} + +mmFileIO::mmBinaryFileReadSTD::~mmBinaryFileReadSTD() +{ + SendLogMessage(mmLog::debug,mmString(L"Start Destructor")); + + this->Close(); + + SendLogMessage(mmLog::debug,mmString(L"End Destructor")); +} + +void mmFileIO::mmBinaryFileReadSTD::Open(mmString p_sFileName) +{ + SendLogMessage(mmLog::debug,mmString(L"Start Open FileName=") + + p_sFileName); + + // jeśli poprzednio był otwarty to zamykam + this->Close(); + + // ustalam stan obiektu + m_sFileName = p_sFileName; + + // otwieram plik + try + { + m_psFile = new std::ifstream(mmStringUtilities::MMStringToCharString(p_sFileName).c_str(),std::ios_base::binary); + } + catch(std::bad_alloc) + { + SendLogMessage(mmLog::critical,mmString(L"Open ErrorAllocationMemory")); + + throw mmError(mmeBadAlloc); + }; + + if(!(*m_psFile)) + { + SendLogMessage(mmLog::critical,mmString(L"Open BadOpen")); + + throw mmError(mmeFileIOCantOpenFile); + }; + + SendLogMessage(mmLog::debug,mmString(L"End Open")); +} + +void mmFileIO::mmBinaryFileReadSTD::Close(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start Close")); + + delete m_psFile; + + // inicjalizuję pustym plikiem + m_psFile = NULL; + + SendLogMessage(mmLog::debug,mmString(L"End Close")); +} + +bool mmFileIO::mmBinaryFileReadSTD::ReadBuffer(void* p_pBuffer,mmInt p_iSize) +{ + SendLogMessage(mmLog::debug,mmString(L"Start ReadBuffer")); + + // sprawdzam czy plik jest zainicjowany + if(m_psFile == NULL) + { + SendLogMessage(mmLog::critical,mmString(L"ReadBuffer NoFileOpened")); + + throw mmError(mmeFileIOFileIsNotOpened); + }; + + // sprawdzam stan pliku + if(!(*m_psFile)) + { + SendLogMessage(mmLog::critical,mmString(L"ReadBuffer FileError")); + + throw mmError(mmeFileIOCantReadFromFile); + } + else + { + // czytam bufor + m_psFile->read(reinterpret_cast(p_pBuffer),p_iSize); + + // sprawdzam stan pliku + if(!(*m_psFile)) + { + SendLogMessage(mmLog::debug,mmString(L"End ReadBuffer Failed")); + + return false; + }; + }; + + SendLogMessage(mmLog::debug,mmString(L"End ReadBuffer Success")); + + return true; +} + +mmInt mmFileIO::mmBinaryFileReadSTD::GetLenght(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start GetLenght")); + + // sprawdzam czy plik jest zainicjowany + if(m_psFile == NULL) + { + SendLogMessage(mmLog::critical,mmString(L"GetLenght NoFileOpened")); + + throw mmError(mmeFileIOFileIsNotOpened); + }; + + mmInt v_iFileLenght = GetFileLenght(m_psFile); + + SendLogMessage(mmLog::debug,mmString(L"End GetLenght")); + + return v_iFileLenght; +} + +bool mmFileIO::mmBinaryFileReadSTD::Eof(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start Eof")); + + // sprawdzam czy plik jest zainicjowany + if(m_psFile == NULL) + { + SendLogMessage(mmLog::critical,mmString(L"Eof NoFileOpened")); + + throw mmError(mmeFileIOFileIsNotOpened); + }; + + bool v_bIsEof = m_psFile->eof(); + + SendLogMessage(mmLog::debug,mmString(L"End Eof Res=")+ + mmStringUtilities::BoolToString(v_bIsEof)); + + return v_bIsEof; +} + +bool mmFileIO::mmBinaryFileReadSTD::IsActiveFile(void) +{ + bool v_bIsActive = true; + + SendLogMessage(mmLog::debug,mmString(L"IsActiveFile")); + + // sprawdzam czy plik jest zainicjowany + if(m_psFile == NULL) + { + v_bIsActive = false; + }; + + SendLogMessage(mmLog::debug,mmString(L"End IsActiveFile Res=")+ + mmStringUtilities::BoolToString(v_bIsActive)); + + return v_bIsActive; +} + +mmInt mmFileIO::mmBinaryFileReadSTD::GetActualFilePosition(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start GetActualFilePosition")); + + // sprawdzam czy plik jest zainicjowany + if(m_psFile == NULL) + { + SendLogMessage(mmLog::critical,mmString(L"GetActualFilePosition NoFileOpened")); + + throw mmError(mmeFileIOFileIsNotOpened); + }; + + mmInt v_iActFilePos = GetFilePosition(m_psFile); + + SendLogMessage(mmLog::debug,mmString(L"End GetActualFilePosition")); + + return v_iActFilePos; +} + +void mmFileIO::mmBinaryFileReadSTD::SetActualFilePosition(mmInt p_iFilePos) +{ + SendLogMessage(mmLog::debug,mmString(L"Start SetActualFilePosition")); + + // sprawdzam czy plik jest zainicjowany + if(m_psFile == NULL) + { + SendLogMessage(mmLog::critical,mmString(L"SetActualFilePosition NoFileOpened")); + + throw mmError(mmeFileIOFileIsNotOpened); + }; + + SetFilePosition(m_psFile,p_iFilePos); + + // sprawdzam stan pliku + if(!(*m_psFile)) + { + SendLogMessage(mmLog::critical,mmString(L"SetActualFilePosition NoSuchPosition")); + + throw mmError(mmeFileIOBadFilePosition); + }; + + SendLogMessage(mmLog::debug,mmString(L"End SetActualFilePosition")); +} + +mmString mmFileIO::mmBinaryFileReadSTD::GetFileName(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start GetFileName")); + + // sprawdzam czy plik jest zainicjowany + if(m_psFile == NULL) + { + SendLogMessage(mmLog::critical,mmString(L"GetFileName NoFileOpened")); + + throw mmError(mmeFileIOFileIsNotOpened); + }; + + SendLogMessage(mmLog::debug,mmString(L"End GetFileName")); + + return m_sFileName; +} + +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +//// mmFileIO::mmBinaryFileWriteSTD +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +mmFileIO::mmBinaryFileWriteSTD::mmBinaryFileWriteSTD(mmLog::mmLogReceiverI *p_psLogReceiver): + mmLog::mmLogSender(L"mmFileIO::mmBinaryFileWriteSTD",p_psLogReceiver) +{ + SendLogMessage(mmLog::debug,mmString(L"Start Constructor")); + + m_psFile = NULL; + + SendLogMessage(mmLog::debug,mmString(L"End Constructor")); +} + +mmFileIO::mmBinaryFileWriteSTD::~mmBinaryFileWriteSTD() +{ + SendLogMessage(mmLog::debug,mmString(L"Start Destructor")); + + this->Close(); + + SendLogMessage(mmLog::debug,mmString(L"End Destructor")); +} + +void mmFileIO::mmBinaryFileWriteSTD::Open(mmString p_sFileName, + mmFileIO::eOpenFileMode p_eOpenMode) +{ + SendLogMessage(mmLog::debug,mmString(L"Start Open FileName=") + + p_sFileName); + + // jeśli poprzednio był otwarty to zamykam + this->Close(); + + // ustalam stan obiektu + m_sFileName = p_sFileName; + + // otwieram plik + try + { + // jeśli zapisywanie od końca pliku + if(p_eOpenMode == append_for_write) + { + m_psFile = new std::ofstream(p_sFileName.c_str(),std::ios_base::app|std::ios_base::binary); + + SendLogMessage(mmLog::debug,mmString(L"Open MoveToEof")); + } + else + { + m_psFile = new std::ofstream(p_sFileName.c_str(),std::ios_base::trunc|std::ios_base::binary); + }; + } + catch(std::bad_alloc) + { + SendLogMessage(mmLog::critical,mmString(L"Open ErrorAllocationMemory")); + + throw mmError(mmeBadAlloc); + }; + + if(!(*m_psFile)) + { + SendLogMessage(mmLog::critical,mmString(L"Open BadOpen")); + + throw mmError(mmeFileIOCantOpenFile); + }; + + SendLogMessage(mmLog::debug,mmString(L"End Open")); +} + +void mmFileIO::mmBinaryFileWriteSTD::Close(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start Close")); + + try + { + if(m_psFile != NULL) + { + Flush(); + }; + } + catch(mmError &v_sErr) + { + // zamykam plik + delete m_psFile; + + throw v_sErr; + }; + + // zamykam plik + delete m_psFile; + + // inicjalizuję stan zmiennych + m_psFile = NULL; + + SendLogMessage(mmLog::debug,mmString(L"End Close")); +} + +bool mmFileIO::mmBinaryFileWriteSTD::WriteBuffer(void* p_pBuffer,mmInt p_iSize) +{ + SendLogMessage(mmLog::debug,mmString(L"Start WriteBuffer")); + + // sprawdzam czy plik jest zainicjowany + if(m_psFile == NULL) + { + SendLogMessage(mmLog::critical,mmString(L"WriteBuffer NoFileOpened")); + + throw mmError(mmeFileIOFileIsNotOpened); + }; + + // sprawdzam stan pliku + if(!(*m_psFile)) + { + SendLogMessage(mmLog::critical,mmString(L"WriteBuffer FileError")); + + throw mmError(mmeFileIOCantReadFromFile); + } + else + { + // zapisuję bufor + m_psFile->write(reinterpret_cast(p_pBuffer),p_iSize); + + // sprawdzam stan pliku + if(!(*m_psFile)) + { + SendLogMessage(mmLog::debug,mmString(L"End WriteBuffer Failed")); + + return false; + }; + }; + + SendLogMessage(mmLog::debug,mmString(L"End WriteBuffer Success")); + + return true; +} + +mmInt mmFileIO::mmBinaryFileWriteSTD::GetLenght(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start GetLenght")); + + // sprawdzam czy plik jest zainicjowany + if(m_psFile == NULL) + { + SendLogMessage(mmLog::critical,mmString(L"GetLenght NoFileOpened")); + + throw mmError(mmeFileIOFileIsNotOpened); + }; + + mmInt v_iFileLenght = GetFileLenght(m_psFile); + + SendLogMessage(mmLog::debug,mmString(L"End GetLenght")); + + return v_iFileLenght; +} + +bool mmFileIO::mmBinaryFileWriteSTD::IsActiveFile(void) +{ + bool v_bIsActive = true; + + SendLogMessage(mmLog::debug,mmString(L"IsActiveFile")); + + // sprawdzam czy plik jest zainicjowany + if(m_psFile == NULL) + { + v_bIsActive = false; + }; + + SendLogMessage(mmLog::debug,mmString(L"End IsActiveFile Res=")+ + mmStringUtilities::BoolToString(v_bIsActive)); + + return v_bIsActive; +} + +mmInt mmFileIO::mmBinaryFileWriteSTD::GetActualFilePosition(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start GetActualFilePosition")); + + // sprawdzam czy plik jest zainicjowany + if(m_psFile == NULL) + { + SendLogMessage(mmLog::critical,mmString(L"GetActualFilePosition NoFileOpened")); + + throw mmError(mmeFileIOFileIsNotOpened); + }; + + mmInt v_iActFilePos = GetFilePosition(m_psFile); + + SendLogMessage(mmLog::debug,mmString(L"End GetActualFilePosition")); + + return v_iActFilePos; +} + +void mmFileIO::mmBinaryFileWriteSTD::SetActualFilePosition(mmInt p_iFilePos) +{ + SendLogMessage(mmLog::debug,mmString(L"Start SetActualFilePosition")); + + // sprawdzam czy plik jest zainicjowany + if(m_psFile == NULL) + { + SendLogMessage(mmLog::critical,mmString(L"SetActualFilePosition NoFileOpened")); + + throw mmError(mmeFileIOFileIsNotOpened); + }; + + SetFilePosition(m_psFile,p_iFilePos); + + // sprawdzam stan pliku + if(!(*m_psFile)) + { + SendLogMessage(mmLog::critical,mmString(L"SetActualFilePosition NoSuchPosition")); + + throw mmError(mmeFileIOBadFilePosition); + }; + + SendLogMessage(mmLog::debug,mmString(L"End SetActualFilePosition")); +} + +mmString mmFileIO::mmBinaryFileWriteSTD::GetFileName(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start GetFileName")); + + // sprawdzam czy plik jest zainicjowany + if(m_psFile == NULL) + { + SendLogMessage(mmLog::critical,mmString(L"GetFileName NoFileOpened")); + + throw mmError(mmeFileIOFileIsNotOpened); + }; + + SendLogMessage(mmLog::debug,mmString(L"End GetFileName")); + + return m_sFileName; +} + +void mmFileIO::mmBinaryFileWriteSTD::Flush(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start Flush")); + + // sprawdzam czy plik jest zainicjowany + if(m_psFile == NULL) + { + SendLogMessage(mmLog::critical,mmString(L"Flush NoFileOpened")); + + throw mmError(mmeFileIOFileIsNotOpened); + }; + + // sprawdzam stan pliku + if(!(*m_psFile)) + { + SendLogMessage(mmLog::critical,mmString(L"Flush FileError")); + + throw mmError(mmeFileIOCantWriteToFile); + } + else + { + // zapisuję na dysk bufory + m_psFile->flush(); + + // sprawdzam stan pliku + if(!(*m_psFile)) + { + SendLogMessage(mmLog::critical,mmString(L"Flush Failed")); + + throw mmError(mmeFileIOCantWriteToFile); + }; + }; + + SendLogMessage(mmLog::debug,mmString(L"End Flush")); +} + + diff --git a/proj/libcalc2d/src/images/mmCalcMethod.cpp b/proj/libcalc2d/src/images/mmCalcMethod.cpp new file mode 100644 index 0000000..6131e7c --- /dev/null +++ b/proj/libcalc2d/src/images/mmCalcMethod.cpp @@ -0,0 +1,318 @@ + +#pragma once + +#include +#include +#include +#include +#include + +mmImages::mmCalcMethod::mmCalcMethod(mmLog::mmLogReceiverI *p_psLogReceiver, + mmString p_sClassName): + mmLog::mmLogSender(p_sClassName,p_psLogReceiver) +{ + SendLogMessage(mmLog::debug,mmString(L"Start Constructor")); + + swprintf(m_sCMParams.sShortName, L"Generic calculation method"); + swprintf(m_sCMParams.sIDName, L"{C13390E5-EBA6-404d-8706-B07FFE01C52F}"); + swprintf(m_sCMParams.sDescription,L"Generic calculation method"); + m_sCMParams.bIsMultithreaded = true; + + m_psThreadSynchEL.reset(mmInterfaceInitializers::CreateExclusiveLock(NULL)); + + m_rProgress = 0.0; + m_bIsExecuting = false; + m_bStopExecution = false; + + m_psImageStructure = NULL; + + m_iRowsCountInBlock = 100; + + SendLogMessage(mmLog::debug,mmString(L"End Constructor")); +} +//--------------------------------------------------------------------------- +mmImages::mmCalcMethod::~mmCalcMethod() +{ + SendLogMessage(mmLog::debug,mmString(L"Start Destructor")); + + SendLogMessage(mmLog::debug,mmString(L"End Destructor")); +} +//--------------------------------------------------------------------------- +mmImages::mmImagesCalculationMethodI::sCalculationMethodParams mmImages::mmCalcMethod::GetCalculationMethodInfo(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start GetCalculationMethodInfo")); + + SendLogMessage(mmLog::debug,mmString(L"End GetCalculationMethodInfo")); + + return m_sCMParams; +} +//--------------------------------------------------------------------------- +void mmImages::mmCalcMethod::SetCalculationMethodParameters(mmImages::mmImageStructureI* p_psImageStructure, + mmImages::mmImagesCalculationMethodI::sCalculationAutomationParams* p_psAutomationParams) +{ + SendLogMessage(mmLog::debug,mmString(L"Start SetCalculationMethodParameters")); + + m_psImageStructure = p_psImageStructure; + + if (p_psAutomationParams != NULL) { + std::auto_ptr v_psXMLDoc(mmInterfaceInitializers::CreateXMLDocument()); + v_psXMLDoc->ParseXMLBuffer(p_psAutomationParams->sInParams); + for (mmUInt i = 0; i < m_vParameters.size(); ++i) { + mmXML::GetValue(v_psXMLDoc.get(), m_vParameters[i].m_sPosition, m_vParameters[i].m_pValue.get()); + } + } + + RetrieveParameters(); + m_rProgress = 0.0; + m_iThreadsCount = 0; + m_bFinishImage = false; + + // prepare map with first available row for each image + m_mNextRows.clear(); + std::vector v_sImageNames = GetImageNames(); + for (mmUInt i = 0; i < v_sImageNames.size(); ++i) { + m_mNextRows[v_sImageNames[i]] = 0; + } + + SendLogMessage(mmLog::debug,mmString(L"End SetCalculationMethodParameters")); +} +//--------------------------------------------------------------------------- +void mmImages::mmCalcMethod::UserAction(mmString p_sXMLParams) +{ + SendLogMessage(mmLog::debug,mmString(L"Start UserAction")); + + SendLogMessage(mmLog::debug,mmString(L"End UserAction")); +} +//--------------------------------------------------------------------------- +void mmImages::mmCalcMethod::UserAction(wchar_t* p_pcXMLParamsBuffer, mmInt p_iXMLParamsBufferSize) +{ + SendLogMessage(mmLog::debug,mmString(L"Start UserAction")); + + UserAction(p_pcXMLParamsBuffer); + + SendLogMessage(mmLog::debug,mmString(L"End UserAction")); +} +//--------------------------------------------------------------------------- +bool mmImages::mmCalcMethod::Execute(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start Execute")); + + bool v_bResult = Calculate(); + + SendLogMessage(mmLog::debug,mmString(L"End Execute")); + + return v_bResult; +} +//--------------------------------------------------------------------------- +void mmImages::mmCalcMethod::StopExecution(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start StopExecution")); + + m_bStopExecution = true; + + SendLogMessage(mmLog::debug,mmString(L"End StopExecution")); +} +//--------------------------------------------------------------------------- +bool mmImages::mmCalcMethod::IsExecuting(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start IsExecuting")); + + SendLogMessage(mmLog::debug,mmString(L"End IsExecuting")); + + return m_bIsExecuting; +} +//--------------------------------------------------------------------------- +mmReal mmImages::mmCalcMethod::GetProgress(void) +{ +// SendLogMessage(mmLog::debug,mmString(L"Start GetProgress")); + +// SendLogMessage(mmLog::debug,mmString(L"End GetProgress")); + + return m_rProgress; +} +//--------------------------------------------------------------------------- +void mmImages::mmCalcMethod::ForEachImage(mmCalcKernelI* p_psKernel) +{ + mmImageI* v_psLocalCurrentImage = NULL; + //mmInt v_iLocalCurrentImage = 0; + mmInt v_iBlockHeight = 0; + mmInt v_iNextRowIndex = 0; + mmInt v_iWidth = 0; + mmInt v_iHeight = 0; + mmInt v_iChannels = 0; + std::vector v_sImageNames = GetImageNames(); + bool v_bNewImage = false; + bool v_bFinishImage = false; + + m_psThreadSynchEL->Lock(); + m_iThreadsCount++; + v_iBlockHeight = m_iRowsCountInBlock; + m_psThreadSynchEL->Unlock(); + + for (mmUInt v_iIndex = 0; v_iIndex < m_psImageStructure->GetImageCount(); ++v_iIndex) { + + //m_psImageStructure->LockForRead(); + v_psLocalCurrentImage = m_psImageStructure->GetImage(v_iIndex); + //m_psImageStructure->UnlockFromRead(); + + m_psThreadSynchEL->Lock(); + v_iNextRowIndex = m_mNextRows[v_sImageNames[v_iIndex]]; + m_psThreadSynchEL->Unlock(); + + while (v_iNextRowIndex < v_iHeight) { + m_psThreadSynchEL->Lock(); + v_iNextRowIndex = m_mNextRows[v_sImageNames[v_iIndex]]; + m_mNextRows[v_sImageNames[v_iIndex]] += v_iBlockHeight; + m_rProgress = 100.0*((mmReal)v_iNextRowIndex/(mmReal)v_iHeight)*((mmReal)(v_iIndex + 1)/(mmReal)v_sImageNames.size()); + if (m_mNextRows[v_sImageNames[v_iIndex]] > v_iHeight) { + m_mNextRows[v_sImageNames[v_iIndex]] = v_iHeight; + v_iBlockHeight = v_iHeight - v_iNextRowIndex; + } + if (v_iNextRowIndex == 0) { + ExecBeforeSingleImageCalc(v_psLocalCurrentImage); + v_bNewImage = true; + m_bFinishImage = false; + } + else v_bNewImage = false; + m_psThreadSynchEL->Unlock(); + + (*p_psKernel)(v_psLocalCurrentImage, + v_iNextRowIndex, + v_iBlockHeight); + + m_psThreadSynchEL->Lock(); + v_iNextRowIndex = m_mNextRows[v_sImageNames[v_iIndex]]; + if (v_iNextRowIndex >= v_iHeight && !m_bFinishImage) { + v_bFinishImage = true; + m_bFinishImage = true; + ExecAfterSingleImageCalc(v_psLocalCurrentImage); + } + else { + v_bFinishImage = false; + } + m_psThreadSynchEL->Unlock(); + } + } + + m_psThreadSynchEL->Lock(); + m_iThreadsCount--; + /*if (m_iThreadsCount <= 0) { + m_psImageStructure->LockForRead(); + m_psImageStructure->UpdateImages(); + m_psImageStructure->UnlockFromRead(); + }*/ + m_psThreadSynchEL->Unlock(); +} + +void mmImages::mmCalcMethod::SetParam(mmString p_sName, mmXML::mmXMLDataType p_eType, void* p_psValue, bool p_bIsOutput) +{ + std::vector::iterator v_it; + for (v_it = m_vParameters.begin(); v_it != m_vParameters.end(); ++v_it) { + if (p_sName.compare((*v_it).m_sName) == 0) { + return; + } + } + mmCMParameter v_sParam(p_sName, p_eType, p_psValue, p_bIsOutput); + m_vParameters.push_back(v_sParam); +} + +const void* mmImages::mmCalcMethod::GetParam(mmString p_sName) +{ + std::vector::iterator v_it; + for (v_it = m_vParameters.begin(); v_it != m_vParameters.end(); ++v_it) { + if (p_sName.compare((*v_it).m_sName) == 0) { + return (*v_it).m_pValue.get(); + } + } + return NULL; +} + +void mmImages::mmCalcMethod::GetParam(mmString p_sName, void* p_pValue) +{ + std::vector::iterator v_it; + + for (v_it = m_vParameters.begin(); v_it != m_vParameters.end(); ++v_it) { + if (p_sName.compare((*v_it).m_sName) == 0) { + switch ((*v_it).m_eType) { + case mmXML::g_eXMLReal: + *(reinterpret_cast(p_pValue)) = *(reinterpret_cast((*v_it).m_pValue.get())); + return; + case mmXML::g_eXMLInt: + *(reinterpret_cast(p_pValue)) = *(reinterpret_cast((*v_it).m_pValue.get())); + return; + case mmXML::g_eXMLBool: + *(reinterpret_cast(p_pValue)) = *(reinterpret_cast((*v_it).m_pValue.get())); + return; + case mmXML::g_eXMLString: + case mmXML::g_eXMLImageName: + case mmXML::g_eXMLDataLayerName: + *(reinterpret_cast(p_pValue)) = *(reinterpret_cast((*v_it).m_pValue.get())); + return; + } + } + } +} + +void mmImages::mmCalcMethod::UpdateParameters() +{ + // create XML document which stores input automation options + std::auto_ptr v_psXMLInDoc(mmInterfaceInitializers::CreateXMLDocument(GetLogReceiver())); + mmXML::mmXMLPositionedNode v_sXMLInRootPosNode = mmXML::CreateAutomationInput(v_psXMLInDoc.get()); + + // create XML document which stores output automation options + std::auto_ptr v_psXMLOutDoc(mmInterfaceInitializers::CreateXMLDocument(GetLogReceiver())); + mmXML::mmXMLPositionedNode v_sXMLOutRootPosNode = mmXML::CreateAutomationOutput(v_psXMLOutDoc.get()); + + std::vector::iterator v_it; + for (v_it = m_vParameters.begin(); v_it != m_vParameters.end(); ++v_it) { + if ((*v_it).m_bIsOutput) { + (*v_it).m_sPosition = mmXML::AddParam(&v_sXMLOutRootPosNode, + (*v_it).m_sName, + (*v_it).m_eType, + (*v_it).m_pValue.get()); + } + else { + (*v_it).m_sPosition = mmXML::AddParam(&v_sXMLInRootPosNode, + (*v_it).m_sName, + (*v_it).m_eType, + (*v_it).m_pValue.get()); + } + } + + mmXML::CopyInputParams(v_psXMLInDoc.get(), &m_sCMParams.sAutoParams); + mmXML::CopyOutputParams(v_psXMLOutDoc.get(), &m_sCMParams.sAutoParams); +} + +std::vector mmImages::mmCalcMethod::GetImageNames() +{ + std::vector v_vResultCloudNames; + + // TODO: to trzeba zrobic jakos ladniej jesli uzupelniona zostanie funkcja GetXMLParameters() + + //m_psImageStructure->LockForRead(); + mmUInt v_iImageCount = m_psImageStructure->GetImageCount(); + for(mmUInt i = 0; i < v_iImageCount; ++i) { + v_vResultCloudNames.push_back(m_psImageStructure->GetImage(i)->GetName()); + } + //m_psImageStructure->UnlockFromRead(); + + return v_vResultCloudNames; +} + +std::vector mmImages::mmCalcMethod::GetDLNames(mmUInt const p_iImage) +{ + std::vector v_sResultDLNames; + + mmImageI* v_psImage = m_psImageStructure->GetImage(p_iImage); + if(! v_psImage) + return v_sResultDLNames; + + //v_psImage->LockForRead(); + mmUInt v_iDLCount = v_psImage->GetLayerCount(); + for(mmUInt i = 0; i < v_iDLCount; ++i) { + v_sResultDLNames.push_back(v_psImage->GetLayer(i)->GetName()); + } + //v_psImage->UnlockFromRead(); + + return v_sResultDLNames; +} diff --git a/proj/libcalc2d/src/images/mmImagesCalculationManagement.cpp b/proj/libcalc2d/src/images/mmImagesCalculationManagement.cpp new file mode 100644 index 0000000..a93cfcd --- /dev/null +++ b/proj/libcalc2d/src/images/mmImagesCalculationManagement.cpp @@ -0,0 +1,255 @@ +#include + +#include +#include + + + +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +//// mmImages::mmImagesCalculationManagement +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +mmImages::mmImagesCalculationManagement::mmImagesCalculationManagement(mmInt p_iCalcThreadCount, mmLog::mmLogReceiverI *p_psLogReceiver = NULL): + mmLog::mmLogSender(L"mmImages::mmImagesCalculationManagement",p_psLogReceiver) +{ + SendLogMessage(mmLog::debug,mmString(L"Start Constructor")); + + + m_bIsActiveCalculation = false; + m_iCalculationThreadCount = p_iCalcThreadCount; + + m_iThreadExecutionSleepTime = 10; + //m_psControlThread = mmInterfaceInitializers::CreateDefaultThread(GetLogReceiver()); + m_psControlThread = mmInterfaceInitializers::CreateDefaultThread(NULL); + m_psControlThread->RegisterThreadExecutionClass(this); + m_psControlThread->Run(); + + SendLogMessage(mmLog::debug,mmString(L"End Constructor")); +} + +mmImages::mmImagesCalculationManagement::~mmImagesCalculationManagement() +{ + SendLogMessage(mmLog::debug,mmString(L"Start Destructor")); + + m_psControlThread->Stop(); + while(m_psControlThread->GetStatus() != mmThread::mmThreadI::finished) + { + mmOperatingSystem::StopThread(1); + }; + delete m_psControlThread; + + SendLogMessage(mmLog::debug,mmString(L"End Destructor")); +} + + +void mmImages::mmImagesCalculationManagement::StopRunningThreads(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start StopRunningThreads")); + + mmInt v_iActiveThreadCount = m_vRunningThreads.size(); + for(mmInt v_iT=0;v_iTStop(); + }; + + SendLogMessage(mmLog::debug,mmString(L"End StopRunningThreads")); +} + +bool mmImages::mmImagesCalculationManagement::IsCalculating(void) +{ +// SendLogMessage(mmLog::debug,mmString(L"Start IsCalculating")); + +// SendLogMessage(mmLog::debug,mmString(L"End IsCalculating")); + + return m_bIsActiveCalculation; +} + + +void mmImages::mmImagesCalculationManagement::CalculateImages( mmImages::mmImagesCalculationMethodI* p_psImagesCalculationMethod, + mmImages::mmImageStructureI* p_psImageStructure, + mmImages::mmImagesCalculationMethodI::sCalculationAutomationParams* p_psAutomationParams) +{ + SendLogMessage(mmLog::debug,mmString(L"Start CalculateImages")); + + p_psImagesCalculationMethod->SetCalculationMethodParameters( p_psImageStructure, + p_psAutomationParams); + + m_bIsActiveCalculation = true; + + m_psImageStructure = p_psImageStructure; + if(p_psImagesCalculationMethod->GetCalculationMethodInfo().bIsMultithreaded) + { + //m_psImageStructure->InitializeForMultithreadedCalculation(m_iCalculationThreadCount); + + for(mmInt v_iT=0;v_iTRegisterThreadExecutionClass(p_psImagesCalculationMethod); + v_psThread->Run(); + + m_vRunningThreads.push_back(v_psThread); + }; + } + else + { + //m_psImageStructure->InitializeForMultithreadedCalculation(1); + + mmThread::mmThreadI* v_psThread = mmInterfaceInitializers::CreateDefaultThread(NULL); + v_psThread->RegisterThreadExecutionClass(p_psImagesCalculationMethod); + v_psThread->Run(); + + m_vRunningThreads.push_back(v_psThread); + }; + + SendLogMessage(mmLog::debug,mmString(L"End CalculateImages")); +} + +bool mmImages::mmImagesCalculationManagement::Execute(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start Execute")); + + mmInt v_iThreadExecutionProgressUpdateFromLastTime = 0; + + mmReal v_rPrevProgress = 0.0; + + mmReal v_rCalculationStart = 0.0; + + m_bTerminateControlThreadExecution = false; + + while(!m_bTerminateControlThreadExecution) + { + if(m_bIsActiveCalculation) + { + mmInt v_iActiveThreadCount = m_vRunningThreads.size(); + mmInt v_iWorkingThreadCount = 0; + + // check working threads + if(v_iActiveThreadCount > 0) + { + mmReal v_rProgress = 0.0; + bool v_bIsCalculating = false; + for(mmInt v_iT=0;v_iTGetStatus(); + + if( (v_eTS != mmThread::mmThreadI::stopped) && + (v_eTS != mmThread::mmThreadI::finished) ) + { + v_bIsCalculating = true; + v_iWorkingThreadCount++; + }; + + v_rProgress += m_vRunningThreads[v_iT]->GetProgress(); + }; + //v_rProgress = v_rProgress/static_cast(v_iActiveThreadCount); + v_rProgress = v_rProgress/static_cast(v_iWorkingThreadCount); + //v_rProgress = m_vRunningThreads[0]->GetProgress(); + if(v_rProgress >= v_rPrevProgress) + { + v_rPrevProgress = v_rProgress; + m_rProgress = v_rProgress; + } + else + { + v_rProgress = v_rPrevProgress; + m_rProgress = v_rPrevProgress; + }; + + + if(!v_bIsCalculating) + { + + + mmReal v_rActCalculationTime = mmOperatingSystem::GetApplicationTime(); + mmReal v_rElapsed = v_rActCalculationTime - v_rCalculationStart; + + SendLogMessage(mmLog::user,mmString(L"Operation ") + mmString(L": ") + + mmStringUtilities::MMRealToString(v_rElapsed,3) + mmString(L"s")); + + + for(mmInt v_iT=0;v_iTDeinitializeForMultithreadedCalculation(); + + m_bIsActiveCalculation = false; + }; + }; + }; + + mmOperatingSystem::StopThread(m_iThreadExecutionSleepTime); + + v_iThreadExecutionProgressUpdateFromLastTime += m_iThreadExecutionSleepTime; + }; + + SendLogMessage(mmLog::debug,mmString(L"End Execute")); + + return true; +} + +void mmImages::mmImagesCalculationManagement::StopExecution(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start StopExecution")); + + m_bTerminateControlThreadExecution = true; + + SendLogMessage(mmLog::debug,mmString(L"End StopExecution")); +} + +bool mmImages::mmImagesCalculationManagement::IsExecuting(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start IsExecuting")); + + SendLogMessage(mmLog::debug,mmString(L"End IsExecuting")); + + return !m_bTerminateControlThreadExecution; +} + +mmReal mmImages::mmImagesCalculationManagement::GetProgress(void) +{ +// SendLogMessage(mmLog::debug,mmString(L"Start GetProgress")); +// +// SendLogMessage(mmLog::debug,mmString(L"End GetProgress")); + + return m_rProgress; +} + +void mmImages::mmImagesCalculationManagement::UserAction(mmString p_sXMLParams) +{ + SendLogMessage(mmLog::debug,mmString(L"Start UserAction")); + + // create XML document which specifies user action response + mmXML::mmXMLDocI* v_psXMLDoc = mmInterfaceInitializers::CreateXMLDocument(this->GetLogReceiver()); + v_psXMLDoc->ParseXMLBuffer(p_sXMLParams); + mmXML::mmXMLNodeI* v_psUIRootNode = v_psXMLDoc->GetXMLRootNode(); + +// // parsing user actions +// mmString v_sUserActionID = v_psUIRootNode->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText(); +// +// if(v_sUserActionID.compare(mmImages::g_pXML_Progress_CancelButton) == 0) +// { +// // stop threads +// StopRunningThreads(); +// }; + + SendLogMessage(mmLog::debug,mmString(L"End UserAction")); +} + +void mmImages::mmImagesCalculationManagement::UserAction(wchar_t* p_pcXMLParamsBuffer, mmInt p_iXMLParamsBufferSize ) +{ + SendLogMessage(mmLog::debug,mmString(L"Start UserAction")); + + UserAction(p_pcXMLParamsBuffer); + + SendLogMessage(mmLog::debug,mmString(L"End UserAction")); +} + diff --git a/proj/libcalc2d/src/images/mmImagesCalculationMethodContainerWindows.cpp b/proj/libcalc2d/src/images/mmImagesCalculationMethodContainerWindows.cpp new file mode 100644 index 0000000..eeb3d30 --- /dev/null +++ b/proj/libcalc2d/src/images/mmImagesCalculationMethodContainerWindows.cpp @@ -0,0 +1,163 @@ +#include + +#include +#include +#include +#include + +#include +#include + +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +//// mmImages::mmImagesCalculationMethodContainerForWindows +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +mmImages::mmImagesCalculationMethodContainerForWindows::mmImagesCalculationMethodContainerForWindows(mmLog::mmLogReceiverI *p_psLogReceiver): mmLog::mmLogSender(L"mmImages::mmImagesCalculationMethodContainerForWindows",p_psLogReceiver) +{ + SendLogMessage(mmLog::debug,mmString(L"Start Constructor")); + + SearchForDLLLibraries(); + SearchForImagesCalculationMethodsInDLLLibraries(); + + SendLogMessage(mmLog::debug,mmString(L"End Constructor")); +} + +mmImages::mmImagesCalculationMethodContainerForWindows::~mmImagesCalculationMethodContainerForWindows() +{ + SendLogMessage(mmLog::debug,mmString(L"Start Destructor")); + + SendLogMessage(mmLog::debug,mmString(L"End Destructor")); +} + +std::vector mmImages::mmImagesCalculationMethodContainerForWindows::GetAvailableImagesCalculationMethods(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start GetAvailableImagesCalculationMethods")); + + std::vector v_vDefsOfKnownImagesCalculationMethods; + + mmInt v_iDLL,v_iImp,v_iImpCount; + mmInt v_iDLLCount = m_vAvailableDLLs.size(); + for(v_iDLL=0;v_iDLLGetLogReceiver()); + + // clear existing detectors definition + m_vAvailableDLLs.clear(); + + sImagesCalculationMethodInDLL v_sDLLDef; + + mmString v_sAppDir = v_psFileUtils->GetApplicationDir(); + std::vector v_vApplicationDirElements = v_psFileUtils->GetDirElements(v_sAppDir,L"*.dll"); + + mmInt v_iTemp; + mmInt v_iDirElementsCount = v_vApplicationDirElements.size(); + for(v_iTemp=0;v_iTemp 0) + { + HINSTANCE v_hDLL = LoadLibrary(m_vAvailableDLLs[v_iTemp].sDLLName.c_str()); + + mmString v_sDLLNameTemp = m_vAvailableDLLs[v_iTemp].sDLLName; + + mmDLLGetSupportedImagesCalculationMethodCount v_pfGetSupportedImagesCalculationMethodsCount = (mmDLLGetSupportedImagesCalculationMethodCount)GetProcAddress(v_hDLL, + mmStringUtilities::MMStringToCharString(v_sSymbolDLL_ImagesCalculationMethodsCount).c_str()); + + mmDLLGetSupportedImagesCalculationMethodDef v_pfGetSupportedImagesCalculationMethodDef = (mmDLLGetSupportedImagesCalculationMethodDef)GetProcAddress(v_hDLL, + mmStringUtilities::MMStringToCharString(v_sSymbolDLL_ImagesCalculationMethodDef).c_str()); + + if(v_pfGetSupportedImagesCalculationMethodsCount != NULL) + { + mmImages::mmImagesCalculationMethodI::sCalculationMethodParams v_sCMP; + mmInt v_iImp; + mmInt v_iImpCount = v_pfGetSupportedImagesCalculationMethodsCount(); + //char v_pcTemp[256]; + + for(v_iImp=0;v_iImp + +#include +#include +#include + +mmImages::mmImagesCalculationMethodDLLBroker::mmImagesCalculationMethodDLLBroker(mmString p_sDLLName, + mmString p_sImagesCalculationMethodName, + + mmLog::mmLogReceiverI *p_psLogReceiver): + mmLog::mmLogSender(L"mmImages::mmImagesCalculationMethodDLLBroker",p_psLogReceiver) +{ + SendLogMessage(mmLog::debug,mmString(L"Start Constructor")); + + // restoring functions symbols from DLL + mmString v_sDLLSymbol_mmDLLImagesCalculationMethod_Create = mmDLLSupport::FindSymbolInDLLExportTable(p_sDLLName, + L"mmDLLCreateImagesCalculationMethod"); + mmString v_sDLLSymbol_mmDLLImagesCalculationMethod_Destroy = mmDLLSupport::FindSymbolInDLLExportTable(p_sDLLName, + L"mmDLLDestroyImagesCalculationMethod"); + + // loading images calculation method dll + m_hDLLHandle = LoadLibrary(p_sDLLName.c_str()); + + // storing pointer to images calculation method functions + m_psDLLImagesCalculationMethod_Create = (mmDLLImagesCalculationMethod_Create)GetProcAddress(m_hDLLHandle, + mmStringUtilities::MMStringToCharString(v_sDLLSymbol_mmDLLImagesCalculationMethod_Create).c_str()); + m_psDLLImagesCalculationMethod_Destroy = (mmDLLImagesCalculationMethod_Destroy)GetProcAddress(m_hDLLHandle, + mmStringUtilities::MMStringToCharString(v_sDLLSymbol_mmDLLImagesCalculationMethod_Destroy).c_str()); + + // initialize images calculation method + mmInterfacesStorage::mmGlobalInterfacesStorage v_sInterfacesStorage(p_psLogReceiver ); + m_psInitializedImagesCalculationMethod = m_psDLLImagesCalculationMethod_Create(&v_sInterfacesStorage,p_sImagesCalculationMethodName.c_str()); + + SendLogMessage(mmLog::debug,mmString(L"End Constructor")); +} + +mmImages::mmImagesCalculationMethodDLLBroker::~mmImagesCalculationMethodDLLBroker() +{ + SendLogMessage(mmLog::debug,mmString(L"Start Destructor")); + + // destroy images calculation method + m_psDLLImagesCalculationMethod_Destroy(m_psInitializedImagesCalculationMethod); + + // free images calculation method dll + FreeLibrary(m_hDLLHandle); + + SendLogMessage(mmLog::debug,mmString(L"End Destructor")); +} + +mmImages::mmImagesCalculationMethodI::sCalculationMethodParams mmImages::mmImagesCalculationMethodDLLBroker::GetCalculationMethodInfo(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start GetCalculationMethodInfo")); + + mmImages::mmImagesCalculationMethodI::sCalculationMethodParams v_sCMP = m_psInitializedImagesCalculationMethod->GetCalculationMethodInfo(); + + SendLogMessage(mmLog::debug,mmString(L"End GetCalculationMethodInfo")); + + return v_sCMP; +} + +void mmImages::mmImagesCalculationMethodDLLBroker::SetCalculationMethodParameters(mmImages::mmImageStructureI* p_psImageStructure, + mmImages::mmImagesCalculationMethodI::sCalculationAutomationParams* p_psAutomationParams) +{ + SendLogMessage(mmLog::debug,mmString(L"Start SetCalculationMethodParameters")); + + m_psInitializedImagesCalculationMethod->SetCalculationMethodParameters(p_psImageStructure,p_psAutomationParams); + + SendLogMessage(mmLog::debug,mmString(L"End SetCalculationMethodParameters")); +} + +void mmImages::mmImagesCalculationMethodDLLBroker::UserAction(mmString p_sXMLParams) +{ + SendLogMessage(mmLog::debug,mmString(L"Start UserAction")); + + UserAction(const_cast(p_sXMLParams.c_str()),p_sXMLParams.size()); + + SendLogMessage(mmLog::debug,mmString(L"End UserAction")); +} + +void mmImages::mmImagesCalculationMethodDLLBroker::UserAction(wchar_t* p_pcXMLParamsBuffer, + mmInt p_iXMLParamsBufferSize) +{ + SendLogMessage(mmLog::debug,mmString(L"Start UserAction")); + + //m_psInitializedImagesCalculationMethod->UserAction(p_pcXMLParamsBuffer,p_iXMLParamsBufferSize); + + SendLogMessage(mmLog::debug,mmString(L"End UserAction")); +} + +bool mmImages::mmImagesCalculationMethodDLLBroker::Execute(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start Execute")); + + bool v_bRes = m_psInitializedImagesCalculationMethod->Execute(); + + SendLogMessage(mmLog::debug,mmString(L"End Execute")); + + return v_bRes; +} + +void mmImages::mmImagesCalculationMethodDLLBroker::StopExecution(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start StopExecution")); + + m_psInitializedImagesCalculationMethod->StopExecution(); + + SendLogMessage(mmLog::debug,mmString(L"End StopExecution")); +} + +bool mmImages::mmImagesCalculationMethodDLLBroker::IsExecuting(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start IsExecuting")); + + bool v_bIsExecuting = m_psInitializedImagesCalculationMethod->IsExecuting(); + + SendLogMessage(mmLog::debug,mmString(L"End IsExecuting")); + + return v_bIsExecuting; +} + +mmReal mmImages::mmImagesCalculationMethodDLLBroker::GetProgress(void) +{ +// SendLogMessage(mmLog::debug,mmString(L"Start GetProgress")); + + mmReal v_rProgress = m_psInitializedImagesCalculationMethod->GetProgress(); + +// SendLogMessage(mmLog::debug,mmString(L"End GetProgress")); + + return v_rProgress; +} + + diff --git a/proj/libcalc2d/src/images/mmImagesComplexCalculationManagement.cpp b/proj/libcalc2d/src/images/mmImagesComplexCalculationManagement.cpp new file mode 100644 index 0000000..c56c71e --- /dev/null +++ b/proj/libcalc2d/src/images/mmImagesComplexCalculationManagement.cpp @@ -0,0 +1,3320 @@ +#include + +#include +#include + +const wchar_t* mmImages::g_pComplexCalcXML_PatternContainer_Node = L"ComplexPatternContainer"; + +const wchar_t* mmImages::g_pComplexCalcXML_Pattern_Node = L"ComplexPattern"; + const wchar_t* mmImages::g_pComplexCalcXML_PatternName_Node = L"Name"; + const wchar_t* mmImages::g_pComplexCalcXML_PatternIDName_Node = L"IDName"; + const wchar_t* mmImages::g_pComplexCalcXML_PatternDescription_Node = L"Description"; + const wchar_t* mmImages::g_pComplexCalcXML_PatternInputParams_Node = L"InputParams"; + const wchar_t* mmImages::g_pComplexCalcXML_PatternInputParam_Node = L"InputParam"; + const wchar_t* mmImages::g_pComplexCalcXML_PatternInputParam_Constant_Attr = L"ConstParam"; + const wchar_t* mmImages::g_pComplexCalcXML_PatternInputParamName_Node = L"InputParamName"; + const wchar_t* mmImages::g_pComplexCalcXML_PatternInputParamType_Node = L"InputParamType"; + const wchar_t* mmImages::g_pComplexCalcXML_PatternInputParamValue_Node = L"InputParamValue"; + const wchar_t* mmImages::g_pComplexCalcXML_PatternInputParamValueModifiedNodeName_Node = L"InputParamModified"; + const wchar_t* mmImages::g_pComplexCalcXML_PatternOutputParams_Node = L"OutputParams"; + const wchar_t* mmImages::g_pComplexCalcXML_PatternOutputParam_Node = L"OutputParam"; + const wchar_t* mmImages::g_pComplexCalcXML_PatternOutputParamName_Node = L"OutputParamName"; + const wchar_t* mmImages::g_pComplexCalcXML_PatternOutputParamType_Node = L"OutputParamType"; + const wchar_t* mmImages::g_pComplexCalcXML_PatternOutputParamValue_Node = L"OutputParamValue"; + const wchar_t* mmImages::g_pComplexCalcXML_PatternOutputParamValueModifiedNodeName_Node = L"OutputParamModified"; + const wchar_t* mmImages::g_pComplexCalcXML_PatternOutputParamValueModifiedSecondNodeName_Node = L"SecondOutputParamModified"; + const wchar_t* mmImages::g_pComplexCalcXML_PatternOutputParamOperation_Node = L"OutputParamOperation"; + const wchar_t* mmImages::g_pComplexCalcXML_PatternDefinition_Node = L"PatternDefinition"; + const wchar_t* mmImages::g_pComplexCalcXML_PatternCalcMethod_Node = L"CalculationMethod"; + const wchar_t* mmImages::g_pComplexCalcXML_PatternCalcMethodIDName_Node = L"CalculationMethodIDName"; + const wchar_t* mmImages::g_pComplexCalcXML_PatternInternalAction_Node = L"InternalAction"; + const wchar_t* mmImages::g_pComplexCalcXML_PatternInternalActionName_Node = L"InternalActionName"; + +// PB // +//const wchar_t* mmImages::g_pComplexCalcXML_Action_AddSimpleCalculationMethod = L"Add Calculation Method"; +//const wchar_t* mmImages::g_pComplexCalcXML_Action_AddOutputValueFromExisting = L"Add Modified Output Value"; +//const wchar_t* mmImages::g_pComplexCalcXML_Action_MixOutputValuesFromExisting = L"Mix Output Values"; +//const wchar_t* mmImages::g_pComplexCalcXML_Action_AddInputValueFromExistingOrConst = L"Add Constant/Modified Input Value"; +//const wchar_t* mmImages::g_pComplexCalcXML_Action_AddInputValueConstDecision = L"Add Input Decision Value"; + +// PB // +//const wchar_t* mmImages::g_pComplexCalcXML_Action_AddWhileLoop = L"Add WHILE loop"; +//const wchar_t* mmImages::g_pComplexCalcXML_Action_AddEndWhile = L"Add END_WHILE"; +//const wchar_t* mmImages::g_pComplexCalcXML_Action_CopyBinaryOutputToInputValue = L"Copy Decision From Output To Input Value"; +//const wchar_t* mmImages::g_pComplexCalcXML_Action_CopyIntOutputToInputValue = L"Copy Int From Output To Input Value"; +//const wchar_t* mmImages::g_pComplexCalcXML_Action_CopyRealOutputToInputValue = L"Copy Real From Output To Input Value"; + +// PB // +//const wchar_t* mmImages::g_pComplexCalcXML_PatternInputParamUserSpecified = L"[User_Specified]"; +//const wchar_t* mmImages::g_pComplexCalcXML_PatternInputParamConstant_Real = L"[Constant_Real]"; +//const wchar_t* mmImages::g_pComplexCalcXML_PatternInputParamConstant_Int = L"[Constant_Int]"; + +const wchar_t* mmImages::g_pComplexCalcXML_PatternOutputFormula_Addition = L"Addition"; +const wchar_t* mmImages::g_pComplexCalcXML_PatternOutputFormula_Subtraction = L"Subtraction"; +const wchar_t* mmImages::g_pComplexCalcXML_PatternOutputFormula_Multiplication = L"Multiplication"; +const wchar_t* mmImages::g_pComplexCalcXML_PatternOutputFormula_Division = L"Division"; +const wchar_t* mmImages::g_pComplexCalcXML_PatternOutputFormula_Power = L"Power"; +const wchar_t* mmImages::g_pComplexCalcXML_PatternOutputFormula_Minimum = L"Minimum"; +const wchar_t* mmImages::g_pComplexCalcXML_PatternOutputFormula_Maximum = L"Maximum"; +const wchar_t* mmImages::g_pComplexCalcXML_PatternOutputFormula_Equal = L"Equal"; +const wchar_t* mmImages::g_pComplexCalcXML_PatternOutputFormula_Less = L"Less"; +const wchar_t* mmImages::g_pComplexCalcXML_PatternOutputFormula_Greater = L"Greater"; + +mmImages::mmImagesComplexCalculationManagement::mmImagesComplexCalculationManagement( mmImages::mmImagesCalculationMethodContainerI* p_psImageCalculationMethodContainer, + mmImages::mmImagesCalculationManagement* p_psImageCalculationManagement, + mmLog::mmLogReceiverI *p_psLogReceiver): + mmLog::mmLogSender(L"mmImages::mmImagesComplexCalculationManagement",p_psLogReceiver) +{ + SendLogMessage(mmLog::debug,mmString(L"Start Constructor")); + + m_psImageCalculationMethodContainer = p_psImageCalculationMethodContainer; + m_psImageCalculationManagement = p_psImageCalculationManagement; + + m_vSimpleCalculationMethodsInfo = p_psImageCalculationMethodContainer->GetAvailableImagesCalculationMethods(); + + m_psXMLCurrentPatternDefinition = NULL; + m_bIsNew = true; + m_psXMLCalculatedPatternDefinition = NULL; + + m_sComplexPatternContainerXMLFile = mmOperatingSystem::GetApplicationDirectory() + + mmString(L"\\ComplexPatterns.icpxml"); + m_psXMLComplexPatternContainer = NULL; + LoadComplexPatternsFromFile(m_sComplexPatternContainerXMLFile); + +// PB // +// m_hUIActiveDialog = -1; + + m_bIsActiveCalculation = false; + + m_psStateChangeReceiver = NULL; + + //m_psThreadSynchronizationEL = mmInterfaceInitializers::CreateExclusiveLock(GetLogReceiver()); + m_psThreadSynchronizationEL = mmInterfaceInitializers::CreateExclusiveLock(NULL); + + m_iThreadExecutionSleepTime = 10; + //m_psControlThread = mmInterfaceInitializers::CreateDefaultThread(GetLogReceiver()); + m_psControlThread = mmInterfaceInitializers::CreateDefaultThread(NULL); + m_psControlThread->RegisterThreadExecutionClass(this); + m_psControlThread->Run(); + + SendLogMessage(mmLog::debug,mmString(L"End Constructor")); +} + +mmImages::mmImagesComplexCalculationManagement::~mmImagesComplexCalculationManagement() +{ + SendLogMessage(mmLog::debug,mmString(L"Start Destructor")); + + m_psControlThread->Stop(); + while(m_psControlThread->GetStatus() != mmThread::mmThreadI::finished) + { + mmOperatingSystem::StopThread(1); + }; + delete m_psControlThread; + + if( m_psXMLComplexPatternContainer ) + delete m_psXMLComplexPatternContainer; + + delete m_psThreadSynchronizationEL; + + SendLogMessage(mmLog::debug,mmString(L"End Destructor")); +} + +mmInt mmImages::mmImagesComplexCalculationManagement::GetCountOfComplexCalculationPatterns(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start GetCountOfComplexCalculationPatterns")); + + mmInt v_iCCPCount = 0; + + std::vector v_vCCPNodes = m_psXMLComplexPatternContainer->GetXMLRootNode()->GetChilds(); + v_iCCPCount = v_vCCPNodes.size(); + + SendLogMessage(mmLog::debug,mmString(L"End GetCountOfComplexCalculationPatterns")); + + return v_iCCPCount; +} + +mmImages::mmImagesComplexCalculationManagement::sComplexCalculationInfo + mmImages::mmImagesComplexCalculationManagement::GetComplexCalculationPatternInfo(mmInt p_iPatternID) +{ + SendLogMessage(mmLog::debug,mmString(L"Start GetComplexCalculationPatternInfo")); + + mmImages::mmImagesComplexCalculationManagement::sComplexCalculationInfo v_sCCPI; + + v_sCCPI.sName = m_psXMLComplexPatternContainer-> + GetXMLRootNode()-> + GetChild(p_iPatternID)-> + FindChild(mmImages::g_pComplexCalcXML_PatternName_Node)-> + GetText(); + v_sCCPI.sIDName = m_psXMLComplexPatternContainer-> + GetXMLRootNode()-> + GetChild(p_iPatternID)-> + FindChild(mmImages::g_pComplexCalcXML_PatternIDName_Node)-> + GetText(); + v_sCCPI.sDescription = m_psXMLComplexPatternContainer-> + GetXMLRootNode()-> + GetChild(p_iPatternID)-> + FindChild(mmImages::g_pComplexCalcXML_PatternDescription_Node)-> + GetText(); + + SendLogMessage(mmLog::debug,mmString(L"End GetComplexCalculationPatternInfo")); + + return v_sCCPI; +} + +void mmImages::mmImagesComplexCalculationManagement::ExecuteComplexCalculationPattern( mmString p_sPatternIDName, + mmImages::mmImageStructureI* p_psImageStructure) +{ + SendLogMessage(mmLog::debug,mmString(L"Start ExecuteComplexCalculationPattern")); + + sComplexCalculationDefinition v_sCCD; + v_sCCD.sIDName = p_sPatternIDName; + v_sCCD.psImageStructure = p_psImageStructure; + + // add pattern to execute list + m_psThreadSynchronizationEL->Lock(); + m_vCalculationSheme.push_back(v_sCCD); + m_psThreadSynchronizationEL->Unlock(); + + SendLogMessage(mmLog::debug,mmString(L"End ExecuteComplexCalculationPattern")); +} + +void mmImages::mmImagesComplexCalculationManagement::RegisterStateChangeReceiver(mmImagesComplexCalculationManagementStateChangeReceiverI* p_psStateChangeReceiver) +{ + SendLogMessage(mmLog::debug,mmString(L"Start RegisterStateChangeReceiver")); + + m_psStateChangeReceiver = p_psStateChangeReceiver; + + SendLogMessage(mmLog::debug,mmString(L"End RegisterStateChangeReceiver")); +} + +void mmImages::mmImagesComplexCalculationManagement::UnregisterStateChangeReceiver(mmImagesComplexCalculationManagementStateChangeReceiverI* p_psStateChangeReceiver) +{ + SendLogMessage(mmLog::debug,mmString(L"Start UnregisterStateChangeReceiver")); + + m_psStateChangeReceiver = NULL; + + SendLogMessage(mmLog::debug,mmString(L"End UnregisterStateChangeReceiver")); +} + +bool mmImages::mmImagesComplexCalculationManagement::IsCalculating(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start IsCalculating")); + + SendLogMessage(mmLog::debug,mmString(L"End IsCalculating")); + + return m_bIsActiveCalculation; +} + +bool mmImages::mmImagesComplexCalculationManagement::Execute(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start Execute")); + + mmReal v_rCalculationStart; + + m_bTerminateControlThreadExecution = false; + + while(!m_bTerminateControlThreadExecution) + { + if(m_bIsActiveCalculation) + { + m_bIsActiveCalculation = !ManageCurrentComplexCalculationPatternExecution(); + } + else + { + // check if are some patterns to execute + m_psThreadSynchronizationEL->Lock(); + if(m_vCalculationSheme.size() > 0) + { + m_sCurrentComplexCalculation = m_vCalculationSheme.front(); + m_vCalculationSheme.pop_front(); + + m_psXMLCalculatedPatternDefinition = GetComplexCalculationPatternDefinition(m_sCurrentComplexCalculation.sIDName); + m_iCurrentComplexCalculationItem = -1; + }; + m_psThreadSynchronizationEL->Unlock(); + + // execute them + if(m_psXMLCalculatedPatternDefinition != NULL) + { +// PB // +// InitializeCurrentComplexCalculationPatternExecution(); + + m_bIsActiveCalculation = !ManageCurrentComplexCalculationPatternExecution(); + }; + }; + + mmOperatingSystem::StopThread(m_iThreadExecutionSleepTime); + }; + + SendLogMessage(mmLog::debug,mmString(L"End Execute")); + + return true; +} + +void mmImages::mmImagesComplexCalculationManagement::StopExecution(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start StopExecution")); + + m_bTerminateControlThreadExecution = true; + + SendLogMessage(mmLog::debug,mmString(L"End StopExecution")); +} + +bool mmImages::mmImagesComplexCalculationManagement::IsExecuting(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start IsExecuting")); + + SendLogMessage(mmLog::debug,mmString(L"End IsExecuting")); + + return !m_bTerminateControlThreadExecution; +} + +mmReal mmImages::mmImagesComplexCalculationManagement::GetProgress(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start GetProgress")); + + SendLogMessage(mmLog::debug,mmString(L"End GetProgress")); + + return 0.0; +} + +// PB // +//mmImages::mmImagesCalculationMethodI::sCalculationMethodParams* +// mmImages::mmImagesComplexCalculationManagement::GetCalculationMethodInfo(mmString p_sCalculationMethodIDName) +//{ +// SendLogMessage(mmLog::debug,mmString(L"Start GetCalculationMethodInfo")); +// +// mmInt v_iCMCount = m_vSimpleCalculationMethodsInfo.size(); +// for(mmInt v_iCM=0;v_iCMGetLogReceiver()); +// //mmXML::mmXMLDocI* v_psXMLDoc = mmInterfaceInitializers::CreateXMLDocument(NULL); +// +// // parse string +// v_psXMLDoc->ParseXMLBuffer(p_psInOutParams); +// mmXML::mmXMLNodeI* v_psRootNode = v_psXMLDoc->GetXMLRootNode(); +// +// std::vector v_vInputParams = v_psRootNode->GetChild(1)->GetChilds(); +// mmInt v_iIPCount = v_vInputParams.size(); +// for(mmInt v_iIP=1;v_iIP v_vOrigAttrParams = v_vInputParams[v_iIP]->GetAttributes(); +// +// if(v_vOrigAttrParams.size() > 0) +// { +// if(v_vOrigAttrParams[1].sValue.compare(mmImages::g_pAutoCalcXML_Params_ParamType_ImagesNames) == 0) +// { +// +// std::vector v_vClNamesVals = +// mmStringUtilities::MMStringToVectorOfMMString( v_vInputParams[v_iIP]-> +// FindChild(mmUI::g_pUIXML_EL_DEF_Value)-> +// GetText()); +// +// // DEBUG +// //mmInt v_iNCount = v_vClNamesVals.size(); +// //for(mmInt v_iN=0;v_iNGetChild(0)->GetText(), +// v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Name)->GetText() + +// mmString(L" - Cloud ") + +// mmStringUtilities::MMIntToString(v_iC+1)); +// +// v_vClNamesVals[v_iC+1] = v_sNewInputParamName; +// +// mmXML::mmXMLNodeI* v_psNewPattern_InputValues_NewNode = m_psXMLCurrentPatternDefinition->GetXMLRootNode()->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParams_Node)->AddChild(mmClouds::g_pComplexCalcXML_PatternInputParam_Node); +// // add name +// mmXML::mmXMLNodeI* v_psNewPattern_InputValues_NewNode_Name = v_psNewPattern_InputValues_NewNode->AddChild(mmClouds::g_pComplexCalcXML_PatternInputParamName_Node); +// v_psNewPattern_InputValues_NewNode_Name->SetText(v_sNewInputParamName); +// // add type +// mmXML::mmXMLNodeI* v_psNewPattern_InputValues_NewNode_Type = v_psNewPattern_InputValues_NewNode->AddChild(mmClouds::g_pComplexCalcXML_PatternInputParamType_Node); +// v_psNewPattern_InputValues_NewNode_Type->SetText(mmClouds::g_pAutoCalcXML_Params_ParamType_CloudName); +// // add value +// mmXML::mmXMLNodeI* v_psNewPattern_InputValues_NewNode_Value = v_psNewPattern_InputValues_NewNode->AddChild(mmClouds::g_pComplexCalcXML_PatternInputParamValue_Node); +// v_psNewPattern_InputValues_NewNode_Value->SetText(v_sNewInputParamName); +// }; +// }; +// +// mmString v_sFinalCloudNames = v_vClNamesVals[0]; +// mmInt v_iNCount = v_vClNamesVals.size(); +// for(mmInt v_iN=1;v_iNFindChild(mmUI::g_pUIXML_EL_DEF_Value)->SetText(v_sFinalCloudNames); +// }; +// }; +// if(v_vOrigAttrParams[1].sValue.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_BoolValue) == 0) +// { +// if(v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText().compare(mmClouds::g_pComplexCalcXML_PatternInputParamUserSpecified) == 0) +// { +// mmString v_sNewInputParamName = GetFromUIReadableInputParameterName(L"Write input parameter name", +// v_psRootNode->GetChild(0)->GetText(), +// v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Name)->GetText()); +// +// v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->SetText(v_sNewInputParamName); +// +// mmXML::mmXMLNodeI* v_psNewPattern_InputValues_NewNode = m_psXMLCurrentPatternDefinition->GetXMLRootNode()->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParams_Node)->AddChild(mmClouds::g_pComplexCalcXML_PatternInputParam_Node); +// // add name +// mmXML::mmXMLNodeI* v_psNewPattern_InputValues_NewNode_Name = v_psNewPattern_InputValues_NewNode->AddChild(mmClouds::g_pComplexCalcXML_PatternInputParamName_Node); +// v_psNewPattern_InputValues_NewNode_Name->SetText(v_sNewInputParamName); +// // add type +// mmXML::mmXMLNodeI* v_psNewPattern_InputValues_NewNode_Type = v_psNewPattern_InputValues_NewNode->AddChild(mmClouds::g_pComplexCalcXML_PatternInputParamType_Node); +// v_psNewPattern_InputValues_NewNode_Type->SetText(mmClouds::g_pAutoCalcXML_Params_ParamType_BoolValue); +// // add value +// mmXML::mmXMLNodeI* v_psNewPattern_InputValues_NewNode_Value = v_psNewPattern_InputValues_NewNode->AddChild(mmClouds::g_pComplexCalcXML_PatternInputParamValue_Node); +// v_psNewPattern_InputValues_NewNode_Value->SetText(v_sNewInputParamName); +// }; +// }; +// if(v_vOrigAttrParams[1].sValue.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_CloudName) == 0) +// { +// if(v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText().compare(mmClouds::g_pComplexCalcXML_PatternInputParamUserSpecified) == 0) +// { +// mmString v_sNewInputParamName = GetFromUIReadableInputParameterName(L"Write input parameter name", +// v_psRootNode->GetChild(0)->GetText(), +// v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Name)->GetText()); +// +// v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->SetText(v_sNewInputParamName); +// +// mmXML::mmXMLNodeI* v_psNewPattern_InputValues_NewNode = m_psXMLCurrentPatternDefinition->GetXMLRootNode()->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParams_Node)->AddChild(mmClouds::g_pComplexCalcXML_PatternInputParam_Node); +// // add name +// mmXML::mmXMLNodeI* v_psNewPattern_InputValues_NewNode_Name = v_psNewPattern_InputValues_NewNode->AddChild(mmClouds::g_pComplexCalcXML_PatternInputParamName_Node); +// v_psNewPattern_InputValues_NewNode_Name->SetText(v_sNewInputParamName); +// // add type +// mmXML::mmXMLNodeI* v_psNewPattern_InputValues_NewNode_Type = v_psNewPattern_InputValues_NewNode->AddChild(mmClouds::g_pComplexCalcXML_PatternInputParamType_Node); +// v_psNewPattern_InputValues_NewNode_Type->SetText(mmClouds::g_pAutoCalcXML_Params_ParamType_CloudName); +// // add value +// mmXML::mmXMLNodeI* v_psNewPattern_InputValues_NewNode_Value = v_psNewPattern_InputValues_NewNode->AddChild(mmClouds::g_pComplexCalcXML_PatternInputParamValue_Node); +// v_psNewPattern_InputValues_NewNode_Value->SetText(v_sNewInputParamName); +// }; +// }; +// if(v_vOrigAttrParams[1].sValue.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_DataLayerName) == 0) +// { +// if(v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText().compare(mmClouds::g_pComplexCalcXML_PatternInputParamUserSpecified) == 0) +// { +// mmString v_sNewInputParamName = GetFromUIReadableInputParameterName(L"Write input parameter name", +// v_psRootNode->GetChild(0)->GetText(), +// v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Name)->GetText()); +// +// v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->SetText(v_sNewInputParamName); +// +// mmXML::mmXMLNodeI* v_psNewPattern_InputValues_NewNode = m_psXMLCurrentPatternDefinition->GetXMLRootNode()->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParams_Node)->AddChild(mmClouds::g_pComplexCalcXML_PatternInputParam_Node); +// // add name +// mmXML::mmXMLNodeI* v_psNewPattern_InputValues_NewNode_Name = v_psNewPattern_InputValues_NewNode->AddChild(mmClouds::g_pComplexCalcXML_PatternInputParamName_Node); +// v_psNewPattern_InputValues_NewNode_Name->SetText(v_sNewInputParamName); +// // add type +// mmXML::mmXMLNodeI* v_psNewPattern_InputValues_NewNode_Type = v_psNewPattern_InputValues_NewNode->AddChild(mmClouds::g_pComplexCalcXML_PatternInputParamType_Node); +// v_psNewPattern_InputValues_NewNode_Type->SetText(mmClouds::g_pAutoCalcXML_Params_ParamType_DataLayerName); +// // add value +// mmXML::mmXMLNodeI* v_psNewPattern_InputValues_NewNode_Value = v_psNewPattern_InputValues_NewNode->AddChild(mmClouds::g_pComplexCalcXML_PatternInputParamValue_Node); +// v_psNewPattern_InputValues_NewNode_Value->SetText(v_sNewInputParamName); +// }; +// }; +// if(v_vOrigAttrParams[1].sValue.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_IntegerValue) == 0) +// { +// if(v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText().compare(mmClouds::g_pComplexCalcXML_PatternInputParamUserSpecified) == 0) +// { +// mmString v_sNewInputParamName = GetFromUIReadableInputParameterName(L"Write input parameter name", +// v_psRootNode->GetChild(0)->GetText(), +// v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Name)->GetText()); +// +// v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->SetText(v_sNewInputParamName); +// +// mmXML::mmXMLNodeI* v_psNewPattern_InputValues_NewNode = m_psXMLCurrentPatternDefinition->GetXMLRootNode()->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParams_Node)->AddChild(mmClouds::g_pComplexCalcXML_PatternInputParam_Node); +// // add name +// mmXML::mmXMLNodeI* v_psNewPattern_InputValues_NewNode_Name = v_psNewPattern_InputValues_NewNode->AddChild(mmClouds::g_pComplexCalcXML_PatternInputParamName_Node); +// v_psNewPattern_InputValues_NewNode_Name->SetText(v_sNewInputParamName); +// // add type +// mmXML::mmXMLNodeI* v_psNewPattern_InputValues_NewNode_Type = v_psNewPattern_InputValues_NewNode->AddChild(mmClouds::g_pComplexCalcXML_PatternInputParamType_Node); +// v_psNewPattern_InputValues_NewNode_Type->SetText(mmClouds::g_pAutoCalcXML_Params_ParamType_IntegerValue); +// // add value +// mmXML::mmXMLNodeI* v_psNewPattern_InputValues_NewNode_Value = v_psNewPattern_InputValues_NewNode->AddChild(mmClouds::g_pComplexCalcXML_PatternInputParamValue_Node); +// v_psNewPattern_InputValues_NewNode_Value->SetText(v_sNewInputParamName); +// }; +// }; +// if(v_vOrigAttrParams[1].sValue.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_RealValue) == 0) +// { +// if(v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText().compare(mmClouds::g_pComplexCalcXML_PatternInputParamUserSpecified) == 0) +// { +// mmString v_sNewInputParamName = GetFromUIReadableInputParameterName(L"Write input parameter name", +// v_psRootNode->GetChild(0)->GetText(), +// v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Name)->GetText()); +// +// v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->SetText(v_sNewInputParamName); +// +// mmXML::mmXMLNodeI* v_psNewPattern_InputValues_NewNode = m_psXMLCurrentPatternDefinition->GetXMLRootNode()->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParams_Node)->AddChild(mmClouds::g_pComplexCalcXML_PatternInputParam_Node); +// // add name +// mmXML::mmXMLNodeI* v_psNewPattern_InputValues_NewNode_Name = v_psNewPattern_InputValues_NewNode->AddChild(mmClouds::g_pComplexCalcXML_PatternInputParamName_Node); +// v_psNewPattern_InputValues_NewNode_Name->SetText(v_sNewInputParamName); +// // add type +// mmXML::mmXMLNodeI* v_psNewPattern_InputValues_NewNode_Type = v_psNewPattern_InputValues_NewNode->AddChild(mmClouds::g_pComplexCalcXML_PatternInputParamType_Node); +// v_psNewPattern_InputValues_NewNode_Type->SetText(mmClouds::g_pAutoCalcXML_Params_ParamType_RealValue); +// // add value +// mmXML::mmXMLNodeI* v_psNewPattern_InputValues_NewNode_Value = v_psNewPattern_InputValues_NewNode->AddChild(mmClouds::g_pComplexCalcXML_PatternInputParamValue_Node); +// v_psNewPattern_InputValues_NewNode_Value->SetText(v_sNewInputParamName); +// }; +// }; +// }; +// }; +// +// std::vector v_vOutputParams = v_psRootNode->GetChild(2)->GetChilds(); +// mmInt v_iOPCount = v_vOutputParams.size(); +// for(mmInt v_iOP=1;v_iOP v_vOrigAttrParams = v_vOutputParams[v_iOP]->GetAttributes(); +// +// if(v_vOrigAttrParams.size() > 0) +// { +// if(v_vOrigAttrParams[1].sValue.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_BoolValue) == 0) +// { +// mmXML::mmXMLNodeI* v_psNewPattern_OutputValues_NewNode = m_psXMLCurrentPatternDefinition->GetXMLRootNode()->FindChild(mmClouds::g_pComplexCalcXML_PatternOutputParams_Node)->AddChild(mmClouds::g_pComplexCalcXML_PatternOutputParam_Node); +// // add name +// mmXML::mmXMLNodeI* v_psNewPattern_OutputValues_NewNode_Name = v_psNewPattern_OutputValues_NewNode->AddChild(mmClouds::g_pComplexCalcXML_PatternOutputParamName_Node); +// v_psNewPattern_OutputValues_NewNode_Name->SetText(v_vOutputParams[v_iOP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// // add type +// mmXML::mmXMLNodeI* v_psNewPattern_OutputValues_NewNode_Type = v_psNewPattern_OutputValues_NewNode->AddChild(mmClouds::g_pComplexCalcXML_PatternOutputParamType_Node); +// v_psNewPattern_OutputValues_NewNode_Type->SetText(mmClouds::g_pAutoCalcXML_Params_ParamType_BoolValue); +// // add value +// mmXML::mmXMLNodeI* v_psNewPattern_OutputValues_NewNode_Value = v_psNewPattern_OutputValues_NewNode->AddChild(mmClouds::g_pComplexCalcXML_PatternOutputParamValue_Node); +// v_psNewPattern_OutputValues_NewNode_Value->SetText(v_vOutputParams[v_iOP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// }; +// if(v_vOrigAttrParams[1].sValue.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_CloudName) == 0) +// { +// mmXML::mmXMLNodeI* v_psNewPattern_OutputValues_NewNode = m_psXMLCurrentPatternDefinition->GetXMLRootNode()->FindChild(mmClouds::g_pComplexCalcXML_PatternOutputParams_Node)->AddChild(mmClouds::g_pComplexCalcXML_PatternOutputParam_Node); +// // add name +// mmXML::mmXMLNodeI* v_psNewPattern_OutputValues_NewNode_Name = v_psNewPattern_OutputValues_NewNode->AddChild(mmClouds::g_pComplexCalcXML_PatternOutputParamName_Node); +// v_psNewPattern_OutputValues_NewNode_Name->SetText(v_vOutputParams[v_iOP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// // add type +// mmXML::mmXMLNodeI* v_psNewPattern_OutputValues_NewNode_Type = v_psNewPattern_OutputValues_NewNode->AddChild(mmClouds::g_pComplexCalcXML_PatternOutputParamType_Node); +// v_psNewPattern_OutputValues_NewNode_Type->SetText(mmClouds::g_pAutoCalcXML_Params_ParamType_CloudName); +// // add value +// mmXML::mmXMLNodeI* v_psNewPattern_OutputValues_NewNode_Value = v_psNewPattern_OutputValues_NewNode->AddChild(mmClouds::g_pComplexCalcXML_PatternOutputParamValue_Node); +// v_psNewPattern_OutputValues_NewNode_Value->SetText(v_vOutputParams[v_iOP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// }; +// if(v_vOrigAttrParams[1].sValue.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_DataLayerName) == 0) +// { +// mmXML::mmXMLNodeI* v_psNewPattern_OutputValues_NewNode = m_psXMLCurrentPatternDefinition->GetXMLRootNode()->FindChild(mmClouds::g_pComplexCalcXML_PatternOutputParams_Node)->AddChild(mmClouds::g_pComplexCalcXML_PatternOutputParam_Node); +// // add name +// mmXML::mmXMLNodeI* v_psNewPattern_OutputValues_NewNode_Name = v_psNewPattern_OutputValues_NewNode->AddChild(mmClouds::g_pComplexCalcXML_PatternOutputParamName_Node); +// v_psNewPattern_OutputValues_NewNode_Name->SetText(v_vOutputParams[v_iOP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// // add type +// mmXML::mmXMLNodeI* v_psNewPattern_OutputValues_NewNode_Type = v_psNewPattern_OutputValues_NewNode->AddChild(mmClouds::g_pComplexCalcXML_PatternOutputParamType_Node); +// v_psNewPattern_OutputValues_NewNode_Type->SetText(mmClouds::g_pAutoCalcXML_Params_ParamType_DataLayerName); +// // add value +// mmXML::mmXMLNodeI* v_psNewPattern_OutputValues_NewNode_Value = v_psNewPattern_OutputValues_NewNode->AddChild(mmClouds::g_pComplexCalcXML_PatternOutputParamValue_Node); +// v_psNewPattern_OutputValues_NewNode_Value->SetText(v_vOutputParams[v_iOP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// }; +// if(v_vOrigAttrParams[1].sValue.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_IntegerValue) == 0) +// { +// mmXML::mmXMLNodeI* v_psNewPattern_OutputValues_NewNode = m_psXMLCurrentPatternDefinition->GetXMLRootNode()->FindChild(mmClouds::g_pComplexCalcXML_PatternOutputParams_Node)->AddChild(mmClouds::g_pComplexCalcXML_PatternOutputParam_Node); +// // add name +// mmXML::mmXMLNodeI* v_psNewPattern_OutputValues_NewNode_Name = v_psNewPattern_OutputValues_NewNode->AddChild(mmClouds::g_pComplexCalcXML_PatternOutputParamName_Node); +// v_psNewPattern_OutputValues_NewNode_Name->SetText(v_vOutputParams[v_iOP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// // add type +// mmXML::mmXMLNodeI* v_psNewPattern_OutputValues_NewNode_Type = v_psNewPattern_OutputValues_NewNode->AddChild(mmClouds::g_pComplexCalcXML_PatternOutputParamType_Node); +// v_psNewPattern_OutputValues_NewNode_Type->SetText(mmClouds::g_pAutoCalcXML_Params_ParamType_IntegerValue); +// // add value +// mmXML::mmXMLNodeI* v_psNewPattern_OutputValues_NewNode_Value = v_psNewPattern_OutputValues_NewNode->AddChild(mmClouds::g_pComplexCalcXML_PatternOutputParamValue_Node); +// v_psNewPattern_OutputValues_NewNode_Value->SetText(v_vOutputParams[v_iOP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// }; +// if(v_vOrigAttrParams[1].sValue.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_RealValue) == 0) +// { +// mmXML::mmXMLNodeI* v_psNewPattern_OutputValues_NewNode = m_psXMLCurrentPatternDefinition->GetXMLRootNode()->FindChild(mmClouds::g_pComplexCalcXML_PatternOutputParams_Node)->AddChild(mmClouds::g_pComplexCalcXML_PatternOutputParam_Node); +// // add name +// mmXML::mmXMLNodeI* v_psNewPattern_OutputValues_NewNode_Name = v_psNewPattern_OutputValues_NewNode->AddChild(mmClouds::g_pComplexCalcXML_PatternOutputParamName_Node); +// v_psNewPattern_OutputValues_NewNode_Name->SetText(v_vOutputParams[v_iOP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// // add type +// mmXML::mmXMLNodeI* v_psNewPattern_OutputValues_NewNode_Type = v_psNewPattern_OutputValues_NewNode->AddChild(mmClouds::g_pComplexCalcXML_PatternOutputParamType_Node); +// v_psNewPattern_OutputValues_NewNode_Type->SetText(mmClouds::g_pAutoCalcXML_Params_ParamType_RealValue); +// // add value +// mmXML::mmXMLNodeI* v_psNewPattern_OutputValues_NewNode_Value = v_psNewPattern_OutputValues_NewNode->AddChild(mmClouds::g_pComplexCalcXML_PatternOutputParamValue_Node); +// v_psNewPattern_OutputValues_NewNode_Value->SetText(v_vOutputParams[v_iOP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// }; +// }; +// }; +// +// mmString v_sOutXML = v_psXMLDoc->SaveToXMLBuffer(); +// +// delete v_psXMLDoc; +// +// SendLogMessage(mmLog::debug,mmString(L"End UpdateInputOutputParameters")); +// +// return v_sOutXML; +//} + +// PB // +//mmString mmImages::mmImagesComplexCalculationManagement::GetFromUIReadableInputParameterName( mmString p_sTitle, +// mmString p_sDescription, +// mmString p_sParamName) +//{ +// SendLogMessage(mmLog::debug,mmString(L"Start GetFromUIReadableInputParameterName")); +// +// // create XML document which specifies new input parameter name +// mmXML::mmXMLDocI* v_psXMLDoc = mmInterfaceInitializers::CreateXMLDocument(this->GetLogReceiver()); +// //mmXML::mmXMLDocI* v_psXMLDoc = mmInterfaceInitializers::CreateXMLDocument(NULL); +// +// // add dialog root node +// v_psXMLDoc->CreateXMLRootNode(mmUI::g_pUIXML_EL_UserDialog); +// mmXML::mmXMLNodeI* v_psRootNode = v_psXMLDoc->GetXMLRootNode(); +// // add visible name for dialog +// mmXML::mmXMLNodeI* v_psRootNodeName = v_psRootNode->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psRootNodeName->SetText(p_sTitle); +// +// // add input param group node +// mmXML::mmXMLNodeI* v_psInParamGroupNode = v_psRootNode->AddChild(mmUI::g_pUIXML_EL_Group); +// // add visible name for group node +// mmXML::mmXMLNodeI* v_psInParamGroupNodeName = v_psInParamGroupNode->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psInParamGroupNodeName->SetText(p_sDescription); +// +// // add name field +// mmXML::mmXMLNodeI* v_psInParamName = v_psInParamGroupNode->AddChild(mmUI::g_pUIXML_EL_SingleValue); +// // name +// mmXML::mmXMLNodeI* v_psInParamNameName = v_psInParamName->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psInParamNameName->SetText(p_sParamName); +// // type +// mmXML::mmXMLNodeI* v_psInParamNameType = v_psInParamName->AddChild(mmUI::g_pUIXML_EL_DEF_Type); +// v_psInParamNameType->SetText(mmUI::g_pUIXML_EL_DEF_Type_String); +// // value +// mmXML::mmXMLNodeI* v_psInParamNameValue = v_psInParamName->AddChild(mmUI::g_pUIXML_EL_DEF_Value); +// v_psInParamNameValue->SetText(L""); +// +// mmString v_sOutXML = m_psMainWindow->ShowModalDialog(v_psXMLDoc->SaveToXMLBuffer(),NULL); +// +// v_psXMLDoc->ParseXMLBuffer(v_sOutXML); +// v_psRootNode = v_psXMLDoc->GetXMLRootNode(); +// +// mmString v_sOutName = v_psRootNode->GetChild(1)->GetChild(1)->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText(); +// +// delete v_psXMLDoc; +// +// SendLogMessage(mmLog::debug,mmString(L"End GetFromUIReadableInputParameterName")); +// +// return v_sOutName; +//} + +// PB // +//mmString mmImages::mmImagesComplexCalculationManagement::CreateNewOutputValueFromExistingUI(mmXML::mmXMLDocI* p_psXMLComplexCalculationPatternDefinition) +//{ +// SendLogMessage(mmLog::debug,mmString(L"Start CreateNewOutputValueFromExistingUI")); +// +// // create XML document which specifies new output parameter name +// mmXML::mmXMLDocI* v_psXMLDoc = mmInterfaceInitializers::CreateXMLDocument(this->GetLogReceiver()); +// //mmXML::mmXMLDocI* v_psXMLDoc = mmInterfaceInitializers::CreateXMLDocument(NULL); +// +// // add dialog root node +// v_psXMLDoc->CreateXMLRootNode(mmUI::g_pUIXML_EL_UserDialog); +// mmXML::mmXMLNodeI* v_psRootNode = v_psXMLDoc->GetXMLRootNode(); +// // add visible name for dialog +// mmXML::mmXMLNodeI* v_psRootNodeName = v_psRootNode->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psRootNodeName->SetText(L"Modify existing output value"); +// +// // add output param group node +// mmXML::mmXMLNodeI* v_psGroupNode = v_psRootNode->AddChild(mmUI::g_pUIXML_EL_Group); +// // add visible name for group node +// mmXML::mmXMLNodeI* v_psGroupNodeName = v_psGroupNode->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psGroupNodeName->SetText(L""); +// +// // add existing output value selection +// mmXML::mmXMLNodeI* v_psOutValSelection = v_psGroupNode->AddChild(mmUI::g_pUIXML_EL_SingleValue); +// // name +// mmXML::mmXMLNodeI* v_psOutValSelectionName = v_psOutValSelection->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psOutValSelectionName->SetText(L" Select output value to modify: "); +// // type +// mmXML::mmXMLNodeI* v_psOutValSelectionType = v_psOutValSelection->AddChild(mmUI::g_pUIXML_EL_DEF_Type); +// v_psOutValSelectionType->SetText(mmUI::g_pUIXML_EL_DEF_Type_String); +// // values range +// mmXML::mmXMLNodeI* v_psOutValSelectionRange = v_psOutValSelection->AddChild(mmUI::g_pUIXML_EL_DEF_Range); +// mmXML::mmXMLNodeI* v_psOutValSelectionRangeStringList = v_psOutValSelectionRange->AddChild(mmUI::g_pUIXML_EL_DEF_StringList); +// std::vector v_vOutParams = p_psXMLComplexCalculationPatternDefinition->GetXMLRootNode()->FindChild(mmClouds::g_pComplexCalcXML_PatternOutputParams_Node)->GetChilds(); +// mmInt v_iOPCount = v_vOutParams.size(); +// for(mmInt v_iOP=0;v_iOPFindChild(mmClouds::g_pComplexCalcXML_PatternOutputParamType_Node)->GetText().compare(mmClouds::g_pAutoCalcXML_Params_ParamType_IntegerValue) == 0) +// { +// mmXML::mmXMLNodeI* v_psUIStringListElement = v_psOutValSelectionRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(v_vOutParams[v_iOP]->FindChild(mmClouds::g_pComplexCalcXML_PatternOutputParamName_Node)->GetText()); +// }; +// if(v_vOutParams[v_iOP]->FindChild(mmClouds::g_pComplexCalcXML_PatternOutputParamType_Node)->GetText().compare(mmClouds::g_pAutoCalcXML_Params_ParamType_RealValue) == 0) +// { +// mmXML::mmXMLNodeI* v_psUIStringListElement = v_psOutValSelectionRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(v_vOutParams[v_iOP]->FindChild(mmClouds::g_pComplexCalcXML_PatternOutputParamName_Node)->GetText()); +// }; +// }; +// std::vector v_vInParams = p_psXMLComplexCalculationPatternDefinition->GetXMLRootNode()->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParams_Node)->GetChilds(); +// mmInt v_iIPCount = v_vInParams.size(); +// for(mmInt v_iIP=0;v_iIPFindChild(mmClouds::g_pComplexCalcXML_PatternInputParamType_Node)->GetText().compare(mmClouds::g_pAutoCalcXML_Params_ParamType_IntegerValue) == 0) +// { +// mmXML::mmXMLNodeI* v_psUIStringListElement = v_psOutValSelectionRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(v_vInParams[v_iIP]->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParamName_Node)->GetText()); +// }; +// if(v_vInParams[v_iIP]->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParamType_Node)->GetText().compare(mmClouds::g_pAutoCalcXML_Params_ParamType_RealValue) == 0) +// { +// mmXML::mmXMLNodeI* v_psUIStringListElement = v_psOutValSelectionRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(v_vInParams[v_iIP]->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParamName_Node)->GetText()); +// }; +// }; +// // value +// mmXML::mmXMLNodeI* v_psOutValSelectionValue = v_psOutValSelection->AddChild(mmUI::g_pUIXML_EL_DEF_Value); +// v_psOutValSelectionValue->SetText(L""); +// +// // add formula input +// mmXML::mmXMLNodeI* v_psFormula = v_psGroupNode->AddChild(mmUI::g_pUIXML_EL_SingleValue); +// // name +// mmXML::mmXMLNodeI* v_psFormulaName = v_psFormula->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psFormulaName->SetText(L" Set operation: "); +// // type +// mmXML::mmXMLNodeI* v_psFormulaType = v_psFormula->AddChild(mmUI::g_pUIXML_EL_DEF_Type); +// v_psFormulaType->SetText(mmUI::g_pUIXML_EL_DEF_Type_String); +// // values range +// mmXML::mmXMLNodeI* v_psFormulaRange = v_psFormula->AddChild(mmUI::g_pUIXML_EL_DEF_Range); +// mmXML::mmXMLNodeI* v_psFormulaRangeStringList = v_psFormulaRange->AddChild(mmUI::g_pUIXML_EL_DEF_StringList); +// mmXML::mmXMLNodeI* v_psUIStringListElement = v_psFormulaRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(mmClouds::g_pComplexCalcXML_PatternOutputFormula_Multiplication); +// v_psUIStringListElement = v_psFormulaRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(mmClouds::g_pComplexCalcXML_PatternOutputFormula_Division); +// v_psUIStringListElement = v_psFormulaRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(mmClouds::g_pComplexCalcXML_PatternOutputFormula_Power); +// // value +// mmXML::mmXMLNodeI* v_psFormulaValue = v_psFormula->AddChild(mmUI::g_pUIXML_EL_DEF_Value); +// v_psFormulaValue->SetText(L""); +// +// // add modification input +// mmXML::mmXMLNodeI* v_psMultVal = v_psGroupNode->AddChild(mmUI::g_pUIXML_EL_SingleValue); +// // name +// mmXML::mmXMLNodeI* v_psMultValName = v_psMultVal->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psMultValName->SetText(L" Set modification value: "); +// // type +// mmXML::mmXMLNodeI* v_psMultValType = v_psMultVal->AddChild(mmUI::g_pUIXML_EL_DEF_Type); +// v_psMultValType->SetText(mmUI::g_pUIXML_EL_DEF_Type_Real); +// // value +// mmXML::mmXMLNodeI* v_psMultValValue = v_psMultVal->AddChild(mmUI::g_pUIXML_EL_DEF_Value); +// v_psMultValValue->SetText(L"1.0"); +// +// // add name for new value +// mmXML::mmXMLNodeI* v_psNewParamName = v_psGroupNode->AddChild(mmUI::g_pUIXML_EL_SingleValue); +// // name +// mmXML::mmXMLNodeI* v_psNewParamNameName = v_psNewParamName->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psNewParamNameName->SetText(L" Set new name for output value: "); +// // type +// mmXML::mmXMLNodeI* v_psNewParamNameType = v_psNewParamName->AddChild(mmUI::g_pUIXML_EL_DEF_Type); +// v_psNewParamNameType->SetText(mmUI::g_pUIXML_EL_DEF_Type_String); +// // value +// mmXML::mmXMLNodeI* v_psNewParamNameValue = v_psNewParamName->AddChild(mmUI::g_pUIXML_EL_DEF_Value); +// v_psNewParamNameValue->SetText(L""); +// +// mmString v_sOutXML = v_psXMLDoc->SaveToXMLBuffer(); +// +// delete v_psXMLDoc; +// +// SendLogMessage(mmLog::debug,mmString(L"End CreateNewOutputValueFromExistingUI")); +// +// return v_sOutXML; +//} + +// PB // +//mmString mmImages::mmImagesComplexCalculationManagement::CreateNewOutputValueFromMixOfTwoExistingUI(mmXML::mmXMLDocI* p_psXMLComplexCalculationPatternDefinition) +//{ +// SendLogMessage(mmLog::debug,mmString(L"Start CreateNewOutputValueFromMixOfTwoExistingUI")); +// +// // create XML document which specifies new output parameter name +// mmXML::mmXMLDocI* v_psXMLDoc = mmInterfaceInitializers::CreateXMLDocument(this->GetLogReceiver()); +// //mmXML::mmXMLDocI* v_psXMLDoc = mmInterfaceInitializers::CreateXMLDocument(NULL); +// +// // add dialog root node +// v_psXMLDoc->CreateXMLRootNode(mmUI::g_pUIXML_EL_UserDialog); +// mmXML::mmXMLNodeI* v_psRootNode = v_psXMLDoc->GetXMLRootNode(); +// // add visible name for dialog +// mmXML::mmXMLNodeI* v_psRootNodeName = v_psRootNode->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psRootNodeName->SetText(L"Mix two existing output values"); +// +// // add output param group node +// mmXML::mmXMLNodeI* v_psGroupNode = v_psRootNode->AddChild(mmUI::g_pUIXML_EL_Group); +// // add visible name for group node +// mmXML::mmXMLNodeI* v_psGroupNodeName = v_psGroupNode->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psGroupNodeName->SetText(L""); +// +// // add existing output 1st value selection +// mmXML::mmXMLNodeI* v_psOut1ValSelection = v_psGroupNode->AddChild(mmUI::g_pUIXML_EL_SingleValue); +// // name +// mmXML::mmXMLNodeI* v_psOut1ValSelectionName = v_psOut1ValSelection->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psOut1ValSelectionName->SetText(L" Select 1st output value to modify: "); +// // type +// mmXML::mmXMLNodeI* v_psOut1ValSelectionType = v_psOut1ValSelection->AddChild(mmUI::g_pUIXML_EL_DEF_Type); +// v_psOut1ValSelectionType->SetText(mmUI::g_pUIXML_EL_DEF_Type_String); +// // values range +// mmXML::mmXMLNodeI* v_psOut1ValSelectionRange = v_psOut1ValSelection->AddChild(mmUI::g_pUIXML_EL_DEF_Range); +// mmXML::mmXMLNodeI* v_psOut1ValSelectionRangeStringList = v_psOut1ValSelectionRange->AddChild(mmUI::g_pUIXML_EL_DEF_StringList); +// std::vector v_vOutParams = p_psXMLComplexCalculationPatternDefinition->GetXMLRootNode()->FindChild(mmClouds::g_pComplexCalcXML_PatternOutputParams_Node)->GetChilds(); +// mmInt v_iOPCount = v_vOutParams.size(); +// for(mmInt v_iOP=0;v_iOPFindChild(mmClouds::g_pComplexCalcXML_PatternOutputParamType_Node)->GetText().compare(mmClouds::g_pAutoCalcXML_Params_ParamType_IntegerValue) == 0) +// { +// mmXML::mmXMLNodeI* v_psUIStringListElement = v_psOut1ValSelectionRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(v_vOutParams[v_iOP]->FindChild(mmClouds::g_pComplexCalcXML_PatternOutputParamName_Node)->GetText()); +// }; +// if(v_vOutParams[v_iOP]->FindChild(mmClouds::g_pComplexCalcXML_PatternOutputParamType_Node)->GetText().compare(mmClouds::g_pAutoCalcXML_Params_ParamType_RealValue) == 0) +// { +// mmXML::mmXMLNodeI* v_psUIStringListElement = v_psOut1ValSelectionRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(v_vOutParams[v_iOP]->FindChild(mmClouds::g_pComplexCalcXML_PatternOutputParamName_Node)->GetText()); +// }; +// }; +// std::vector v_vInParams = p_psXMLComplexCalculationPatternDefinition->GetXMLRootNode()->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParams_Node)->GetChilds(); +// mmInt v_iIPCount = v_vInParams.size(); +// for(mmInt v_iIP=0;v_iIPFindChild(mmClouds::g_pComplexCalcXML_PatternInputParamType_Node)->GetText().compare(mmClouds::g_pAutoCalcXML_Params_ParamType_IntegerValue) == 0) +// { +// mmXML::mmXMLNodeI* v_psUIStringListElement = v_psOut1ValSelectionRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(v_vInParams[v_iIP]->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParamName_Node)->GetText()); +// }; +// if(v_vInParams[v_iIP]->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParamType_Node)->GetText().compare(mmClouds::g_pAutoCalcXML_Params_ParamType_RealValue) == 0) +// { +// mmXML::mmXMLNodeI* v_psUIStringListElement = v_psOut1ValSelectionRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(v_vInParams[v_iIP]->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParamName_Node)->GetText()); +// }; +// }; +// // value +// mmXML::mmXMLNodeI* v_psOut1ValSelectionValue = v_psOut1ValSelection->AddChild(mmUI::g_pUIXML_EL_DEF_Value); +// v_psOut1ValSelectionValue->SetText(L""); +// +// // add existing output 2nd value selection +// mmXML::mmXMLNodeI* v_psOut2ValSelection = v_psGroupNode->AddChild(mmUI::g_pUIXML_EL_SingleValue); +// // name +// mmXML::mmXMLNodeI* v_psOut2ValSelectionName = v_psOut2ValSelection->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psOut2ValSelectionName->SetText(L" Select 2nd output value to modify: "); +// // type +// mmXML::mmXMLNodeI* v_psOut2ValSelectionType = v_psOut2ValSelection->AddChild(mmUI::g_pUIXML_EL_DEF_Type); +// v_psOut2ValSelectionType->SetText(mmUI::g_pUIXML_EL_DEF_Type_String); +// // values range +// mmXML::mmXMLNodeI* v_psOut2ValSelectionRange = v_psOut2ValSelection->AddChild(mmUI::g_pUIXML_EL_DEF_Range); +// mmXML::mmXMLNodeI* v_psOut2ValSelectionRangeStringList = v_psOut2ValSelectionRange->AddChild(mmUI::g_pUIXML_EL_DEF_StringList); +// for(mmInt v_iOP=0;v_iOPFindChild(mmClouds::g_pComplexCalcXML_PatternOutputParamType_Node)->GetText().compare(mmClouds::g_pAutoCalcXML_Params_ParamType_IntegerValue) == 0) +// { +// mmXML::mmXMLNodeI* v_psUIStringListElement = v_psOut2ValSelectionRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(v_vOutParams[v_iOP]->FindChild(mmClouds::g_pComplexCalcXML_PatternOutputParamName_Node)->GetText()); +// }; +// if(v_vOutParams[v_iOP]->FindChild(mmClouds::g_pComplexCalcXML_PatternOutputParamType_Node)->GetText().compare(mmClouds::g_pAutoCalcXML_Params_ParamType_RealValue) == 0) +// { +// mmXML::mmXMLNodeI* v_psUIStringListElement = v_psOut2ValSelectionRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(v_vOutParams[v_iOP]->FindChild(mmClouds::g_pComplexCalcXML_PatternOutputParamName_Node)->GetText()); +// }; +// }; +// for(mmInt v_iIP=0;v_iIPFindChild(mmClouds::g_pComplexCalcXML_PatternInputParamType_Node)->GetText().compare(mmClouds::g_pAutoCalcXML_Params_ParamType_IntegerValue) == 0) +// { +// mmXML::mmXMLNodeI* v_psUIStringListElement = v_psOut2ValSelectionRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(v_vInParams[v_iIP]->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParamName_Node)->GetText()); +// }; +// if(v_vInParams[v_iIP]->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParamType_Node)->GetText().compare(mmClouds::g_pAutoCalcXML_Params_ParamType_RealValue) == 0) +// { +// mmXML::mmXMLNodeI* v_psUIStringListElement = v_psOut2ValSelectionRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(v_vInParams[v_iIP]->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParamName_Node)->GetText()); +// }; +// }; +// // value +// mmXML::mmXMLNodeI* v_psOut2ValSelectionValue = v_psOut2ValSelection->AddChild(mmUI::g_pUIXML_EL_DEF_Value); +// v_psOut2ValSelectionValue->SetText(L""); +// +// // add formula input +// mmXML::mmXMLNodeI* v_psFormula = v_psGroupNode->AddChild(mmUI::g_pUIXML_EL_SingleValue); +// // name +// mmXML::mmXMLNodeI* v_psFormulaName = v_psFormula->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psFormulaName->SetText(L" Set operation: "); +// // type +// mmXML::mmXMLNodeI* v_psFormulaType = v_psFormula->AddChild(mmUI::g_pUIXML_EL_DEF_Type); +// v_psFormulaType->SetText(mmUI::g_pUIXML_EL_DEF_Type_String); +// // values range +// mmXML::mmXMLNodeI* v_psFormulaRange = v_psFormula->AddChild(mmUI::g_pUIXML_EL_DEF_Range); +// mmXML::mmXMLNodeI* v_psFormulaRangeStringList = v_psFormulaRange->AddChild(mmUI::g_pUIXML_EL_DEF_StringList); +// mmXML::mmXMLNodeI* v_psUIStringListElement = v_psFormulaRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(mmClouds::g_pComplexCalcXML_PatternOutputFormula_Addition); +// v_psUIStringListElement = v_psFormulaRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(mmClouds::g_pComplexCalcXML_PatternOutputFormula_Subtraction); +// v_psUIStringListElement = v_psFormulaRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(mmClouds::g_pComplexCalcXML_PatternOutputFormula_Multiplication); +// v_psUIStringListElement = v_psFormulaRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(mmClouds::g_pComplexCalcXML_PatternOutputFormula_Division); +// v_psUIStringListElement = v_psFormulaRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(mmClouds::g_pComplexCalcXML_PatternOutputFormula_Minimum); +// v_psUIStringListElement = v_psFormulaRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(mmClouds::g_pComplexCalcXML_PatternOutputFormula_Maximum); +// v_psUIStringListElement = v_psFormulaRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(mmClouds::g_pComplexCalcXML_PatternOutputFormula_Equal); +// v_psUIStringListElement = v_psFormulaRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(mmClouds::g_pComplexCalcXML_PatternOutputFormula_Less); +// v_psUIStringListElement = v_psFormulaRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(mmClouds::g_pComplexCalcXML_PatternOutputFormula_Greater); +// // value +// mmXML::mmXMLNodeI* v_psFormulaValue = v_psFormula->AddChild(mmUI::g_pUIXML_EL_DEF_Value); +// v_psFormulaValue->SetText(L""); +// +// // add name for new value +// mmXML::mmXMLNodeI* v_psNewParamName = v_psGroupNode->AddChild(mmUI::g_pUIXML_EL_SingleValue); +// // name +// mmXML::mmXMLNodeI* v_psNewParamNameName = v_psNewParamName->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psNewParamNameName->SetText(L" Set new name for output value: "); +// // type +// mmXML::mmXMLNodeI* v_psNewParamNameType = v_psNewParamName->AddChild(mmUI::g_pUIXML_EL_DEF_Type); +// v_psNewParamNameType->SetText(mmUI::g_pUIXML_EL_DEF_Type_String); +// // value +// mmXML::mmXMLNodeI* v_psNewParamNameValue = v_psNewParamName->AddChild(mmUI::g_pUIXML_EL_DEF_Value); +// v_psNewParamNameValue->SetText(L""); +// +// mmString v_sOutXML = v_psXMLDoc->SaveToXMLBuffer(); +// +// delete v_psXMLDoc; +// +// SendLogMessage(mmLog::debug,mmString(L"End CreateNewOutputValueFromMixOfTwoExistingUI")); +// +// return v_sOutXML; +//} + +// PB // +//mmString mmImages::mmImagesComplexCalculationManagement::CreateNewConstantInputValueUI(mmXML::mmXMLDocI* p_psXMLComplexCalculationPatternDefinition) +//{ +// SendLogMessage(mmLog::debug,mmString(L"Start CreateNewConstantInputValueUI")); +// +// // create XML document which specifies new input parameter name +// mmXML::mmXMLDocI* v_psXMLDoc = mmInterfaceInitializers::CreateXMLDocument(this->GetLogReceiver()); +// //mmXML::mmXMLDocI* v_psXMLDoc = mmInterfaceInitializers::CreateXMLDocument(NULL); +// +// // add dialog root node +// v_psXMLDoc->CreateXMLRootNode(mmUI::g_pUIXML_EL_UserDialog); +// mmXML::mmXMLNodeI* v_psRootNode = v_psXMLDoc->GetXMLRootNode(); +// // add visible name for dialog +// mmXML::mmXMLNodeI* v_psRootNodeName = v_psRootNode->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psRootNodeName->SetText(L"Create/Modify existing input value"); +// +// // add input param group node +// mmXML::mmXMLNodeI* v_psGroupNode = v_psRootNode->AddChild(mmUI::g_pUIXML_EL_Group); +// // add visible name for group node +// mmXML::mmXMLNodeI* v_psGroupNodeName = v_psGroupNode->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psGroupNodeName->SetText(L""); +// +// // add existing input value selection +// mmXML::mmXMLNodeI* v_psInValSelection = v_psGroupNode->AddChild(mmUI::g_pUIXML_EL_SingleValue); +// // name +// mmXML::mmXMLNodeI* v_psInValSelectionName = v_psInValSelection->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psInValSelectionName->SetText(L" Select input value: "); +// // type +// mmXML::mmXMLNodeI* v_psInValSelectionType = v_psInValSelection->AddChild(mmUI::g_pUIXML_EL_DEF_Type); +// v_psInValSelectionType->SetText(mmUI::g_pUIXML_EL_DEF_Type_String); +// // values range +// mmXML::mmXMLNodeI* v_psInValSelectionRange = v_psInValSelection->AddChild(mmUI::g_pUIXML_EL_DEF_Range); +// mmXML::mmXMLNodeI* v_psInValSelectionRangeStringList = v_psInValSelectionRange->AddChild(mmUI::g_pUIXML_EL_DEF_StringList); +// std::vector v_vInParams = p_psXMLComplexCalculationPatternDefinition->GetXMLRootNode()->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParams_Node)->GetChilds(); +// mmInt v_iIPCount = v_vInParams.size(); +// for(mmInt v_iIP=0;v_iIPFindChild(mmClouds::g_pComplexCalcXML_PatternInputParamType_Node)->GetText().compare(mmClouds::g_pAutoCalcXML_Params_ParamType_IntegerValue) == 0) +// { +// mmXML::mmXMLNodeI* v_psUIStringListElement = v_psInValSelectionRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(v_vInParams[v_iIP]->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParamName_Node)->GetText()); +// }; +// if(v_vInParams[v_iIP]->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParamType_Node)->GetText().compare(mmClouds::g_pAutoCalcXML_Params_ParamType_RealValue) == 0) +// { +// mmXML::mmXMLNodeI* v_psUIStringListElement = v_psInValSelectionRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(v_vInParams[v_iIP]->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParamName_Node)->GetText()); +// }; +// }; +// mmXML::mmXMLNodeI* v_psUIStringListElement = v_psInValSelectionRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(mmClouds::g_pComplexCalcXML_PatternInputParamConstant_Real); +// v_psUIStringListElement = v_psInValSelectionRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(mmClouds::g_pComplexCalcXML_PatternInputParamConstant_Int); +// // value +// mmXML::mmXMLNodeI* v_psInValSelectionValue = v_psInValSelection->AddChild(mmUI::g_pUIXML_EL_DEF_Value); +// v_psInValSelectionValue->SetText(L""); +// +// // add multiplication input +// mmXML::mmXMLNodeI* v_psMultVal = v_psGroupNode->AddChild(mmUI::g_pUIXML_EL_SingleValue); +// // name +// mmXML::mmXMLNodeI* v_psMultValName = v_psMultVal->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psMultValName->SetText(L" Set modification/constant value: "); +// // type +// mmXML::mmXMLNodeI* v_psMultValType = v_psMultVal->AddChild(mmUI::g_pUIXML_EL_DEF_Type); +// v_psMultValType->SetText(mmUI::g_pUIXML_EL_DEF_Type_Real); +// // value +// mmXML::mmXMLNodeI* v_psMultValValue = v_psMultVal->AddChild(mmUI::g_pUIXML_EL_DEF_Value); +// v_psMultValValue->SetText(L"1.0"); +// +// // add name for new value +// mmXML::mmXMLNodeI* v_psNewParamName = v_psGroupNode->AddChild(mmUI::g_pUIXML_EL_SingleValue); +// // name +// mmXML::mmXMLNodeI* v_psNewParamNameName = v_psNewParamName->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psNewParamNameName->SetText(L" Set new name for input value: "); +// // type +// mmXML::mmXMLNodeI* v_psNewParamNameType = v_psNewParamName->AddChild(mmUI::g_pUIXML_EL_DEF_Type); +// v_psNewParamNameType->SetText(mmUI::g_pUIXML_EL_DEF_Type_String); +// // value +// mmXML::mmXMLNodeI* v_psNewParamNameValue = v_psNewParamName->AddChild(mmUI::g_pUIXML_EL_DEF_Value); +// v_psNewParamNameValue->SetText(L""); +// +// mmString v_sOutXML = v_psXMLDoc->SaveToXMLBuffer(); +// +// delete v_psXMLDoc; +// +// SendLogMessage(mmLog::debug,mmString(L"End CreateNewConstantInputValueUI")); +// +// return v_sOutXML; +//} + +// PB // +//mmString mmImages::mmImagesComplexCalculationManagement::CreateNewConstantInputDecisionUI(void) +//{ +// SendLogMessage(mmLog::debug,mmString(L"Start CreateNewConstantInputDecisionUI")); +// +// // create XML document which specifies new input parameter name +// mmXML::mmXMLDocI* v_psXMLDoc = mmInterfaceInitializers::CreateXMLDocument(this->GetLogReceiver()); +// //mmXML::mmXMLDocI* v_psXMLDoc = mmInterfaceInitializers::CreateXMLDocument(NULL); +// +// // add dialog root node +// v_psXMLDoc->CreateXMLRootNode(mmUI::g_pUIXML_EL_UserDialog); +// mmXML::mmXMLNodeI* v_psRootNode = v_psXMLDoc->GetXMLRootNode(); +// // add visible name for dialog +// mmXML::mmXMLNodeI* v_psRootNodeName = v_psRootNode->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psRootNodeName->SetText(L"Create input constant decision"); +// +// // add input param group node +// mmXML::mmXMLNodeI* v_psGroupNode = v_psRootNode->AddChild(mmUI::g_pUIXML_EL_Group); +// // add visible name for group node +// mmXML::mmXMLNodeI* v_psGroupNodeName = v_psGroupNode->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psGroupNodeName->SetText(L""); +// +// // add existing input value selection +// mmXML::mmXMLNodeI* v_psInValSelection = v_psGroupNode->AddChild(mmUI::g_pUIXML_EL_SingleValue); +// // name +// mmXML::mmXMLNodeI* v_psInValSelectionName = v_psInValSelection->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psInValSelectionName->SetText(L" Select input value: "); +// // type +// mmXML::mmXMLNodeI* v_psInValSelectionType = v_psInValSelection->AddChild(mmUI::g_pUIXML_EL_DEF_Type); +// v_psInValSelectionType->SetText(mmUI::g_pUIXML_EL_DEF_Type_String); +// // values range +// mmXML::mmXMLNodeI* v_psInValSelectionRange = v_psInValSelection->AddChild(mmUI::g_pUIXML_EL_DEF_Range); +// mmXML::mmXMLNodeI* v_psInValSelectionRangeStringList = v_psInValSelectionRange->AddChild(mmUI::g_pUIXML_EL_DEF_StringList); +// mmXML::mmXMLNodeI* v_psUIStringListElement = v_psInValSelectionRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(mmClouds::g_pAutoCalcXML_Params_ParamType_BoolValue_YES); +// v_psUIStringListElement = v_psInValSelectionRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(mmClouds::g_pAutoCalcXML_Params_ParamType_BoolValue_NO); +// // value +// mmXML::mmXMLNodeI* v_psInValSelectionValue = v_psInValSelection->AddChild(mmUI::g_pUIXML_EL_DEF_Value); +// v_psInValSelectionValue->SetText(mmClouds::g_pAutoCalcXML_Params_ParamType_BoolValue_YES); +// +// // add name for new value +// mmXML::mmXMLNodeI* v_psNewParamName = v_psGroupNode->AddChild(mmUI::g_pUIXML_EL_SingleValue); +// // name +// mmXML::mmXMLNodeI* v_psNewParamNameName = v_psNewParamName->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psNewParamNameName->SetText(L" Set new name for input value: "); +// // type +// mmXML::mmXMLNodeI* v_psNewParamNameType = v_psNewParamName->AddChild(mmUI::g_pUIXML_EL_DEF_Type); +// v_psNewParamNameType->SetText(mmUI::g_pUIXML_EL_DEF_Type_String); +// // value +// mmXML::mmXMLNodeI* v_psNewParamNameValue = v_psNewParamName->AddChild(mmUI::g_pUIXML_EL_DEF_Value); +// v_psNewParamNameValue->SetText(L""); +// +// mmString v_sOutXML = v_psXMLDoc->SaveToXMLBuffer(); +// +// delete v_psXMLDoc; +// +// SendLogMessage(mmLog::debug,mmString(L"End CreateNewConstantInputDecisionUI")); +// +// return v_sOutXML; +//} + +// PB // +//void mmImages::mmImagesComplexCalculationManagement::AddSingleCalculationMethodIntoPattern( mmString p_sCalculationMethodParams, +// mmXML::mmXMLDocI* p_psXMLComplexCalculationPatternDefinition) +//{ +// SendLogMessage(mmLog::debug,mmString(L"Start AddSingleCalculationMethodIntoPattern")); +// +// mmXML::mmXMLDocI* v_psXMLDoc = mmInterfaceInitializers::CreateXMLDocument(this->GetLogReceiver()); +// //mmXML::mmXMLDocI* v_psXMLDoc = mmInterfaceInitializers::CreateXMLDocument(NULL); +// +// // parse string +// v_psXMLDoc->ParseXMLBuffer(p_sCalculationMethodParams); +// mmXML::mmXMLNodeI* v_psRootNode = v_psXMLDoc->GetXMLRootNode(); +// +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod = p_psXMLComplexCalculationPatternDefinition->GetXMLRootNode()->FindChild(mmImages::g_pComplexCalcXML_PatternDefinition_Node)->AddChild(mmImages::g_pComplexCalcXML_PatternCalcMethod_Node); +// // add name of CM +// mmXML::mmXMLNodeI* v_psXMLCCNewMethodName = v_psXMLCCNewMethod->AddChild(mmImages::g_pComplexCalcXML_PatternCalcMethodIDName_Node); +// v_psXMLCCNewMethodName->SetText(v_psRootNode->FindChild(mmUI::g_pUIXML_EL_DEF_Name)->GetText()); +// +// // adding input params node +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_InParams = v_psXMLCCNewMethod->AddChild(mmClouds::g_pAutoCalcXML_INParams_Node); +// +// // add CM input params +// std::vector v_vInputParams = v_psRootNode->GetChild(1)->GetChilds(); +// mmInt v_iIPCount = v_vInputParams.size(); +// for(mmInt v_iIP=1;v_iIP v_vOrigAttrParams = v_vInputParams[v_iIP]->GetAttributes(); +// +// if(v_vOrigAttrParams.size() > 0) +// { +// if(v_vOrigAttrParams[1].sValue.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_BoolValue) == 0) +// { +// // adding input param +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_InParam = v_psXMLCCNewMethod_InParams->AddChild(mmClouds::g_pAutoCalcXML_Params_Param_Node); +// // add name +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_InParam_Name = v_psXMLCCNewMethod_InParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamName_Node); +// //v_psXMLCCNewMethod_InParam_Name->SetText(v_vOrigAttrParams[0].sValue); +// v_psXMLCCNewMethod_InParam_Name->SetText(v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// // add type +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_InParam_Type = v_psXMLCCNewMethod_InParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamType_Node); +// v_psXMLCCNewMethod_InParam_Type->SetText(mmClouds::g_pAutoCalcXML_Params_ParamType_BoolValue); +// // add value +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_InParam_Value = v_psXMLCCNewMethod_InParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamValue_Node); +// v_psXMLCCNewMethod_InParam_Value->SetText(v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// }; +// if(v_vOrigAttrParams[1].sValue.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_CloudName) == 0) +// { +// // adding input param +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_InParam = v_psXMLCCNewMethod_InParams->AddChild(mmClouds::g_pAutoCalcXML_Params_Param_Node); +// // add name +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_InParam_Name = v_psXMLCCNewMethod_InParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamName_Node); +// //v_psXMLCCNewMethod_InParam_Name->SetText(v_vOrigAttrParams[0].sValue); +// v_psXMLCCNewMethod_InParam_Name->SetText(v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// // add type +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_InParam_Type = v_psXMLCCNewMethod_InParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamType_Node); +// v_psXMLCCNewMethod_InParam_Type->SetText(mmClouds::g_pAutoCalcXML_Params_ParamType_CloudName); +// // add value +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_InParam_Value = v_psXMLCCNewMethod_InParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamValue_Node); +// v_psXMLCCNewMethod_InParam_Value->SetText(v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// }; +// if(v_vOrigAttrParams[1].sValue.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_DataLayerName) == 0) +// { +// // adding input param +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_InParam = v_psXMLCCNewMethod_InParams->AddChild(mmClouds::g_pAutoCalcXML_Params_Param_Node); +// // add name +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_InParam_Name = v_psXMLCCNewMethod_InParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamName_Node); +// //v_psXMLCCNewMethod_InParam_Name->SetText(v_vOrigAttrParams[0].sValue); +// v_psXMLCCNewMethod_InParam_Name->SetText(v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// // add type +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_InParam_Type = v_psXMLCCNewMethod_InParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamType_Node); +// v_psXMLCCNewMethod_InParam_Type->SetText(mmClouds::g_pAutoCalcXML_Params_ParamType_DataLayerName); +// // add value +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_InParam_Value = v_psXMLCCNewMethod_InParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamValue_Node); +// v_psXMLCCNewMethod_InParam_Value->SetText(v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// }; +// if(v_vOrigAttrParams[1].sValue.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_IntegerValue) == 0) +// { +// // adding input param +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_InParam = v_psXMLCCNewMethod_InParams->AddChild(mmClouds::g_pAutoCalcXML_Params_Param_Node); +// // add name +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_InParam_Name = v_psXMLCCNewMethod_InParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamName_Node); +// //v_psXMLCCNewMethod_InParam_Name->SetText(v_vOrigAttrParams[0].sValue); +// v_psXMLCCNewMethod_InParam_Name->SetText(v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// // add type +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_InParam_Type = v_psXMLCCNewMethod_InParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamType_Node); +// v_psXMLCCNewMethod_InParam_Type->SetText(mmClouds::g_pAutoCalcXML_Params_ParamType_IntegerValue); +// // add value +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_InParam_Value = v_psXMLCCNewMethod_InParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamValue_Node); +// v_psXMLCCNewMethod_InParam_Value->SetText(v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// }; +// if(v_vOrigAttrParams[1].sValue.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_RealValue) == 0) +// { +// // adding input param +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_InParam = v_psXMLCCNewMethod_InParams->AddChild(mmClouds::g_pAutoCalcXML_Params_Param_Node); +// // add name +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_InParam_Name = v_psXMLCCNewMethod_InParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamName_Node); +// //v_psXMLCCNewMethod_InParam_Name->SetText(v_vOrigAttrParams[0].sValue); +// v_psXMLCCNewMethod_InParam_Name->SetText(v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// // add type +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_InParam_Type = v_psXMLCCNewMethod_InParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamType_Node); +// v_psXMLCCNewMethod_InParam_Type->SetText(mmClouds::g_pAutoCalcXML_Params_ParamType_RealValue); +// // add value +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_InParam_Value = v_psXMLCCNewMethod_InParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamValue_Node); +// v_psXMLCCNewMethod_InParam_Value->SetText(v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// }; +// }; +// }; +// +// // adding output params node +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_OutParams = v_psXMLCCNewMethod->AddChild(mmClouds::g_pAutoCalcXML_OUTParams_Node); +// +// std::vector v_vOutputParams = v_psRootNode->GetChild(2)->GetChilds(); +// mmInt v_iOPCount = v_vOutputParams.size(); +// for(mmInt v_iOP=1;v_iOP v_vOrigAttrParams = v_vOutputParams[v_iOP]->GetAttributes(); +// +// if(v_vOrigAttrParams.size() > 0) +// { +// if(v_vOrigAttrParams[1].sValue.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_BoolValue) == 0) +// { +// // adding output param +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_OutParam = v_psXMLCCNewMethod_OutParams->AddChild(mmClouds::g_pAutoCalcXML_Params_Param_Node); +// // add name +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_OutParam_Name = v_psXMLCCNewMethod_OutParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamName_Node); +// v_psXMLCCNewMethod_OutParam_Name->SetText(v_vOrigAttrParams[0].sValue); +// // add type +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_OutParam_Type = v_psXMLCCNewMethod_OutParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamType_Node); +// v_psXMLCCNewMethod_OutParam_Type->SetText(mmClouds::g_pAutoCalcXML_Params_ParamType_BoolValue); +// // add value +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_OutParam_Value = v_psXMLCCNewMethod_OutParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamValue_Node); +// v_psXMLCCNewMethod_OutParam_Value->SetText(v_vOutputParams[v_iOP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// }; +// if(v_vOrigAttrParams[1].sValue.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_CloudName) == 0) +// { +// // adding output param +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_OutParam = v_psXMLCCNewMethod_OutParams->AddChild(mmClouds::g_pAutoCalcXML_Params_Param_Node); +// // add name +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_OutParam_Name = v_psXMLCCNewMethod_OutParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamName_Node); +// v_psXMLCCNewMethod_OutParam_Name->SetText(v_vOrigAttrParams[0].sValue); +// // add type +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_OutParam_Type = v_psXMLCCNewMethod_OutParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamType_Node); +// v_psXMLCCNewMethod_OutParam_Type->SetText(mmClouds::g_pAutoCalcXML_Params_ParamType_CloudName); +// // add value +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_OutParam_Value = v_psXMLCCNewMethod_OutParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamValue_Node); +// v_psXMLCCNewMethod_OutParam_Value->SetText(v_vOutputParams[v_iOP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// }; +// if(v_vOrigAttrParams[1].sValue.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_DataLayerName) == 0) +// { +// // adding output param +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_OutParam = v_psXMLCCNewMethod_OutParams->AddChild(mmClouds::g_pAutoCalcXML_Params_Param_Node); +// // add name +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_OutParam_Name = v_psXMLCCNewMethod_OutParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamName_Node); +// v_psXMLCCNewMethod_OutParam_Name->SetText(v_vOrigAttrParams[0].sValue); +// // add type +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_OutParam_Type = v_psXMLCCNewMethod_OutParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamType_Node); +// v_psXMLCCNewMethod_OutParam_Type->SetText(mmClouds::g_pAutoCalcXML_Params_ParamType_DataLayerName); +// // add value +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_OutParam_Value = v_psXMLCCNewMethod_OutParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamValue_Node); +// v_psXMLCCNewMethod_OutParam_Value->SetText(v_vOutputParams[v_iOP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// }; +// if(v_vOrigAttrParams[1].sValue.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_IntegerValue) == 0) +// { +// // adding output param +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_OutParam = v_psXMLCCNewMethod_OutParams->AddChild(mmClouds::g_pAutoCalcXML_Params_Param_Node); +// // add name +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_OutParam_Name = v_psXMLCCNewMethod_OutParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamName_Node); +// v_psXMLCCNewMethod_OutParam_Name->SetText(v_vOrigAttrParams[0].sValue); +// // add type +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_OutParam_Type = v_psXMLCCNewMethod_OutParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamType_Node); +// v_psXMLCCNewMethod_OutParam_Type->SetText(mmClouds::g_pAutoCalcXML_Params_ParamType_IntegerValue); +// // add value +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_OutParam_Value = v_psXMLCCNewMethod_OutParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamValue_Node); +// v_psXMLCCNewMethod_OutParam_Value->SetText(v_vOutputParams[v_iOP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// }; +// if(v_vOrigAttrParams[1].sValue.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_RealValue) == 0) +// { +// // adding output param +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_OutParam = v_psXMLCCNewMethod_OutParams->AddChild(mmClouds::g_pAutoCalcXML_Params_Param_Node); +// // add name +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_OutParam_Name = v_psXMLCCNewMethod_OutParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamName_Node); +// v_psXMLCCNewMethod_OutParam_Name->SetText(v_vOrigAttrParams[0].sValue); +// // add type +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_OutParam_Type = v_psXMLCCNewMethod_OutParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamType_Node); +// v_psXMLCCNewMethod_OutParam_Type->SetText(mmClouds::g_pAutoCalcXML_Params_ParamType_RealValue); +// // add value +// mmXML::mmXMLNodeI* v_psXMLCCNewMethod_OutParam_Value = v_psXMLCCNewMethod_OutParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamValue_Node); +// v_psXMLCCNewMethod_OutParam_Value->SetText(v_vOutputParams[v_iOP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// }; +// }; +// }; +// +// delete v_psXMLDoc; +// +// SendLogMessage(mmLog::debug,mmString(L"End AddSingleCalculationMethodIntoPattern")); +//} + +void mmImages::mmImagesComplexCalculationManagement::LoadComplexPatternsFromFile(mmString p_sCPFile) +{ + SendLogMessage(mmLog::debug,mmString(L"Start LoadComplexPatternsFromFile")); + + delete m_psXMLComplexPatternContainer; + m_psXMLComplexPatternContainer = mmInterfaceInitializers::CreateXMLDocument(this->GetLogReceiver()); + + if(mmOperatingSystem::IsExistingFile(p_sCPFile)) + { + m_psXMLComplexPatternContainer->ParseXMLFile(p_sCPFile); + } + else + { + m_psXMLComplexPatternContainer->CreateXMLRootNode(mmImages::g_pComplexCalcXML_PatternContainer_Node); + }; + + SendLogMessage(mmLog::debug,mmString(L"End LoadComplexPatternsFromFile")); +} + +// PB ?? +//void mmImages::mmImagesComplexCalculationManagement::SaveComplexPatternsIntoFile(mmString p_sCPFile) +//{ +// SendLogMessage(mmLog::debug,mmString(L"Start SaveComplexPatternsIntoFile")); +// +// m_psXMLComplexPatternContainer->SaveToXMLFile(p_sCPFile); +// +// SendLogMessage(mmLog::debug,mmString(L"End SaveComplexPatternsIntoFile")); +//} + +// PB // +//void mmImages::mmImagesComplexCalculationManagement::AddComplexPatternIntoContainer(mmXML::mmXMLDocI* p_psXMLComplexCalculationPatternDefinition) +//{ +// SendLogMessage(mmLog::debug,mmString(L"Start AddComplexPatternIntoContainer")); +// +// /* +// std::vector v_vPatternCMs = p_psXMLComplexCalculationPatternDefinition->GetXMLRootNode()-> +// FindChild(mmClouds::g_pComplexCalcXML_PatternDefinition_Node)-> +// GetChilds(); +// +// if(v_vPatternCMs.size() > 0) +// { +// // check name of pattern; if this name exists, add extension _YYYYMMDDHHMMSS +// mmString v_sNewPatternName = p_psXMLComplexCalculationPatternDefinition->GetXMLRootNode()-> +// FindChild(mmClouds::g_pComplexCalcXML_PatternName_Node)-> +// GetText(); +// std::vector v_vCCPatterns = m_psXMLComplexPatternContainer->GetXMLRootNode()->GetChilds(); +// mmInt v_iCCPCount = v_vCCPatterns.size(); +// for(mmInt v_iCCP=0;v_iCCPFindChild(mmClouds::g_pComplexCalcXML_PatternName_Node)->GetText().compare(v_sNewPatternName) == 0) +// { +// v_sNewPatternName += mmString(L" ") + +// mmStringUtilities::GetCurrentDateTimeString(); +// +// break; +// }; +// }; +// p_psXMLComplexCalculationPatternDefinition->GetXMLRootNode()->FindChild(mmClouds::g_pComplexCalcXML_PatternName_Node)->SetText(v_sNewPatternName); +// +// m_psXMLComplexPatternContainer->GetXMLRootNode()->AddChildWithStructure(p_psXMLComplexCalculationPatternDefinition->GetXMLRootNode()); +// +// SaveComplexPatternsIntoFile(m_sComplexPatternContainerXMLFile); +// +// if(m_psStateChangeReceiver != NULL) +// { +// m_psStateChangeReceiver->ListOfComplexCalculationPatternsUpdated(); +// }; +// }; +// */ +// +// m_psXMLComplexPatternContainer->GetXMLRootNode()->AddChildWithStructure(p_psXMLComplexCalculationPatternDefinition->GetXMLRootNode()); +// +// SaveComplexPatternsIntoFile(m_sComplexPatternContainerXMLFile); +// +// if(m_psStateChangeReceiver != NULL) +// { +// m_psStateChangeReceiver->ListOfComplexCalculationPatternsUpdated(); +// }; +// +// SendLogMessage(mmLog::debug,mmString(L"End AddComplexPatternIntoContainer")); +//} + +// PB // +//void mmImages::mmImagesComplexCalculationManagement::UpdateComplexPatternInContainer(mmXML::mmXMLDocI* p_psXMLComplexCalculationPatternDefinition) +//{ +// SendLogMessage(mmLog::debug,mmString(L"Start UpdateComplexPatternInContainer")); +// +// std::vector v_vPatternCMs = p_psXMLComplexCalculationPatternDefinition->GetXMLRootNode()-> +// FindChild(mmImages::g_pComplexCalcXML_PatternDefinition_Node)-> +// GetChilds(); +// +// if(v_vPatternCMs.size() > 0) +// { +// // find pattern with given name +// mmString v_sNewPatternIDName = p_psXMLComplexCalculationPatternDefinition->GetXMLRootNode()-> +// FindChild(mmImages::g_pComplexCalcXML_PatternIDName_Node)-> +// GetText(); +// std::vector v_vCCPatterns = m_psXMLComplexPatternContainer->GetXMLRootNode()->GetChilds(); +// mmInt v_iCCPCount = v_vCCPatterns.size(); +// for(mmInt v_iCCP=0;v_iCCPFindChild(mmImages::g_pComplexCalcXML_PatternIDName_Node)->GetText().compare(v_sNewPatternIDName) == 0) +// { +// v_vCCPatterns[v_iCCP]->RemoveAllChilds(); +// +// std::vector v_vCurrentPatternChilds = m_psXMLCurrentPatternDefinition->GetXMLRootNode()->GetChilds(); +// mmInt v_iCCount = v_vCurrentPatternChilds.size(); +// for(mmInt v_iC=0;v_iCAddChildWithStructure(v_vCurrentPatternChilds[v_iC]); +// }; +// +// break; +// }; +// }; +// +// SaveComplexPatternsIntoFile(m_sComplexPatternContainerXMLFile); +// +// if(m_psStateChangeReceiver != NULL) +// { +// m_psStateChangeReceiver->ListOfComplexCalculationPatternsUpdated(); +// }; +// }; +// +// SendLogMessage(mmLog::debug,mmString(L"End UpdateComplexPatternInContainer")); +//} + +mmXML::mmXMLNodeI* mmImages::mmImagesComplexCalculationManagement::GetComplexCalculationPatternDefinition(mmString p_sCCPIDName) +{ + SendLogMessage(mmLog::debug,mmString(L"Start GetComplexCalculationPatternDefinition")); + + std::vector v_vCCPatterns = m_psXMLComplexPatternContainer->GetXMLRootNode()-> + GetChilds(); + + mmInt v_iCCPCount = v_vCCPatterns.size(); + for(mmInt v_iCCP=0;v_iCCPFindChild(mmImages::g_pComplexCalcXML_PatternIDName_Node)->GetText().compare(p_sCCPIDName) == 0) + { + return v_vCCPatterns[v_iCCP]; + }; + }; + + SendLogMessage(mmLog::debug,mmString(L"End GetComplexCalculationPatternDefinition")); + + return NULL; +} + +// PB // +//void mmImages::mmImagesComplexCalculationManagement::AddInternalWHILELoop(void) +//{ +// SendLogMessage(mmLog::debug,mmString(L"Start AddInternalWHILELoop")); +// +// // define input-output params +// // create XML document which stores input automation options +// mmXML::mmXMLDocI* v_psINXMLDoc = mmInterfaceInitializers::CreateXMLDocument(this->GetLogReceiver()); +// v_psINXMLDoc->CreateXMLRootNode(mmImages::g_pAutoCalcXML_INParams_Node); +// mmXML::mmXMLNodeI* v_psRootNode = v_psINXMLDoc->GetXMLRootNode(); +// // add while control variable param +// mmXML::mmXMLNodeI* v_psWHILEControlVariable = v_psRootNode->AddChild(mmImages::g_pAutoCalcXML_Params_Param_Node); +// // name +// mmXML::mmXMLNodeI* v_psWHILEControlVariableName = v_psWHILEControlVariable->AddChild(mmImages::g_pAutoCalcXML_Params_ParamName_Node); +// v_psWHILEControlVariableName->SetText(L"Continue WHILE loop?"); +// // type +// mmXML::mmXMLNodeI* v_psWHILEControlVariableType = v_psWHILEControlVariable->AddChild(mmImages::g_pAutoCalcXML_Params_ParamType_Node); +// v_psWHILEControlVariableType->SetText(mmImages::g_pAutoCalcXML_Params_ParamType_BoolValue); +// // value +// mmXML::mmXMLNodeI* v_psWHILEControlVariableValue = v_psWHILEControlVariable->AddChild(mmImages::g_pAutoCalcXML_Params_ParamValue_Node); +// v_psWHILEControlVariableValue->SetText(mmImages::g_pAutoCalcXML_Params_ParamType_BoolValue_YES); +// +// mmString v_sInParams = v_psINXMLDoc->SaveToXMLBuffer(); +// delete v_psINXMLDoc; +// +// // create XML document which stores output automation options +// mmXML::mmXMLDocI* v_psOUTXMLDoc = mmInterfaceInitializers::CreateXMLDocument(this->GetLogReceiver()); +// v_psOUTXMLDoc->CreateXMLRootNode(mmImages::g_pAutoCalcXML_OUTParams_Node); +// +// mmString v_sOutParams = v_psOUTXMLDoc->SaveToXMLBuffer(); +// delete v_psOUTXMLDoc; +// +// // user set values of params +// bool v_bNoParams = false; +// mmString v_sCMInOutParams = GetUIDefinitionForInternalAction( mmImages::g_pComplexCalcXML_Action_AddWhileLoop, +// v_sInParams, +// v_sOutParams, +// &v_bNoParams); +// +// mmString v_sSCMDef = v_sCMInOutParams; +// if(!v_bNoParams) +// { +// v_sSCMDef = m_psMainWindow->ShowModalDialog(v_sCMInOutParams,this); +// }; +// +// // update in/out params of pattern +// mmString v_sSCMInOutDef = UpdateInputOutputParameters(v_sSCMDef); +// +// // add internal action into calculation pattern +// AddInternalMethodIntoPattern(v_sSCMInOutDef, +// m_psXMLCurrentPatternDefinition); +// +// SendLogMessage(mmLog::debug,mmString(L"End AddInternalWHILELoop")); +//} + +// PB // +//void mmImages::mmImagesComplexCalculationManagement::AddInternalENDWHILELoop(void) +//{ +// SendLogMessage(mmLog::debug,mmString(L"Start AddInternalENDWHILELoop")); +// +// // define input-output params +// // create XML document which stores input automation options +// mmXML::mmXMLDocI* v_psINXMLDoc = mmInterfaceInitializers::CreateXMLDocument(this->GetLogReceiver()); +// v_psINXMLDoc->CreateXMLRootNode(mmImages::g_pAutoCalcXML_INParams_Node); +// +// mmString v_sInParams = v_psINXMLDoc->SaveToXMLBuffer(); +// delete v_psINXMLDoc; +// +// // create XML document which stores output automation options +// mmXML::mmXMLDocI* v_psOUTXMLDoc = mmInterfaceInitializers::CreateXMLDocument(this->GetLogReceiver()); +// v_psOUTXMLDoc->CreateXMLRootNode(mmImages::g_pAutoCalcXML_OUTParams_Node); +// +// mmString v_sOutParams = v_psOUTXMLDoc->SaveToXMLBuffer(); +// delete v_psOUTXMLDoc; +// +// // user set values of params +// bool v_bNoParams = false; +// mmString v_sCMInOutParams = GetUIDefinitionForInternalAction(mmImages::g_pComplexCalcXML_Action_AddEndWhile, +// v_sInParams, +// v_sOutParams, +// &v_bNoParams); +// +// mmString v_sSCMDef = v_sCMInOutParams; +// if(!v_bNoParams) +// { +// v_sSCMDef = m_psMainWindow->ShowModalDialog(v_sCMInOutParams,this); +// }; +// +// // update in/out params of pattern +// mmString v_sSCMInOutDef = UpdateInputOutputParameters(v_sSCMDef); +// +// // add internal action into calculation pattern +// AddInternalMethodIntoPattern(v_sSCMInOutDef, +// m_psXMLCurrentPatternDefinition); +// +// SendLogMessage(mmLog::debug,mmString(L"End AddInternalENDWHILELoop")); +//} + +// PB // +//void mmImages::mmImagesComplexCalculationManagement::AddInternalCopyBinaryOutToInVariable(void) +//{ +// SendLogMessage(mmLog::debug,mmString(L"Start AddInternalCopyBinaryOutToInVariable")); +// +// // define input-output params +// // create XML document which stores input automation options +// mmXML::mmXMLDocI* v_psINXMLDoc = mmInterfaceInitializers::CreateXMLDocument(this->GetLogReceiver()); +// v_psINXMLDoc->CreateXMLRootNode(mmImages::g_pAutoCalcXML_INParams_Node); +// mmXML::mmXMLNodeI* v_psRootNode = v_psINXMLDoc->GetXMLRootNode(); +// // add selection of surce output variable +// mmXML::mmXMLNodeI* v_psSelSourceVariable = v_psRootNode->AddChild(mmImages::g_pAutoCalcXML_Params_Param_Node); +// // name +// mmXML::mmXMLNodeI* v_psSelSourceVariableName = v_psSelSourceVariable->AddChild(mmImages::g_pAutoCalcXML_Params_ParamName_Node); +// v_psSelSourceVariableName->SetText(L"Source Binary Output Variable: "); +// // type +// mmXML::mmXMLNodeI* v_psSelSourceVariableType = v_psSelSourceVariable->AddChild(mmImages::g_pAutoCalcXML_Params_ParamType_Node); +// v_psSelSourceVariableType->SetText(mmImages::g_pAutoCalcXML_Params_ParamType_BoolValue); +// // value +// mmXML::mmXMLNodeI* v_psSelSourceVariableValue = v_psSelSourceVariable->AddChild(mmImages::g_pAutoCalcXML_Params_ParamValue_Node); +// v_psSelSourceVariableValue->SetText(mmImages::g_pAutoCalcXML_Params_ParamType_BoolValue_YES); +// // add selection of destination input variable +// mmXML::mmXMLNodeI* v_psSelDestinationVariable = v_psRootNode->AddChild(mmImages::g_pAutoCalcXML_Params_Param_Node); +// // name +// mmXML::mmXMLNodeI* v_psSelDestinationVariableName = v_psSelDestinationVariable->AddChild(mmImages::g_pAutoCalcXML_Params_ParamName_Node); +// v_psSelDestinationVariableName->SetText(L"Destination Binary Input Variable: "); +// // type +// mmXML::mmXMLNodeI* v_psSelDestinationVariableType = v_psSelDestinationVariable->AddChild(mmImages::g_pAutoCalcXML_Params_ParamType_Node); +// v_psSelDestinationVariableType->SetText(mmImages::g_pAutoCalcXML_Params_ParamType_BoolValue); +// // value +// mmXML::mmXMLNodeI* v_psSelDestinationVariableValue = v_psSelDestinationVariable->AddChild(mmImages::g_pAutoCalcXML_Params_ParamValue_Node); +// v_psSelDestinationVariableValue->SetText(mmImages::g_pAutoCalcXML_Params_ParamType_BoolValue_YES); +// +// mmString v_sInParams = v_psINXMLDoc->SaveToXMLBuffer(); +// delete v_psINXMLDoc; +// +// // create XML document which stores output automation options +// mmXML::mmXMLDocI* v_psOUTXMLDoc = mmInterfaceInitializers::CreateXMLDocument(this->GetLogReceiver()); +// v_psOUTXMLDoc->CreateXMLRootNode(mmImages::g_pAutoCalcXML_OUTParams_Node); +// +// mmString v_sOutParams = v_psOUTXMLDoc->SaveToXMLBuffer(); +// delete v_psOUTXMLDoc; +// +// // user set values of params +// bool v_bNoParams = false; +// mmString v_sCMInOutParams = GetUIDefinitionForInternalAction( mmImages::g_pComplexCalcXML_Action_CopyBinaryOutputToInputValue, +// v_sInParams, +// v_sOutParams, +// &v_bNoParams); +// +// mmString v_sSCMDef = v_sCMInOutParams; +// if(!v_bNoParams) +// { +// v_sSCMDef = m_psMainWindow->ShowModalDialog(v_sCMInOutParams,this); +// }; +// +// // update in/out params of pattern +// mmString v_sSCMInOutDef = UpdateInputOutputParameters(v_sSCMDef); +// +// // add internal action into calculation pattern +// AddInternalMethodIntoPattern(v_sSCMInOutDef, +// m_psXMLCurrentPatternDefinition); +// +// SendLogMessage(mmLog::debug,mmString(L"End AddInternalCopyBinaryOutToInVariable")); +//} + +// PB // +//void mmImages::mmImagesComplexCalculationManagement::AddInternalCopyIntOutToInVariable(void) +//{ +// SendLogMessage(mmLog::debug,mmString(L"Start AddInternalCopyIntOutToInVariable")); +// +// // define input-output params +// // create XML document which stores input automation options +// mmXML::mmXMLDocI* v_psINXMLDoc = mmInterfaceInitializers::CreateXMLDocument(this->GetLogReceiver()); +// v_psINXMLDoc->CreateXMLRootNode(mmImages::g_pAutoCalcXML_INParams_Node); +// mmXML::mmXMLNodeI* v_psRootNode = v_psINXMLDoc->GetXMLRootNode(); +// // add selection of surce output variable +// mmXML::mmXMLNodeI* v_psSelSourceVariable = v_psRootNode->AddChild(mmImages::g_pAutoCalcXML_Params_Param_Node); +// // name +// mmXML::mmXMLNodeI* v_psSelSourceVariableName = v_psSelSourceVariable->AddChild(mmImages::g_pAutoCalcXML_Params_ParamName_Node); +// v_psSelSourceVariableName->SetText(L"Source Integer Output Variable: "); +// // type +// mmXML::mmXMLNodeI* v_psSelSourceVariableType = v_psSelSourceVariable->AddChild(mmImages::g_pAutoCalcXML_Params_ParamType_Node); +// v_psSelSourceVariableType->SetText(mmImages::g_pAutoCalcXML_Params_ParamType_IntegerValue); +// // value +// mmXML::mmXMLNodeI* v_psSelSourceVariableValue = v_psSelSourceVariable->AddChild(mmImages::g_pAutoCalcXML_Params_ParamValue_Node); +// v_psSelSourceVariableValue->SetText(L""); +// // add selection of destination input variable +// mmXML::mmXMLNodeI* v_psSelDestinationVariable = v_psRootNode->AddChild(mmImages::g_pAutoCalcXML_Params_Param_Node); +// // name +// mmXML::mmXMLNodeI* v_psSelDestinationVariableName = v_psSelDestinationVariable->AddChild(mmImages::g_pAutoCalcXML_Params_ParamName_Node); +// v_psSelDestinationVariableName->SetText(L"Destination Integer Input Variable: "); +// // type +// mmXML::mmXMLNodeI* v_psSelDestinationVariableType = v_psSelDestinationVariable->AddChild(mmImages::g_pAutoCalcXML_Params_ParamType_Node); +// v_psSelDestinationVariableType->SetText(mmImages::g_pAutoCalcXML_Params_ParamType_IntegerValue); +// // value +// mmXML::mmXMLNodeI* v_psSelDestinationVariableValue = v_psSelDestinationVariable->AddChild(mmImages::g_pAutoCalcXML_Params_ParamValue_Node); +// v_psSelDestinationVariableValue->SetText(L""); +// +// mmString v_sInParams = v_psINXMLDoc->SaveToXMLBuffer(); +// delete v_psINXMLDoc; +// +// // create XML document which stores output automation options +// mmXML::mmXMLDocI* v_psOUTXMLDoc = mmInterfaceInitializers::CreateXMLDocument(this->GetLogReceiver()); +// v_psOUTXMLDoc->CreateXMLRootNode(mmImages::g_pAutoCalcXML_OUTParams_Node); +// +// mmString v_sOutParams = v_psOUTXMLDoc->SaveToXMLBuffer(); +// delete v_psOUTXMLDoc; +// +// // user set values of params +// bool v_bNoParams = false; +// mmString v_sCMInOutParams = GetUIDefinitionForInternalAction(mmImages::g_pComplexCalcXML_Action_CopyIntOutputToInputValue, +// v_sInParams, +// v_sOutParams, +// &v_bNoParams); +// +// mmString v_sSCMDef = v_sCMInOutParams; +// if(!v_bNoParams) +// { +// v_sSCMDef = m_psMainWindow->ShowModalDialog(v_sCMInOutParams,this); +// }; +// +// // update in/out params of pattern +// mmString v_sSCMInOutDef = UpdateInputOutputParameters(v_sSCMDef); +// +// // add internal action into calculation pattern +// AddInternalMethodIntoPattern(v_sSCMInOutDef, +// m_psXMLCurrentPatternDefinition); +// +// SendLogMessage(mmLog::debug,mmString(L"End AddInternalCopyIntOutToInVariable")); +//} + +// PB // +//void mmImages::mmImagesComplexCalculationManagement::AddInternalCopyRealOutToInVariable(void) +//{ +// SendLogMessage(mmLog::debug,mmString(L"Start AddInternalCopyRealOutToInVariable")); +// +// // define input-output params +// // create XML document which stores input automation options +// mmXML::mmXMLDocI* v_psINXMLDoc = mmInterfaceInitializers::CreateXMLDocument(this->GetLogReceiver()); +// v_psINXMLDoc->CreateXMLRootNode(mmImages::g_pAutoCalcXML_INParams_Node); +// mmXML::mmXMLNodeI* v_psRootNode = v_psINXMLDoc->GetXMLRootNode(); +// // add selection of surce output variable +// mmXML::mmXMLNodeI* v_psSelSourceVariable = v_psRootNode->AddChild(mmImages::g_pAutoCalcXML_Params_Param_Node); +// // name +// mmXML::mmXMLNodeI* v_psSelSourceVariableName = v_psSelSourceVariable->AddChild(mmImages::g_pAutoCalcXML_Params_ParamName_Node); +// v_psSelSourceVariableName->SetText(L"Source Real Output Variable: "); +// // type +// mmXML::mmXMLNodeI* v_psSelSourceVariableType = v_psSelSourceVariable->AddChild(mmImages::g_pAutoCalcXML_Params_ParamType_Node); +// v_psSelSourceVariableType->SetText(mmImages::g_pAutoCalcXML_Params_ParamType_RealValue); +// // value +// mmXML::mmXMLNodeI* v_psSelSourceVariableValue = v_psSelSourceVariable->AddChild(mmImages::g_pAutoCalcXML_Params_ParamValue_Node); +// v_psSelSourceVariableValue->SetText(L""); +// // add selection of destination input variable +// mmXML::mmXMLNodeI* v_psSelDestinationVariable = v_psRootNode->AddChild(mmImages::g_pAutoCalcXML_Params_Param_Node); +// // name +// mmXML::mmXMLNodeI* v_psSelDestinationVariableName = v_psSelDestinationVariable->AddChild(mmImages::g_pAutoCalcXML_Params_ParamName_Node); +// v_psSelDestinationVariableName->SetText(L"Destination Real Input Variable: "); +// // type +// mmXML::mmXMLNodeI* v_psSelDestinationVariableType = v_psSelDestinationVariable->AddChild(mmImages::g_pAutoCalcXML_Params_ParamType_Node); +// v_psSelDestinationVariableType->SetText(mmImages::g_pAutoCalcXML_Params_ParamType_RealValue); +// // value +// mmXML::mmXMLNodeI* v_psSelDestinationVariableValue = v_psSelDestinationVariable->AddChild(mmImages::g_pAutoCalcXML_Params_ParamValue_Node); +// v_psSelDestinationVariableValue->SetText(L""); +// +// mmString v_sInParams = v_psINXMLDoc->SaveToXMLBuffer(); +// delete v_psINXMLDoc; +// +// // create XML document which stores output automation options +// mmXML::mmXMLDocI* v_psOUTXMLDoc = mmInterfaceInitializers::CreateXMLDocument(this->GetLogReceiver()); +// v_psOUTXMLDoc->CreateXMLRootNode(mmImages::g_pAutoCalcXML_OUTParams_Node); +// +// mmString v_sOutParams = v_psOUTXMLDoc->SaveToXMLBuffer(); +// delete v_psOUTXMLDoc; +// +// // user set values of params +// bool v_bNoParams = false; +// mmString v_sCMInOutParams = GetUIDefinitionForInternalAction(mmImages::g_pComplexCalcXML_Action_CopyRealOutputToInputValue, +// v_sInParams, +// v_sOutParams, +// &v_bNoParams); +// +// mmString v_sSCMDef = v_sCMInOutParams; +// if(!v_bNoParams) +// { +// v_sSCMDef = m_psMainWindow->ShowModalDialog(v_sCMInOutParams,this); +// }; +// +// // update in/out params of pattern +// mmString v_sSCMInOutDef = UpdateInputOutputParameters(v_sSCMDef); +// +// // add internal action into calculation pattern +// AddInternalMethodIntoPattern(v_sSCMInOutDef, +// m_psXMLCurrentPatternDefinition); +// +// SendLogMessage(mmLog::debug,mmString(L"End AddInternalCopyRealOutToInVariable")); +//} + +// PB // +//mmString mmImages::mmImagesComplexCalculationManagement::GetUIDefinitionForInternalAction( mmString p_sInternalActionName, +// mmString p_sIAInParams, +// mmString p_sIAOutParams, +// bool* p_pbNoParams) +//{ +// SendLogMessage(mmLog::debug,mmString(L"Start GetUIDefinitionForInternalAction")); +// +// *p_pbNoParams = false; +// +// // input params XML +// mmXML::mmXMLDocI* v_psXMLDoc_InputParams = mmInterfaceInitializers::CreateXMLDocument(this->GetLogReceiver()); +// v_psXMLDoc_InputParams->ParseXMLBuffer(p_sIAInParams); +// mmXML::mmXMLNodeI* v_psRootNode_InputParams = v_psXMLDoc_InputParams->GetXMLRootNode(); +// std::vector v_vInputParams = v_psRootNode_InputParams->GetChilds(); +// +// // output params XML +// mmXML::mmXMLDocI* v_psXMLDoc_OutputParams = mmInterfaceInitializers::CreateXMLDocument(this->GetLogReceiver()); +// v_psXMLDoc_OutputParams->ParseXMLBuffer(p_sIAOutParams); +// mmXML::mmXMLNodeI* v_psRootNode_OutputParams = v_psXMLDoc_OutputParams->GetXMLRootNode(); +// std::vector v_vOutputParams = v_psRootNode_OutputParams->GetChilds(); +// +// // input values +// std::vector v_vAvailableInputValues = m_psXMLCurrentPatternDefinition->GetXMLRootNode()->FindChild(mmImages::g_pComplexCalcXML_PatternInputParams_Node)->GetChilds(); +// mmInt v_iIVCount = v_vAvailableInputValues.size(); +// +// // output values +// std::vector v_vAvailableOutputValues = m_psXMLCurrentPatternDefinition->GetXMLRootNode()->FindChild(mmImages::g_pComplexCalcXML_PatternOutputParams_Node)->GetChilds(); +// mmInt v_iOVCount = v_vAvailableOutputValues.size(); +// +// // create XML document which specifies new calculation pattern wizard +// mmXML::mmXMLDocI* v_psXMLDoc = mmInterfaceInitializers::CreateXMLDocument(this->GetLogReceiver()); +// //mmXML::mmXMLDocI* v_psXMLDoc = mmInterfaceInitializers::CreateXMLDocument(NULL); +// +// // add dialog root node +// v_psXMLDoc->CreateXMLRootNode(mmUI::g_pUIXML_EL_UserDialog); +// mmXML::mmXMLNodeI* v_psRootNode = v_psXMLDoc->GetXMLRootNode(); +// // add visible name for dialog +// mmXML::mmXMLNodeI* v_psRootNodeName = v_psRootNode->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psRootNodeName->SetText(p_sInternalActionName); +// +// // add input params group node +// mmXML::mmXMLNodeI* v_psInParamsGroupNode = v_psRootNode->AddChild(mmUI::g_pUIXML_EL_Group); +// // add visible name for group node +// mmXML::mmXMLNodeI* v_psInParamsGroupNodeName = v_psInParamsGroupNode->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psInParamsGroupNodeName->SetText(L" Input Params: "); +// +// mmInt v_iIPCount = v_vInputParams.size(); +// for(mmInt v_iIP=0;v_iIPFindChild(mmClouds::g_pAutoCalcXML_Params_ParamName_Node)->GetText(); +// mmString v_sType = v_vInputParams[v_iIP]->FindChild(mmClouds::g_pAutoCalcXML_Params_ParamType_Node)->GetText(); +// mmString v_sInitValue = v_vInputParams[v_iIP]->FindChild(mmClouds::g_pAutoCalcXML_Params_ParamValue_Node)->GetText(); +// +// if(v_sType.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_CloudNames) == 0) +// { +// // add cloud names +// mmXML::mmXMLNodeI* v_psCloudCount = v_psInParamsGroupNode->AddChild(mmUI::g_pUIXML_EL_SingleValue); +// // add orig attributes +// v_psCloudCount->AddAttribute(mmClouds::g_pAutoCalcXML_Params_ParamName_Node,v_sName); +// v_psCloudCount->AddAttribute(mmClouds::g_pAutoCalcXML_Params_ParamType_Node,v_sType); +// v_psCloudCount->AddAttribute(mmClouds::g_pAutoCalcXML_Params_ParamValue_Node,v_sInitValue); +// // name +// mmXML::mmXMLNodeI* v_psCloudCountName = v_psCloudCount->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psCloudCountName->SetText(v_sName); +// // type +// mmXML::mmXMLNodeI* v_psCloudCountType = v_psCloudCount->AddChild(mmUI::g_pUIXML_EL_DEF_Type); +// v_psCloudCountType->SetText(mmUI::g_pUIXML_EL_DEF_Type_String); +// // value +// mmXML::mmXMLNodeI* v_psCloudCountValue = v_psCloudCount->AddChild(mmUI::g_pUIXML_EL_DEF_Value); +// v_psCloudCountValue->SetText(v_sInitValue); +// }; +// if(v_sType.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_BoolValue) == 0) +// { +// // add binary decision +// mmXML::mmXMLNodeI* v_psBinaryDecision = v_psInParamsGroupNode->AddChild(mmUI::g_pUIXML_EL_SingleValue); +// // add orig attributes +// v_psBinaryDecision->AddAttribute(mmClouds::g_pAutoCalcXML_Params_ParamName_Node,v_sName); +// v_psBinaryDecision->AddAttribute(mmClouds::g_pAutoCalcXML_Params_ParamType_Node,v_sType); +// v_psBinaryDecision->AddAttribute(mmClouds::g_pAutoCalcXML_Params_ParamValue_Node,v_sInitValue); +// // name +// mmXML::mmXMLNodeI* v_psBinaryDecisionName = v_psBinaryDecision->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psBinaryDecisionName->SetText(v_sName); +// // type +// mmXML::mmXMLNodeI* v_psBinaryDecisionType = v_psBinaryDecision->AddChild(mmUI::g_pUIXML_EL_DEF_Type); +// v_psBinaryDecisionType->SetText(mmUI::g_pUIXML_EL_DEF_Type_String); +// // values range +// mmXML::mmXMLNodeI* v_psBinaryDecisionRange = v_psBinaryDecision->AddChild(mmUI::g_pUIXML_EL_DEF_Range); +// mmXML::mmXMLNodeI* v_psBinaryDecisionRangeStringList = v_psBinaryDecisionRange->AddChild(mmUI::g_pUIXML_EL_DEF_StringList); +// for(mmInt v_iIV=0;v_iIVFindChild(mmClouds::g_pComplexCalcXML_PatternInputParamType_Node)->GetText().compare(mmClouds::g_pAutoCalcXML_Params_ParamType_BoolValue) == 0) +// { +// mmXML::mmXMLNodeI* v_psUIStringListElement = v_psBinaryDecisionRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(v_vAvailableInputValues[v_iIV]->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParamName_Node)->GetText()); +// }; +// }; +// for(mmInt v_iOV=0;v_iOVFindChild(mmClouds::g_pComplexCalcXML_PatternOutputParamType_Node)->GetText().compare(mmClouds::g_pAutoCalcXML_Params_ParamType_BoolValue) == 0) +// { +// mmXML::mmXMLNodeI* v_psUIStringListElement = v_psBinaryDecisionRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(v_vAvailableOutputValues[v_iOV]->FindChild(mmClouds::g_pComplexCalcXML_PatternOutputParamName_Node)->GetText()); +// }; +// }; +// mmXML::mmXMLNodeI* v_psUIStringListElement = v_psBinaryDecisionRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(mmClouds::g_pComplexCalcXML_PatternInputParamUserSpecified); +// // value +// mmXML::mmXMLNodeI* v_psBinaryDecisionValue = v_psBinaryDecision->AddChild(mmUI::g_pUIXML_EL_DEF_Value); +// v_psBinaryDecisionValue->SetText(mmClouds::g_pComplexCalcXML_PatternInputParamUserSpecified); +// }; +// if(v_sType.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_CloudName) == 0) +// { +// // add cloud name +// mmXML::mmXMLNodeI* v_psCloud = v_psInParamsGroupNode->AddChild(mmUI::g_pUIXML_EL_SingleValue); +// // add orig attributes +// v_psCloud->AddAttribute(mmClouds::g_pAutoCalcXML_Params_ParamName_Node,v_sName); +// v_psCloud->AddAttribute(mmClouds::g_pAutoCalcXML_Params_ParamType_Node,v_sType); +// v_psCloud->AddAttribute(mmClouds::g_pAutoCalcXML_Params_ParamValue_Node,v_sInitValue); +// // name +// mmXML::mmXMLNodeI* v_psCloudName = v_psCloud->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psCloudName->SetText(v_sName); +// // type +// mmXML::mmXMLNodeI* v_psCloudType = v_psCloud->AddChild(mmUI::g_pUIXML_EL_DEF_Type); +// v_psCloudType->SetText(mmUI::g_pUIXML_EL_DEF_Type_String); +// // values range +// mmXML::mmXMLNodeI* v_psCloudRange = v_psCloud->AddChild(mmUI::g_pUIXML_EL_DEF_Range); +// mmXML::mmXMLNodeI* v_psCloudRangeStringList = v_psCloudRange->AddChild(mmUI::g_pUIXML_EL_DEF_StringList); +// for(mmInt v_iIV=0;v_iIVFindChild(mmClouds::g_pComplexCalcXML_PatternInputParamType_Node)->GetText().compare(mmClouds::g_pAutoCalcXML_Params_ParamType_CloudName) == 0) +// { +// mmXML::mmXMLNodeI* v_psUIStringListElement = v_psCloudRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(v_vAvailableInputValues[v_iIV]->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParamName_Node)->GetText()); +// }; +// }; +// for(mmInt v_iOV=0;v_iOVFindChild(mmClouds::g_pComplexCalcXML_PatternOutputParamType_Node)->GetText().compare(mmClouds::g_pAutoCalcXML_Params_ParamType_CloudName) == 0) +// { +// mmXML::mmXMLNodeI* v_psUIStringListElement = v_psCloudRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(v_vAvailableOutputValues[v_iOV]->FindChild(mmClouds::g_pComplexCalcXML_PatternOutputParamName_Node)->GetText()); +// }; +// }; +// mmXML::mmXMLNodeI* v_psUIStringListElement = v_psCloudRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(mmClouds::g_pComplexCalcXML_PatternInputParamUserSpecified); +// // value +// mmXML::mmXMLNodeI* v_psCloudValue = v_psCloud->AddChild(mmUI::g_pUIXML_EL_DEF_Value); +// v_psCloudValue->SetText(mmClouds::g_pComplexCalcXML_PatternInputParamUserSpecified); +// }; +// if(v_sType.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_DataLayerName) == 0) +// { +// // add Data Layer name +// mmXML::mmXMLNodeI* v_psDataLayer = v_psInParamsGroupNode->AddChild(mmUI::g_pUIXML_EL_SingleValue); +// // add orig attributes +// v_psDataLayer->AddAttribute(mmClouds::g_pAutoCalcXML_Params_ParamName_Node,v_sName); +// v_psDataLayer->AddAttribute(mmClouds::g_pAutoCalcXML_Params_ParamType_Node,v_sType); +// v_psDataLayer->AddAttribute(mmClouds::g_pAutoCalcXML_Params_ParamValue_Node,v_sInitValue); +// // name +// mmXML::mmXMLNodeI* v_psDataLayerName = v_psDataLayer->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psDataLayerName->SetText(v_sName); +// // type +// mmXML::mmXMLNodeI* v_psDataLayerType = v_psDataLayer->AddChild(mmUI::g_pUIXML_EL_DEF_Type); +// v_psDataLayerType->SetText(mmUI::g_pUIXML_EL_DEF_Type_String); +// // values range +// mmXML::mmXMLNodeI* v_psDataLayerRange = v_psDataLayer->AddChild(mmUI::g_pUIXML_EL_DEF_Range); +// mmXML::mmXMLNodeI* v_psDataLayerRangeStringList = v_psDataLayerRange->AddChild(mmUI::g_pUIXML_EL_DEF_StringList); +// for(mmInt v_iIV=0;v_iIVFindChild(mmClouds::g_pComplexCalcXML_PatternInputParamType_Node)->GetText().compare(mmClouds::g_pAutoCalcXML_Params_ParamType_DataLayerName) == 0) +// { +// mmXML::mmXMLNodeI* v_psUIStringListElement = v_psDataLayerRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(v_vAvailableInputValues[v_iIV]->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParamName_Node)->GetText()); +// }; +// }; +// for(mmInt v_iOV=0;v_iOVFindChild(mmClouds::g_pComplexCalcXML_PatternOutputParamType_Node)->GetText().compare(mmClouds::g_pAutoCalcXML_Params_ParamType_DataLayerName) == 0) +// { +// mmXML::mmXMLNodeI* v_psUIStringListElement = v_psDataLayerRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(v_vAvailableOutputValues[v_iOV]->FindChild(mmClouds::g_pComplexCalcXML_PatternOutputParamName_Node)->GetText()); +// }; +// }; +// mmXML::mmXMLNodeI* v_psUIStringListElement = v_psDataLayerRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(mmClouds::g_pComplexCalcXML_PatternInputParamUserSpecified); +// // value +// mmXML::mmXMLNodeI* v_psDataLayerValue = v_psDataLayer->AddChild(mmUI::g_pUIXML_EL_DEF_Value); +// v_psDataLayerValue->SetText(mmClouds::g_pComplexCalcXML_PatternInputParamUserSpecified); +// }; +// if(v_sType.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_IntegerValue) == 0) +// { +// // add int value +// mmXML::mmXMLNodeI* v_psInteger = v_psInParamsGroupNode->AddChild(mmUI::g_pUIXML_EL_SingleValue); +// // add orig attributes +// v_psInteger->AddAttribute(mmClouds::g_pAutoCalcXML_Params_ParamName_Node,v_sName); +// v_psInteger->AddAttribute(mmClouds::g_pAutoCalcXML_Params_ParamType_Node,v_sType); +// v_psInteger->AddAttribute(mmClouds::g_pAutoCalcXML_Params_ParamValue_Node,v_sInitValue); +// // name +// mmXML::mmXMLNodeI* v_psIntegerName = v_psInteger->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psIntegerName->SetText(v_sName); +// // type +// mmXML::mmXMLNodeI* v_psIntegerType = v_psInteger->AddChild(mmUI::g_pUIXML_EL_DEF_Type); +// v_psIntegerType->SetText(mmUI::g_pUIXML_EL_DEF_Type_String); +// // values range +// mmXML::mmXMLNodeI* v_psIntegerRange = v_psInteger->AddChild(mmUI::g_pUIXML_EL_DEF_Range); +// mmXML::mmXMLNodeI* v_psIntegerRangeStringList = v_psIntegerRange->AddChild(mmUI::g_pUIXML_EL_DEF_StringList); +// for(mmInt v_iIV=0;v_iIVFindChild(mmClouds::g_pComplexCalcXML_PatternInputParamType_Node)->GetText().compare(mmClouds::g_pAutoCalcXML_Params_ParamType_IntegerValue) == 0) +// { +// mmXML::mmXMLNodeI* v_psUIStringListElement = v_psIntegerRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(v_vAvailableInputValues[v_iIV]->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParamName_Node)->GetText()); +// }; +// }; +// for(mmInt v_iOV=0;v_iOVFindChild(mmClouds::g_pComplexCalcXML_PatternOutputParamType_Node)->GetText().compare(mmClouds::g_pAutoCalcXML_Params_ParamType_IntegerValue) == 0) +// { +// mmXML::mmXMLNodeI* v_psUIStringListElement = v_psIntegerRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(v_vAvailableOutputValues[v_iOV]->FindChild(mmClouds::g_pComplexCalcXML_PatternOutputParamName_Node)->GetText()); +// }; +// }; +// mmXML::mmXMLNodeI* v_psUIStringListElement = v_psIntegerRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(mmClouds::g_pComplexCalcXML_PatternInputParamUserSpecified); +// // value +// mmXML::mmXMLNodeI* v_psIntegerValue = v_psInteger->AddChild(mmUI::g_pUIXML_EL_DEF_Value); +// v_psIntegerValue->SetText(mmClouds::g_pComplexCalcXML_PatternInputParamUserSpecified); +// }; +// if(v_sType.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_RealValue) == 0) +// { +// // add real value +// mmXML::mmXMLNodeI* v_psReal = v_psInParamsGroupNode->AddChild(mmUI::g_pUIXML_EL_SingleValue); +// // add orig attributes +// v_psReal->AddAttribute(mmClouds::g_pAutoCalcXML_Params_ParamName_Node,v_sName); +// v_psReal->AddAttribute(mmClouds::g_pAutoCalcXML_Params_ParamType_Node,v_sType); +// v_psReal->AddAttribute(mmClouds::g_pAutoCalcXML_Params_ParamValue_Node,v_sInitValue); +// // name +// mmXML::mmXMLNodeI* v_psRealName = v_psReal->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psRealName->SetText(v_sName); +// // type +// mmXML::mmXMLNodeI* v_psRealType = v_psReal->AddChild(mmUI::g_pUIXML_EL_DEF_Type); +// v_psRealType->SetText(mmUI::g_pUIXML_EL_DEF_Type_String); +// // values range +// mmXML::mmXMLNodeI* v_psRealValueRange = v_psReal->AddChild(mmUI::g_pUIXML_EL_DEF_Range); +// mmXML::mmXMLNodeI* v_psRealValueRangeStringList = v_psRealValueRange->AddChild(mmUI::g_pUIXML_EL_DEF_StringList); +// for(mmInt v_iIV=0;v_iIVFindChild(mmClouds::g_pComplexCalcXML_PatternInputParamType_Node)->GetText().compare(mmClouds::g_pAutoCalcXML_Params_ParamType_RealValue) == 0) +// { +// mmXML::mmXMLNodeI* v_psUIStringListElement = v_psRealValueRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(v_vAvailableInputValues[v_iIV]->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParamName_Node)->GetText()); +// }; +// }; +// for(mmInt v_iOV=0;v_iOVFindChild(mmClouds::g_pComplexCalcXML_PatternOutputParamType_Node)->GetText().compare(mmClouds::g_pAutoCalcXML_Params_ParamType_RealValue) == 0) +// { +// mmXML::mmXMLNodeI* v_psUIStringListElement = v_psRealValueRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(v_vAvailableOutputValues[v_iOV]->FindChild(mmClouds::g_pComplexCalcXML_PatternOutputParamName_Node)->GetText()); +// }; +// }; +// mmXML::mmXMLNodeI* v_psUIStringListElement = v_psRealValueRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(mmClouds::g_pComplexCalcXML_PatternInputParamUserSpecified); +// // value +// mmXML::mmXMLNodeI* v_psRealValue = v_psReal->AddChild(mmUI::g_pUIXML_EL_DEF_Value); +// v_psRealValue->SetText(mmClouds::g_pComplexCalcXML_PatternInputParamUserSpecified); +// }; +// }; +// +// // add output params group node +// mmXML::mmXMLNodeI* v_psOutParamsGroupNode = v_psRootNode->AddChild(mmUI::g_pUIXML_EL_Group); +// // add visible name for group node +// mmXML::mmXMLNodeI* v_psOutParamsGroupNodeName = v_psOutParamsGroupNode->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psOutParamsGroupNodeName->SetText(L" Output Params: "); +// +// mmInt v_iOPCount = v_vOutputParams.size(); +// for(mmInt v_iOP=0;v_iOPFindChild(mmClouds::g_pAutoCalcXML_Params_ParamName_Node)->GetText(); +// mmString v_sType = v_vOutputParams[v_iOP]->FindChild(mmClouds::g_pAutoCalcXML_Params_ParamType_Node)->GetText(); +// mmString v_sValue = v_vOutputParams[v_iOP]->FindChild(mmClouds::g_pAutoCalcXML_Params_ParamValue_Node)->GetText(); +// +// if(v_sType.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_BoolValue) == 0) +// { +// // add cloud name +// mmXML::mmXMLNodeI* v_psBinaryDecision = v_psOutParamsGroupNode->AddChild(mmUI::g_pUIXML_EL_SingleValue); +// // add orig attributes +// v_psBinaryDecision->AddAttribute(mmClouds::g_pAutoCalcXML_Params_ParamName_Node,v_sName); +// v_psBinaryDecision->AddAttribute(mmClouds::g_pAutoCalcXML_Params_ParamType_Node,v_sType); +// v_psBinaryDecision->AddAttribute(mmClouds::g_pAutoCalcXML_Params_ParamValue_Node,v_sValue); +// // name +// mmXML::mmXMLNodeI* v_psBinaryDecisionName = v_psBinaryDecision->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psBinaryDecisionName->SetText(v_sName); +// // type +// mmXML::mmXMLNodeI* v_psBinaryDecisionType = v_psBinaryDecision->AddChild(mmUI::g_pUIXML_EL_DEF_Type); +// v_psBinaryDecisionType->SetText(mmUI::g_pUIXML_EL_DEF_Type_String); +// // value +// mmXML::mmXMLNodeI* v_psBinaryDecisionValue = v_psBinaryDecision->AddChild(mmUI::g_pUIXML_EL_DEF_Value); +// v_psBinaryDecisionValue->SetText(L""); +// }; +// if(v_sType.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_CloudName) == 0) +// { +// // add binary decision +// mmXML::mmXMLNodeI* v_psCloud = v_psOutParamsGroupNode->AddChild(mmUI::g_pUIXML_EL_SingleValue); +// // add orig attributes +// v_psCloud->AddAttribute(mmClouds::g_pAutoCalcXML_Params_ParamName_Node,v_sName); +// v_psCloud->AddAttribute(mmClouds::g_pAutoCalcXML_Params_ParamType_Node,v_sType); +// v_psCloud->AddAttribute(mmClouds::g_pAutoCalcXML_Params_ParamValue_Node,v_sValue); +// // name +// mmXML::mmXMLNodeI* v_psCloudName = v_psCloud->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psCloudName->SetText(v_sName); +// // type +// mmXML::mmXMLNodeI* v_psCloudType = v_psCloud->AddChild(mmUI::g_pUIXML_EL_DEF_Type); +// v_psCloudType->SetText(mmUI::g_pUIXML_EL_DEF_Type_String); +// // value +// mmXML::mmXMLNodeI* v_psCloudValue = v_psCloud->AddChild(mmUI::g_pUIXML_EL_DEF_Value); +// v_psCloudValue->SetText(L""); +// }; +// if(v_sType.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_DataLayerName) == 0) +// { +// // add Data Layer name +// mmXML::mmXMLNodeI* v_psDataLayer = v_psOutParamsGroupNode->AddChild(mmUI::g_pUIXML_EL_SingleValue); +// // add orig attributes +// v_psDataLayer->AddAttribute(mmClouds::g_pAutoCalcXML_Params_ParamName_Node,v_sName); +// v_psDataLayer->AddAttribute(mmClouds::g_pAutoCalcXML_Params_ParamType_Node,v_sType); +// v_psDataLayer->AddAttribute(mmClouds::g_pAutoCalcXML_Params_ParamValue_Node,v_sValue); +// // name +// mmXML::mmXMLNodeI* v_psDataLayerName = v_psDataLayer->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psDataLayerName->SetText(v_sName); +// // type +// mmXML::mmXMLNodeI* v_psDataLayerType = v_psDataLayer->AddChild(mmUI::g_pUIXML_EL_DEF_Type); +// v_psDataLayerType->SetText(mmUI::g_pUIXML_EL_DEF_Type_String); +// // value +// mmXML::mmXMLNodeI* v_psDataLayerValue = v_psDataLayer->AddChild(mmUI::g_pUIXML_EL_DEF_Value); +// v_psDataLayerValue->SetText(L""); +// }; +// if(v_sType.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_IntegerValue) == 0) +// { +// // add int value +// mmXML::mmXMLNodeI* v_psInteger = v_psOutParamsGroupNode->AddChild(mmUI::g_pUIXML_EL_SingleValue); +// // add orig attributes +// v_psInteger->AddAttribute(mmClouds::g_pAutoCalcXML_Params_ParamName_Node,v_sName); +// v_psInteger->AddAttribute(mmClouds::g_pAutoCalcXML_Params_ParamType_Node,v_sType); +// v_psInteger->AddAttribute(mmClouds::g_pAutoCalcXML_Params_ParamValue_Node,v_sValue); +// // name +// mmXML::mmXMLNodeI* v_psIntegerName = v_psInteger->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psIntegerName->SetText(v_sName); +// // type +// mmXML::mmXMLNodeI* v_psIntegerType = v_psInteger->AddChild(mmUI::g_pUIXML_EL_DEF_Type); +// v_psIntegerType->SetText(mmUI::g_pUIXML_EL_DEF_Type_String); +// // value +// mmXML::mmXMLNodeI* v_psIntegerValue = v_psInteger->AddChild(mmUI::g_pUIXML_EL_DEF_Value); +// v_psIntegerValue->SetText(L""); +// }; +// if(v_sType.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_RealValue) == 0) +// { +// // add real value +// mmXML::mmXMLNodeI* v_psReal = v_psOutParamsGroupNode->AddChild(mmUI::g_pUIXML_EL_SingleValue); +// // add orig attributes +// v_psReal->AddAttribute(mmClouds::g_pAutoCalcXML_Params_ParamName_Node,v_sName); +// v_psReal->AddAttribute(mmClouds::g_pAutoCalcXML_Params_ParamType_Node,v_sType); +// v_psReal->AddAttribute(mmClouds::g_pAutoCalcXML_Params_ParamValue_Node,v_sValue); +// // name +// mmXML::mmXMLNodeI* v_psRealName = v_psReal->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psRealName->SetText(v_sName); +// // type +// mmXML::mmXMLNodeI* v_psRealType = v_psReal->AddChild(mmUI::g_pUIXML_EL_DEF_Type); +// v_psRealType->SetText(mmUI::g_pUIXML_EL_DEF_Type_String); +// // value +// mmXML::mmXMLNodeI* v_psRealValue = v_psReal->AddChild(mmUI::g_pUIXML_EL_DEF_Value); +// v_psRealValue->SetText(L""); +// }; +// }; +// +// if( (v_iIPCount == 0) && (v_iOPCount == 0) ) +// { +// *p_pbNoParams = true; +// }; +// +// mmString v_sOutDialog = v_psXMLDoc->SaveToXMLBuffer(); +// +// delete v_psXMLDoc_InputParams; +// delete v_psXMLDoc_OutputParams; +// delete v_psXMLDoc; +// +// SendLogMessage(mmLog::debug,mmString(L"End GetUIDefinitionForInternalAction")); +// +// return v_sOutDialog; +//} + +// PB // +//mmString mmImages::mmImagesComplexCalculationManagement::GetUIDefinitionForMultiSelectValues(mmString p_sUIData) +//{ +// SendLogMessage(mmLog::debug,mmString(L"Start AddInternalCreationOfSimplifiedCloudStructureIntoPattern")); +// +// // input values +// std::vector v_vAvailableInputValues = m_psXMLCurrentPatternDefinition->GetXMLRootNode()->FindChild(mmImages::g_pComplexCalcXML_PatternInputParams_Node)->GetChilds(); +// mmInt v_iIVCount = v_vAvailableInputValues.size(); +// +// // output values +// std::vector v_vAvailableOutputValues = m_psXMLCurrentPatternDefinition->GetXMLRootNode()->FindChild(mmImages::g_pComplexCalcXML_PatternOutputParams_Node)->GetChilds(); +// mmInt v_iOVCount = v_vAvailableOutputValues.size(); +// +// mmXML::mmXMLDocI* v_psXMLDoc = mmInterfaceInitializers::CreateXMLDocument(this->GetLogReceiver()); +// //mmXML::mmXMLDocI* v_psXMLDoc = mmInterfaceInitializers::CreateXMLDocument(NULL); +// +// // parse string +// v_psXMLDoc->ParseXMLBuffer(p_sUIData); +// mmXML::mmXMLNodeI* v_psRootNode = v_psXMLDoc->GetXMLRootNode(); +// +// // in params values +// std::vector v_vInParams = v_psRootNode->GetChild(1)->GetChilds(); +// mmInt v_iInPCount = v_vInParams.size(); +// for(mmInt v_iInP=1;v_iInPGetAttributeValue(mmImages::g_pAutoCalcXML_Params_ParamType_Node); +// +// if(v_sInParamType.compare(mmImages::g_pAutoCalcXML_Params_ParamType_ImagesNames) == 0) +// { +// mmString v_sMultiCloudSelectionValue = v_vInParams[v_iInP]-> +// FindChild(mmUI::g_pUIXML_EL_DEF_Value)-> +// GetText(); +// +// // if not all selected +// if(v_sMultiCloudSelectionValue.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_CloudCount_All) != 0) +// { +// // create UI for cloud names +// mmInt v_iCloudToSelectCount = mmStringUtilities::StringToMMInt(v_sMultiCloudSelectionValue); +// +// // create XML document which specifies multi cloud selection +// mmXML::mmXMLDocI* v_psXMLDocUI = mmInterfaceInitializers::CreateXMLDocument(this->GetLogReceiver()); +// //mmXML::mmXMLDocI* v_psXMLDocUI = mmInterfaceInitializers::CreateXMLDocument(NULL); +// +// // add dialog root node +// v_psXMLDocUI->CreateXMLRootNode(mmUI::g_pUIXML_EL_UserDialog); +// mmXML::mmXMLNodeI* v_psRootNodeUI = v_psXMLDocUI->GetXMLRootNode(); +// // add visible name for dialog +// mmXML::mmXMLNodeI* v_psRootNodeUIName = v_psRootNodeUI->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psRootNodeUIName->SetText(L" Select clouds: "); +// +// // add cloud selection group node +// mmXML::mmXMLNodeI* v_psClSelGroupNode = v_psRootNodeUI->AddChild(mmUI::g_pUIXML_EL_Group); +// // add visible name for group node +// mmXML::mmXMLNodeI* v_psClSelGroupNodeName = v_psClSelGroupNode->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psClSelGroupNodeName->SetText(L" Clouds: "); +// +// for(mmInt v_iC=0;v_iCAddChild(mmUI::g_pUIXML_EL_SingleValue); +// // name +// mmXML::mmXMLNodeI* v_psCloudName = v_psCloud->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psCloudName->SetText(mmString(L" Cloud ") + +// mmStringUtilities::MMIntToString(v_iC+1) + +// mmString(L": ")); +// // type +// mmXML::mmXMLNodeI* v_psCloudType = v_psCloud->AddChild(mmUI::g_pUIXML_EL_DEF_Type); +// v_psCloudType->SetText(mmUI::g_pUIXML_EL_DEF_Type_String); +// // values range +// mmXML::mmXMLNodeI* v_psCloudRange = v_psCloud->AddChild(mmUI::g_pUIXML_EL_DEF_Range); +// mmXML::mmXMLNodeI* v_psCloudRangeStringList = v_psCloudRange->AddChild(mmUI::g_pUIXML_EL_DEF_StringList); +// for(mmInt v_iIV=0;v_iIVFindChild(mmClouds::g_pComplexCalcXML_PatternInputParamType_Node)->GetText().compare(mmClouds::g_pAutoCalcXML_Params_ParamType_CloudName) == 0) +// { +// mmXML::mmXMLNodeI* v_psUIStringListElement = v_psCloudRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(v_vAvailableInputValues[v_iIV]->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParamName_Node)->GetText()); +// }; +// }; +// for(mmInt v_iOV=0;v_iOVFindChild(mmClouds::g_pComplexCalcXML_PatternOutputParamType_Node)->GetText().compare(mmClouds::g_pAutoCalcXML_Params_ParamType_CloudName) == 0) +// { +// mmXML::mmXMLNodeI* v_psUIStringListElement = v_psCloudRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(v_vAvailableOutputValues[v_iOV]->FindChild(mmClouds::g_pComplexCalcXML_PatternOutputParamName_Node)->GetText()); +// }; +// }; +// mmXML::mmXMLNodeI* v_psUIStringListElement = v_psCloudRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(mmClouds::g_pComplexCalcXML_PatternInputParamUserSpecified); +// // value +// mmXML::mmXMLNodeI* v_psCloudValue = v_psCloud->AddChild(mmUI::g_pUIXML_EL_DEF_Value); +// v_psCloudValue->SetText(mmClouds::g_pComplexCalcXML_PatternInputParamUserSpecified); +// }; +// +// // show dialog +// mmString v_sInDialog = v_psXMLDocUI->SaveToXMLBuffer(); +// delete v_psXMLDocUI; +// +// mmString v_sOutDialog = m_psMainWindow->ShowModalDialog(v_sInDialog); +// +// // parse result +// mmXML::mmXMLDocI* v_psXMLDocUIRes = mmInterfaceInitializers::CreateXMLDocument(this->GetLogReceiver()); +// //mmXML::mmXMLDocI* v_psXMLDocUIRes = mmInterfaceInitializers::CreateXMLDocument(NULL); +// +// // parse string +// v_psXMLDocUIRes->ParseXMLBuffer(v_sOutDialog); +// mmXML::mmXMLNodeI* v_psRootNodeUIRes = v_psXMLDocUIRes->GetXMLRootNode(); +// +// std::vector v_vResClouds = v_psRootNodeUIRes->GetChild(1)->GetChilds(); +// for(mmInt v_iC=0;v_iCFindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText(); +// +// v_sMultiCloudSelectionValue += v_sCloudNameToAdd; +// }; +// +// v_vInParams[v_iInP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->SetText(v_sMultiCloudSelectionValue); +// delete v_psXMLDocUIRes; +// }; +// }; +// }; +// +// mmString v_sOutRes = v_psXMLDoc->SaveToXMLBuffer(); +// delete v_psXMLDoc; +// +// SendLogMessage(mmLog::debug,mmString(L"End GetUIDefinitionForInternalAction")); +// +// return v_sOutRes; +//} + +// PB // +//void mmImages::mmImagesComplexCalculationManagement::AddInternalMethodIntoPattern( mmString p_sInOutParams, +// mmXML::mmXMLDocI* p_psXMLComplexCalculationPatternDefinition) +//{ +// SendLogMessage(mmLog::debug,mmString(L"Start AddInternalCreationOfSimplifiedCloudStructureIntoPattern")); +// +// mmXML::mmXMLDocI* v_psXMLDoc = mmInterfaceInitializers::CreateXMLDocument(this->GetLogReceiver()); +// //mmXML::mmXMLDocI* v_psXMLDoc = mmInterfaceInitializers::CreateXMLDocument(NULL); +// +// // parse string +// v_psXMLDoc->ParseXMLBuffer(p_sInOutParams); +// mmXML::mmXMLNodeI* v_psRootNode = v_psXMLDoc->GetXMLRootNode(); +// +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction = p_psXMLComplexCalculationPatternDefinition->GetXMLRootNode()-> +// FindChild(mmImages::g_pComplexCalcXML_PatternDefinition_Node)-> +// AddChild(mmImages::g_pComplexCalcXML_PatternInternalAction_Node); +// // add name of IA +// mmXML::mmXMLNodeI* v_psXMLNewInternalActionName = v_psXMLNewInternalAction->AddChild(mmImages::g_pComplexCalcXML_PatternInternalActionName_Node); +// +// v_psXMLNewInternalActionName->SetText(v_psRootNode->FindChild(mmUI::g_pUIXML_EL_DEF_Name)->GetText()); +// +// // adding input params node +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_InParams = v_psXMLNewInternalAction->AddChild(mmImages::g_pAutoCalcXML_INParams_Node); +// +// // add IA input params +// std::vector v_vInputParams = v_psRootNode->GetChild(1)->GetChilds(); +// mmInt v_iIPCount = v_vInputParams.size(); +// for(mmInt v_iIP=1;v_iIP v_vOrigAttrParams = v_vInputParams[v_iIP]->GetAttributes(); +// +// if(v_vOrigAttrParams.size() > 0) +// { +// if(v_vOrigAttrParams[1].sValue.compare(mmImages::g_pAutoCalcXML_Params_ParamType_ImagesNames) == 0) +// { +// // adding input param +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_InParam = v_psXMLNewInternalAction_InParams->AddChild(mmImages::g_pAutoCalcXML_Params_Param_Node); +// // add name +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_InParam_Name = v_psXMLNewInternalAction_InParam->AddChild(mmImages::g_pAutoCalcXML_Params_ParamName_Node); +// //v_psXMLNewInternalAction_InParam_Name->SetText(v_vOrigAttrParams[0].sValue); +// v_psXMLNewInternalAction_InParam_Name->SetText(v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// // add type +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_InParam_Type = v_psXMLNewInternalAction_InParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamType_Node); +// v_psXMLNewInternalAction_InParam_Type->SetText(mmClouds::g_pAutoCalcXML_Params_ParamType_CloudNames); +// // add value +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_InParam_Value = v_psXMLNewInternalAction_InParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamValue_Node); +// v_psXMLNewInternalAction_InParam_Value->SetText(v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// }; +// if(v_vOrigAttrParams[1].sValue.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_BoolValue) == 0) +// { +// // adding input param +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_InParam = v_psXMLNewInternalAction_InParams->AddChild(mmClouds::g_pAutoCalcXML_Params_Param_Node); +// // add name +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_InParam_Name = v_psXMLNewInternalAction_InParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamName_Node); +// //v_psXMLNewInternalAction_InParam_Name->SetText(v_vOrigAttrParams[0].sValue); +// v_psXMLNewInternalAction_InParam_Name->SetText(v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// // add type +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_InParam_Type = v_psXMLNewInternalAction_InParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamType_Node); +// v_psXMLNewInternalAction_InParam_Type->SetText(mmClouds::g_pAutoCalcXML_Params_ParamType_BoolValue); +// // add value +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_InParam_Value = v_psXMLNewInternalAction_InParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamValue_Node); +// v_psXMLNewInternalAction_InParam_Value->SetText(v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// }; +// if(v_vOrigAttrParams[1].sValue.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_CloudName) == 0) +// { +// // adding input param +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_InParam = v_psXMLNewInternalAction_InParams->AddChild(mmClouds::g_pAutoCalcXML_Params_Param_Node); +// // add name +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_InParam_Name = v_psXMLNewInternalAction_InParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamName_Node); +// //v_psXMLNewInternalAction_InParam_Name->SetText(v_vOrigAttrParams[0].sValue); +// v_psXMLNewInternalAction_InParam_Name->SetText(v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// // add type +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_InParam_Type = v_psXMLNewInternalAction_InParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamType_Node); +// v_psXMLNewInternalAction_InParam_Type->SetText(mmClouds::g_pAutoCalcXML_Params_ParamType_CloudName); +// // add value +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_InParam_Value = v_psXMLNewInternalAction_InParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamValue_Node); +// v_psXMLNewInternalAction_InParam_Value->SetText(v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// }; +// if(v_vOrigAttrParams[1].sValue.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_DataLayerName) == 0) +// { +// // adding input param +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_InParam = v_psXMLNewInternalAction_InParams->AddChild(mmClouds::g_pAutoCalcXML_Params_Param_Node); +// // add name +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_InParam_Name = v_psXMLNewInternalAction_InParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamName_Node); +// //v_psXMLNewInternalAction_InParam_Name->SetText(v_vOrigAttrParams[0].sValue); +// v_psXMLNewInternalAction_InParam_Name->SetText(v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// // add type +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_InParam_Type = v_psXMLNewInternalAction_InParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamType_Node); +// v_psXMLNewInternalAction_InParam_Type->SetText(mmClouds::g_pAutoCalcXML_Params_ParamType_DataLayerName); +// // add value +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_InParam_Value = v_psXMLNewInternalAction_InParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamValue_Node); +// v_psXMLNewInternalAction_InParam_Value->SetText(v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// }; +// if(v_vOrigAttrParams[1].sValue.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_IntegerValue) == 0) +// { +// // adding input param +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_InParam = v_psXMLNewInternalAction_InParams->AddChild(mmClouds::g_pAutoCalcXML_Params_Param_Node); +// // add name +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_InParam_Name = v_psXMLNewInternalAction_InParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamName_Node); +// //v_psXMLNewInternalAction_InParam_Name->SetText(v_vOrigAttrParams[0].sValue); +// v_psXMLNewInternalAction_InParam_Name->SetText(v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// // add type +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_InParam_Type = v_psXMLNewInternalAction_InParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamType_Node); +// v_psXMLNewInternalAction_InParam_Type->SetText(mmClouds::g_pAutoCalcXML_Params_ParamType_IntegerValue); +// // add value +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_InParam_Value = v_psXMLNewInternalAction_InParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamValue_Node); +// v_psXMLNewInternalAction_InParam_Value->SetText(v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// }; +// if(v_vOrigAttrParams[1].sValue.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_RealValue) == 0) +// { +// // adding input param +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_InParam = v_psXMLNewInternalAction_InParams->AddChild(mmClouds::g_pAutoCalcXML_Params_Param_Node); +// // add name +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_InParam_Name = v_psXMLNewInternalAction_InParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamName_Node); +// //v_psXMLNewInternalAction_InParam_Name->SetText(v_vOrigAttrParams[0].sValue); +// v_psXMLNewInternalAction_InParam_Name->SetText(v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// // add type +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_InParam_Type = v_psXMLNewInternalAction_InParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamType_Node); +// v_psXMLNewInternalAction_InParam_Type->SetText(mmClouds::g_pAutoCalcXML_Params_ParamType_RealValue); +// // add value +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_InParam_Value = v_psXMLNewInternalAction_InParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamValue_Node); +// v_psXMLNewInternalAction_InParam_Value->SetText(v_vInputParams[v_iIP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// }; +// }; +// }; +// +// // adding output params node +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_OutParams = v_psXMLNewInternalAction->AddChild(mmClouds::g_pAutoCalcXML_OUTParams_Node); +// +// std::vector v_vOutputParams = v_psRootNode->GetChild(2)->GetChilds(); +// mmInt v_iOPCount = v_vOutputParams.size(); +// for(mmInt v_iOP=1;v_iOP v_vOrigAttrParams = v_vOutputParams[v_iOP]->GetAttributes(); +// +// if(v_vOrigAttrParams.size() > 0) +// { +// if(v_vOrigAttrParams[1].sValue.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_BoolValue) == 0) +// { +// // adding output param +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_OutParam = v_psXMLNewInternalAction_OutParams->AddChild(mmClouds::g_pAutoCalcXML_Params_Param_Node); +// // add name +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_OutParam_Name = v_psXMLNewInternalAction_OutParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamName_Node); +// v_psXMLNewInternalAction_OutParam_Name->SetText(v_vOrigAttrParams[0].sValue); +// // add type +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_OutParam_Type = v_psXMLNewInternalAction_OutParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamType_Node); +// v_psXMLNewInternalAction_OutParam_Type->SetText(mmClouds::g_pAutoCalcXML_Params_ParamType_BoolValue); +// // add value +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_OutParam_Value = v_psXMLNewInternalAction_OutParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamValue_Node); +// v_psXMLNewInternalAction_OutParam_Value->SetText(v_vOutputParams[v_iOP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// }; +// if(v_vOrigAttrParams[1].sValue.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_CloudName) == 0) +// { +// // adding output param +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_OutParam = v_psXMLNewInternalAction_OutParams->AddChild(mmClouds::g_pAutoCalcXML_Params_Param_Node); +// // add name +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_OutParam_Name = v_psXMLNewInternalAction_OutParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamName_Node); +// v_psXMLNewInternalAction_OutParam_Name->SetText(v_vOrigAttrParams[0].sValue); +// // add type +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_OutParam_Type = v_psXMLNewInternalAction_OutParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamType_Node); +// v_psXMLNewInternalAction_OutParam_Type->SetText(mmClouds::g_pAutoCalcXML_Params_ParamType_CloudName); +// // add value +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_OutParam_Value = v_psXMLNewInternalAction_OutParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamValue_Node); +// v_psXMLNewInternalAction_OutParam_Value->SetText(v_vOutputParams[v_iOP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// }; +// if(v_vOrigAttrParams[1].sValue.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_DataLayerName) == 0) +// { +// // adding output param +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_OutParam = v_psXMLNewInternalAction_OutParams->AddChild(mmClouds::g_pAutoCalcXML_Params_Param_Node); +// // add name +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_OutParam_Name = v_psXMLNewInternalAction_OutParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamName_Node); +// v_psXMLNewInternalAction_OutParam_Name->SetText(v_vOrigAttrParams[0].sValue); +// // add type +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_OutParam_Type = v_psXMLNewInternalAction_OutParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamType_Node); +// v_psXMLNewInternalAction_OutParam_Type->SetText(mmClouds::g_pAutoCalcXML_Params_ParamType_DataLayerName); +// // add value +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_OutParam_Value = v_psXMLNewInternalAction_OutParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamValue_Node); +// v_psXMLNewInternalAction_OutParam_Value->SetText(v_vOutputParams[v_iOP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// }; +// if(v_vOrigAttrParams[1].sValue.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_IntegerValue) == 0) +// { +// // adding output param +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_OutParam = v_psXMLNewInternalAction_OutParams->AddChild(mmClouds::g_pAutoCalcXML_Params_Param_Node); +// // add name +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_OutParam_Name = v_psXMLNewInternalAction_OutParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamName_Node); +// v_psXMLNewInternalAction_OutParam_Name->SetText(v_vOrigAttrParams[0].sValue); +// // add type +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_OutParam_Type = v_psXMLNewInternalAction_OutParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamType_Node); +// v_psXMLNewInternalAction_OutParam_Type->SetText(mmClouds::g_pAutoCalcXML_Params_ParamType_IntegerValue); +// // add value +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_OutParam_Value = v_psXMLNewInternalAction_OutParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamValue_Node); +// v_psXMLNewInternalAction_OutParam_Value->SetText(v_vOutputParams[v_iOP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// }; +// if(v_vOrigAttrParams[1].sValue.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_RealValue) == 0) +// { +// // adding output param +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_OutParam = v_psXMLNewInternalAction_OutParams->AddChild(mmClouds::g_pAutoCalcXML_Params_Param_Node); +// // add name +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_OutParam_Name = v_psXMLNewInternalAction_OutParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamName_Node); +// v_psXMLNewInternalAction_OutParam_Name->SetText(v_vOrigAttrParams[0].sValue); +// // add type +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_OutParam_Type = v_psXMLNewInternalAction_OutParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamType_Node); +// v_psXMLNewInternalAction_OutParam_Type->SetText(mmClouds::g_pAutoCalcXML_Params_ParamType_RealValue); +// // add value +// mmXML::mmXMLNodeI* v_psXMLNewInternalAction_OutParam_Value = v_psXMLNewInternalAction_OutParam->AddChild(mmClouds::g_pAutoCalcXML_Params_ParamValue_Node); +// v_psXMLNewInternalAction_OutParam_Value->SetText(v_vOutputParams[v_iOP]->FindChild(mmUI::g_pUIXML_EL_DEF_Value)->GetText()); +// }; +// }; +// }; +// +// delete v_psXMLDoc; +// +// SendLogMessage(mmLog::debug,mmString(L"End AddInternalCreationOfSimplifiedCloudStructureIntoPattern")); +//} + +// PB // +//void mmImages::mmImagesComplexCalculationManagement::InitializeCurrentComplexCalculationPatternExecution(void) +//{ +// SendLogMessage(mmLog::debug,mmString(L"Start InitializeCurrentComplexCalculationPatternExecution")); +// +//// PB // +//// // set UI for user input values +//// GetComplexCalculationPatternInputParamsFromUI(m_psXMLCalculatedPatternDefinition); +// +// SendLogMessage(mmLog::debug,mmString(L"End InitializeCurrentComplexCalculationPatternExecution")); +//} + +bool mmImages::mmImagesComplexCalculationManagement::ManageCurrentComplexCalculationPatternExecution(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start ManageCurrentComplexCalculationPatternExecution")); + + bool v_bIsFinishedCalculation = true; + + // check if m_psCoPCalculationManagement object is calculating + bool v_bIsCalculating = m_psImageCalculationManagement->IsCalculating(); + + // check if there is a next simple calc method + if(v_bIsCalculating) + { + v_bIsFinishedCalculation = false; + } + else + { + std::vector v_vCalcMethods = m_psXMLCalculatedPatternDefinition-> + FindChild(mmImages::g_pComplexCalcXML_PatternDefinition_Node)-> + GetChilds(); + + // intialize output params + if(m_iCurrentComplexCalculationItem > -1) + { +// PB // + UpdateOutputParamsOfSimpleCalculationMethod( m_psXMLCalculatedPatternDefinition, + m_iCurrentComplexCalculationItem); + + delete m_psCurrentCalculationMethod; + m_psCurrentCalculationMethod = NULL; + }; + + // check next calculation method number + m_iCurrentComplexCalculationItem++; + if(static_cast(v_vCalcMethods.size()) > m_iCurrentComplexCalculationItem) + { + // check if it is calculation method or internal action + mmString v_sOperationType = v_vCalcMethods[m_iCurrentComplexCalculationItem]->GetName(); + + // internal action + if(v_sOperationType.compare(mmImages::g_pComplexCalcXML_PatternInternalAction_Node) == 0) + { + mmString v_sInternalActionName = v_vCalcMethods[m_iCurrentComplexCalculationItem]->FindChild(mmImages::g_pComplexCalcXML_PatternInternalActionName_Node)->GetText(); + +// PB // +// if( (v_sInternalActionName.compare(mmImages::g_pComplexCalcXML_Action_CopyBinaryOutputToInputValue) == 0) || +// (v_sInternalActionName.compare(mmImages::g_pComplexCalcXML_Action_CopyIntOutputToInputValue) == 0) || +// (v_sInternalActionName.compare(mmImages::g_pComplexCalcXML_Action_CopyRealOutputToInputValue) == 0) ) +// { +// // initialize input params +// mmImages::mmImagesCalculationMethodI::sCalculationAutomationParams v_sCAP; +// v_sCAP = InitializeParamsOfSimpleCalculationMethod( m_psXMLCalculatedPatternDefinition, +// m_iCurrentComplexCalculationItem); +// +// // copy values +// mmXML::mmXMLDocI* v_psXMLDoc = mmInterfaceInitializers::CreateXMLDocument(this->GetLogReceiver()); +// //mmXML::mmXMLDocI* v_psXMLDoc = mmInterfaceInitializers::CreateXMLDocument(NULL); +// v_psXMLDoc->ParseXMLBuffer(v_sCAP.sInParams); +// mmXML::mmXMLNodeI* v_psRootNode = v_psXMLDoc->GetXMLRootNode(); +// +// mmString v_sSourceValue = v_psRootNode-> +// GetChild(0)-> +// FindChild(mmImages::g_pAutoCalcXML_Params_ParamValue_Node)-> +// GetText(); +// mmString v_sDestName = v_psRootNode-> +// GetChild(1)-> +// FindChild(mmImages::g_pAutoCalcXML_Params_ParamName_Node)-> +// GetText(); +// +// mmString v_sLogText = mmString(L"CopyValue ") + +// v_sDestName + +// mmString(L"=") + +// v_sSourceValue; +// SendLogMessage(mmLog::user,v_sLogText); +// +// SetValueOfParameter(m_psXMLCalculatedPatternDefinition,v_sDestName,v_sSourceValue); +// }; + +// PB // +// if(v_sInternalActionName.compare(mmImages::g_pComplexCalcXML_Action_AddEndWhile) == 0) +// { +// // search for while +// mmInt v_iStartWhileIndex = -1; +// mmInt v_iWhileAndEndWhileCount = 0; +// mmInt v_iCMSize = v_vCalcMethods.size(); +// for(mmInt v_iCM=m_iCurrentComplexCalculationItem-1;v_iCM>=0;v_iCM--) +// { +// if(v_vCalcMethods[v_iCM]->GetName().compare(mmImages::g_pComplexCalcXML_PatternInternalAction_Node) == 0) +// { +// mmString v_sIAName = v_vCalcMethods[v_iCM]-> +// FindChild(mmImages::g_pComplexCalcXML_PatternInternalActionName_Node)-> +// GetText(); +// +// if(v_sIAName.compare(mmImages::g_pComplexCalcXML_Action_AddEndWhile) == 0) +// { +// v_iWhileAndEndWhileCount++; +// }; +// if(v_sIAName.compare(mmImages::g_pComplexCalcXML_Action_AddWhileLoop) == 0) +// { +// if(v_iWhileAndEndWhileCount > 0) +// { +// v_iWhileAndEndWhileCount--; +// } +// else +// { +// v_iStartWhileIndex = v_iCM-1; +// break; +// }; +// }; +// }; +// }; +// m_iCurrentComplexCalculationItem = v_iStartWhileIndex; +// }; + +// PB // +// if(v_sInternalActionName.compare(mmImages::g_pComplexCalcXML_Action_AddWhileLoop) == 0) +// { +// // initialize input params +// mmImages::mmImagesCalculationMethodI::sCalculationAutomationParams v_sCAP; +// v_sCAP = InitializeParamsOfSimpleCalculationMethod( m_psXMLCalculatedPatternDefinition, +// m_iCurrentComplexCalculationItem); +// +// // while condition +// mmXML::mmXMLDocI* v_psXMLDoc = mmInterfaceInitializers::CreateXMLDocument(this->GetLogReceiver()); +// //mmXML::mmXMLDocI* v_psXMLDoc = mmInterfaceInitializers::CreateXMLDocument(NULL); +// v_psXMLDoc->ParseXMLBuffer(v_sCAP.sInParams); +// mmXML::mmXMLNodeI* v_psRootNode = v_psXMLDoc->GetXMLRootNode(); +// +// bool v_bContinueWhile = false; +// if(v_psRootNode-> +// GetChild(0)-> +// FindChild(mmImages::g_pAutoCalcXML_Params_ParamValue_Node)-> +// GetText().compare(mmImages::g_pAutoCalcXML_Params_ParamType_BoolValue_YES) == 0) +// { +// v_bContinueWhile = true; +// }; +// +// if(!v_bContinueWhile) +// { +// // search for end while +// mmInt v_iEndWhileNextIndex = -1; +// mmInt v_iWhileAndEndWhileCount = 0; +// mmInt v_iCMSize = v_vCalcMethods.size(); +// for(mmInt v_iCM=m_iCurrentComplexCalculationItem+1;v_iCMGetName().compare(mmImages::g_pComplexCalcXML_PatternInternalAction_Node) == 0) +// { +// mmString v_sIAName = v_vCalcMethods[v_iCM]-> +// FindChild(mmImages::g_pComplexCalcXML_PatternInternalActionName_Node)-> +// GetText(); +// +// if(v_sIAName.compare(mmImages::g_pComplexCalcXML_Action_AddWhileLoop) == 0) +// { +// v_iWhileAndEndWhileCount++; +// }; +// if(v_sIAName.compare(mmImages::g_pComplexCalcXML_Action_AddEndWhile) == 0) +// { +// if(v_iWhileAndEndWhileCount > 0) +// { +// v_iWhileAndEndWhileCount--; +// } +// else +// { +// v_iEndWhileNextIndex = v_iCM; +// +// break; +// }; +// }; +// }; +// }; +// +// m_iCurrentComplexCalculationItem = v_iEndWhileNextIndex; +// }; +// }; + }; + + // simple calculation method + if(v_sOperationType.compare(mmImages::g_pComplexCalcXML_PatternCalcMethod_Node) == 0) + { + //mmOperatingSystem::StopThread(50); + m_psCurrentCalculationMethod = m_psImageCalculationMethodContainer->InitializeImagesCalculationMethod( v_vCalcMethods[m_iCurrentComplexCalculationItem]-> + FindChild(mmImages::g_pComplexCalcXML_PatternCalcMethodIDName_Node)-> + GetText()); + + // initialize input params + mmImages::mmImagesCalculationMethodI::sCalculationAutomationParams v_sCAP; + v_sCAP = InitializeParamsOfSimpleCalculationMethod( m_psXMLCalculatedPatternDefinition, + m_iCurrentComplexCalculationItem); + + // start calculation + m_psImageCalculationManagement->CalculateImages( m_psCurrentCalculationMethod, + m_sCurrentComplexCalculation.psImageStructure, + &v_sCAP); + }; + + v_bIsFinishedCalculation = false; + }; + }; + + // clear calculation members + if(v_bIsFinishedCalculation) + { + m_psXMLCalculatedPatternDefinition = NULL; + }; + + SendLogMessage(mmLog::debug,mmString(L"End ManageCurrentComplexCalculationPatternExecution")); + + return v_bIsFinishedCalculation; +} + +// PB // +//void mmImages::mmImagesComplexCalculationManagement::GetComplexCalculationPatternInputParamsFromUI(mmXML::mmXMLNodeI* p_psComplexCalculationDefinition) +//{ +// SendLogMessage(mmLog::debug,mmString(L"Start GetComplexCalculationPatternInputParamsFromUI")); +// +// mmInt v_iValuesToSetCount = 0; +// +// // create XML document which specifies calculation pattern input params UI dialog +// mmXML::mmXMLDocI* v_psXMLDoc = mmInterfaceInitializers::CreateXMLDocument(this->GetLogReceiver()); +// //mmXML::mmXMLDocI* v_psXMLDoc = mmInterfaceInitializers::CreateXMLDocument(NULL); +// +// // add dialog root node +// v_psXMLDoc->CreateXMLRootNode(mmUI::g_pUIXML_EL_UserDialog); +// mmXML::mmXMLNodeI* v_psRootNode = v_psXMLDoc->GetXMLRootNode(); +// // add visible name for dialog +// mmXML::mmXMLNodeI* v_psRootNodeName = v_psRootNode->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psRootNodeName->SetText(p_psComplexCalculationDefinition->FindChild(mmClouds::g_pComplexCalcXML_PatternName_Node)->GetText() + +// mmString(L" - Input Paramters Definition")); +// +// // add global params group node +// mmXML::mmXMLNodeI* v_psInputParamsGroupNode = v_psRootNode->AddChild(mmUI::g_pUIXML_EL_Group); +// // add visible name for group node +// mmXML::mmXMLNodeI* v_psInputParamsGroupNodeName = v_psInputParamsGroupNode->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psInputParamsGroupNodeName->SetText(L" Params: "); +// +// std::vector v_vInParams = p_psComplexCalculationDefinition->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParams_Node)->GetChilds(); +// mmInt v_iIPCount = v_vInParams.size(); +// for(mmInt v_iIP=0;v_iIP v_sAttributes = v_vInParams[v_iIP]->GetAttributes(); +// mmXML::mmXMLNodeI* v_psXMLModifiedValueNode = v_vInParams[v_iIP]->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParamValueModifiedNodeName_Node); +// +// if( (v_sAttributes.size() == 0) && +// (v_psXMLModifiedValueNode == NULL) ) +// { +// mmString v_sNodeTypeStr = v_vInParams[v_iIP]->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParamType_Node)->GetText(); +// +// if(v_sNodeTypeStr.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_CloudName) == 0) +// { +// // add cloud selection +// mmXML::mmXMLNodeI* v_psCloudSelection = v_psInputParamsGroupNode->AddChild(mmUI::g_pUIXML_EL_SingleValue); +// // name +// mmXML::mmXMLNodeI* v_psCloudSelectionName = v_psCloudSelection->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psCloudSelectionName->SetText(v_vInParams[v_iIP]->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParamName_Node)->GetText()); +// // type +// mmXML::mmXMLNodeI* v_psCloudSelectionType = v_psCloudSelection->AddChild(mmUI::g_pUIXML_EL_DEF_Type); +// v_psCloudSelectionType->SetText(mmUI::g_pUIXML_EL_DEF_Type_String); +// // values range +// mmXML::mmXMLNodeI* v_psCloudSelectionValueRange = v_psCloudSelection->AddChild(mmUI::g_pUIXML_EL_DEF_Range); +// mmXML::mmXMLNodeI* v_psCloudSelectionValueRangeStringList = v_psCloudSelectionValueRange->AddChild(mmUI::g_pUIXML_EL_DEF_StringList); +// mmInt v_iCCount = m_sCurrentComplexCalculation.psCloudStructure->GetCloudsCount(); +// for(mmInt v_iC=0;v_iCAddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(m_sCurrentComplexCalculation.psCloudStructure->GetDirectionalCloudOfPointsName(v_iC)); +// }; +// // value +// mmXML::mmXMLNodeI* v_psCloudSelectionValue = v_psCloudSelection->AddChild(mmUI::g_pUIXML_EL_DEF_Value); +// v_psCloudSelectionValue->SetText(mmUI::g_pUIXML_Value_SELECT); +// }; +// if(v_sNodeTypeStr.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_DataLayerName) == 0) +// { +// // add groups data layer selection +// mmXML::mmXMLNodeI* v_psDLSelection = v_psInputParamsGroupNode->AddChild(mmUI::g_pUIXML_EL_SingleValue); +// // name +// mmXML::mmXMLNodeI* v_psDLSelectionName = v_psDLSelection->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psDLSelectionName->SetText(v_vInParams[v_iIP]->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParamName_Node)->GetText()); +// // type +// mmXML::mmXMLNodeI* v_psDLSelectionType = v_psDLSelection->AddChild(mmUI::g_pUIXML_EL_DEF_Type); +// v_psDLSelectionType->SetText(mmUI::g_pUIXML_EL_DEF_Type_String); +// // values range +// mmXML::mmXMLNodeI* v_psDLSelectionValueRange = v_psDLSelection->AddChild(mmUI::g_pUIXML_EL_DEF_Range); +// mmXML::mmXMLNodeI* v_psDLSelectionValueRangeStringList = v_psDLSelectionValueRange->AddChild(mmUI::g_pUIXML_EL_DEF_StringList); +// std::vector v_vDLInfo = m_sCurrentComplexCalculation.psCloudStructure->GetDataLayersInfo(); +// mmInt v_iDLCount = v_vDLInfo.size(); +// for(mmInt v_iDL=0;v_iDLAddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(v_vDLInfo[v_iDL].sName); +// }; +// // value +// mmXML::mmXMLNodeI* v_psDLSelectionValue = v_psDLSelection->AddChild(mmUI::g_pUIXML_EL_DEF_Value); +// v_psDLSelectionValue->SetText(mmUI::g_pUIXML_Value_SELECT); +// }; +// if(v_sNodeTypeStr.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_RealValue) == 0) +// { +// // add real value input +// mmXML::mmXMLNodeI* v_psReal = v_psInputParamsGroupNode->AddChild(mmUI::g_pUIXML_EL_SingleValue); +// // name +// mmXML::mmXMLNodeI* v_psRealName = v_psReal->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psRealName->SetText(v_vInParams[v_iIP]->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParamName_Node)->GetText()); +// // type +// mmXML::mmXMLNodeI* v_psRealType = v_psReal->AddChild(mmUI::g_pUIXML_EL_DEF_Type); +// v_psRealType->SetText(mmUI::g_pUIXML_EL_DEF_Type_Real); +// // value +// mmXML::mmXMLNodeI* v_psRealValue = v_psReal->AddChild(mmUI::g_pUIXML_EL_DEF_Value); +// v_psRealValue->SetText(v_vInParams[v_iIP]->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParamValue_Node)->GetText()); +// }; +// if(v_sNodeTypeStr.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_IntegerValue) == 0) +// { +// // add integer value input +// mmXML::mmXMLNodeI* v_psInteger = v_psInputParamsGroupNode->AddChild(mmUI::g_pUIXML_EL_SingleValue); +// // name +// mmXML::mmXMLNodeI* v_psIntegerName = v_psInteger->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psIntegerName->SetText(v_vInParams[v_iIP]->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParamName_Node)->GetText()); +// // type +// mmXML::mmXMLNodeI* v_psIntegerType = v_psInteger->AddChild(mmUI::g_pUIXML_EL_DEF_Type); +// v_psIntegerType->SetText(mmUI::g_pUIXML_EL_DEF_Type_Int); +// // value +// mmXML::mmXMLNodeI* v_psIntegerValue = v_psInteger->AddChild(mmUI::g_pUIXML_EL_DEF_Value); +// v_psIntegerValue->SetText(v_vInParams[v_iIP]->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParamValue_Node)->GetText()); +// }; +// if(v_sNodeTypeStr.compare(mmClouds::g_pAutoCalcXML_Params_ParamType_BoolValue) == 0) +// { +// // add binary decision input value selection +// mmXML::mmXMLNodeI* v_psBoolSelection = v_psInputParamsGroupNode->AddChild(mmUI::g_pUIXML_EL_SingleValue); +// // name +// mmXML::mmXMLNodeI* v_psBoolSelectionName = v_psBoolSelection->AddChild(mmUI::g_pUIXML_EL_DEF_Name); +// v_psBoolSelectionName->SetText(v_vInParams[v_iIP]->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParamName_Node)->GetText()); +// // type +// mmXML::mmXMLNodeI* v_psBoolSelectionType = v_psBoolSelection->AddChild(mmUI::g_pUIXML_EL_DEF_Type); +// v_psBoolSelectionType->SetText(mmUI::g_pUIXML_EL_DEF_Type_String); +// // values range +// mmXML::mmXMLNodeI* v_psBoolSelectionRange = v_psBoolSelection->AddChild(mmUI::g_pUIXML_EL_DEF_Range); +// mmXML::mmXMLNodeI* v_psBoolSelectionRangeStringList = v_psBoolSelectionRange->AddChild(mmUI::g_pUIXML_EL_DEF_StringList); +// mmXML::mmXMLNodeI* v_psUIStringListElement = v_psBoolSelectionRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(mmClouds::g_pAutoCalcXML_Params_ParamType_BoolValue_YES); +// v_psUIStringListElement = v_psBoolSelectionRangeStringList->AddChild(mmUI::g_pUIXML_EL_DEF_StringListElement); +// v_psUIStringListElement->SetText(mmClouds::g_pAutoCalcXML_Params_ParamType_BoolValue_NO); +// // value +// mmXML::mmXMLNodeI* v_psBoolSelectionValue = v_psBoolSelection->AddChild(mmUI::g_pUIXML_EL_DEF_Value); +// v_psBoolSelectionValue->SetText(v_vInParams[v_iIP]->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParamValue_Node)->GetText()); +// }; +// +// v_iValuesToSetCount++; +// }; +// }; +// +// mmString v_sOutDefinition = v_psXMLDoc->SaveToXMLBuffer(); +// +// if(v_iValuesToSetCount > 0) +// { +// // show dialog +// mmString v_sUserInput = m_psMainWindow->ShowModalDialog(v_sOutDefinition,this); +// +// // parse output +// v_psXMLDoc->ParseXMLBuffer(v_sUserInput); +// v_psRootNode = v_psXMLDoc->GetXMLRootNode(); +// +// v_iValuesToSetCount = 0; +// for(mmInt v_iIP=0;v_iIP v_sAttributes = v_vInParams[v_iIP]->GetAttributes(); +// mmXML::mmXMLNodeI* v_psXMLModifiedValueNode = v_vInParams[v_iIP]->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParamValueModifiedNodeName_Node); +// +// if( (v_sAttributes.size() == 0) && +// (v_psXMLModifiedValueNode == NULL) ) +// { +// v_vInParams[v_iIP]->FindChild(mmClouds::g_pComplexCalcXML_PatternInputParamValue_Node)->SetText( v_psRootNode-> +// GetChild(1)-> +// GetChild(1+v_iValuesToSetCount)-> +// FindChild(mmUI::g_pUIXML_EL_DEF_Value)-> +// GetText()); +// +// v_iValuesToSetCount++; +// }; +// }; +// }; +// +// delete v_psXMLDoc; +// +// SendLogMessage(mmLog::debug,mmString(L"End GetComplexCalculationPatternInputParamsFromUI")); +//} + +mmImages::mmImagesCalculationMethodI::sCalculationAutomationParams mmImages::mmImagesComplexCalculationManagement::InitializeParamsOfSimpleCalculationMethod(mmXML::mmXMLNodeI* p_psXMLCalcPatternDefinition, + mmInt p_iCalculationMethodToInitializeID) +{ + SendLogMessage(mmLog::debug,mmString(L"Start InitializeParamsOfSimpleCalculationMethod")); + + mmImages::mmImagesCalculationMethodI::sCalculationAutomationParams v_sCAP; + + mmXML::mmXMLNodeI* v_psXMLCalcMethod = p_psXMLCalcPatternDefinition-> + FindChild(mmImages::g_pComplexCalcXML_PatternDefinition_Node)-> + GetChild(p_iCalculationMethodToInitializeID); + + mmXML::mmXMLNodeI* v_psXMLCalcMethod_InParams = v_psXMLCalcMethod->FindChild(mmImages::g_pAutoCalcXML_INParams_Node); + std::vector v_vCMInParams = v_psXMLCalcMethod_InParams->GetChilds(); + mmInt v_iCMIPCount = v_vCMInParams.size(); + for(mmInt v_iCMIP=0;v_iCMIPFindChild(mmImages::g_pAutoCalcXML_Params_ParamName_Node)->GetText(); + + mmString v_sParamType = v_vCMInParams[v_iCMIP]->FindChild(mmImages::g_pAutoCalcXML_Params_ParamType_Node)->GetText(); + + if(v_sParamType.compare(mmImages::g_pAutoCalcXML_Params_ParamType_ImagesNames) == 0) + { + if(v_sName.compare(mmImages::g_pAutoCalcXML_Params_ParamType_ImageCount_All) != 0) + { + std::vector v_vClNames = mmStringUtilities::MMStringToVectorOfMMString(v_sName); + mmInt v_iCCount = mmStringUtilities::StringToMMInt(v_vClNames[0]); + v_sValue = v_vClNames[0]; + for(mmInt v_iC=0;v_iCFindChild(mmImages::g_pAutoCalcXML_Params_ParamName_Node)->GetText()); + }; + + v_vCMInParams[v_iCMIP]->FindChild(mmImages::g_pAutoCalcXML_Params_ParamValue_Node)->SetText(v_sValue); + + SendLogMessage(mmLog::user,mmString(L"InParam Name=") + + v_sName + + mmString(L" Value=") + + v_sValue); + }; + + mmXML::mmXMLDocI* v_psINXMLDoc = mmInterfaceInitializers::CreateXMLDocument(this->GetLogReceiver()); + v_psINXMLDoc->CopyXMLRootNodeStructure(v_psXMLCalcMethod_InParams); + mmString v_sInParams = v_psINXMLDoc->SaveToXMLBuffer(); + mmInt v_iStrSize = v_sInParams.copy(v_sCAP.sInParams,INOUT_PARAMS_SIZE,0); + v_sCAP.sInParams[v_iStrSize] = 0; + delete v_psINXMLDoc; + + mmXML::mmXMLNodeI* v_psXMLCalcMethod_OutParams = v_psXMLCalcMethod->FindChild(mmImages::g_pAutoCalcXML_OUTParams_Node); + //std::vector v_vCMOutParams = v_psXMLCalcMethod_OutParams->GetChilds(); + //mmInt v_iCMOPCount = v_vCMOutParams.size(); + + mmXML::mmXMLDocI* v_psOUTXMLDoc = mmInterfaceInitializers::CreateXMLDocument(this->GetLogReceiver()); + v_psOUTXMLDoc->CopyXMLRootNodeStructure(v_psXMLCalcMethod_OutParams); + mmString v_sOutParams = v_psOUTXMLDoc->SaveToXMLBuffer(); + v_iStrSize = v_sOutParams.copy(v_sCAP.sOutParams,INOUT_PARAMS_SIZE,0); + v_sCAP.sOutParams[v_iStrSize] = 0; + delete v_psOUTXMLDoc; + + SendLogMessage(mmLog::debug,mmString(L"End InitializeParamsOfSimpleCalculationMethod")); + + return v_sCAP; +} + +// PB // +void mmImages::mmImagesComplexCalculationManagement::UpdateOutputParamsOfSimpleCalculationMethod( mmXML::mmXMLNodeI* p_psXMLCalcPatternDefinition, + mmInt p_iCalculationMethodToUpdateID) +{ + SendLogMessage(mmLog::debug,mmString(L"Start UpdateOutputParamsOfSimpleCalculationMethod")); + + if(m_psCurrentCalculationMethod != NULL) + { + mmImages::mmImagesCalculationMethodI::sCalculationMethodParams v_sCMP = m_psCurrentCalculationMethod->GetCalculationMethodInfo(); + mmXML::mmXMLDocI* v_psXMLDoc = mmInterfaceInitializers::CreateXMLDocument(this->GetLogReceiver()); + //mmXML::mmXMLDocI* v_psXMLDoc = mmInterfaceInitializers::CreateXMLDocument(NULL); + v_psXMLDoc->ParseXMLBuffer(v_sCMP.sAutoParams.sOutParams); + std::vector v_vCurrentCMOutParams = v_psXMLDoc->GetXMLRootNode()->GetChilds(); + + mmXML::mmXMLNodeI* v_psXMLCalcMethod = p_psXMLCalcPatternDefinition-> + FindChild(mmImages::g_pComplexCalcXML_PatternDefinition_Node)-> + GetChild(p_iCalculationMethodToUpdateID); + + mmXML::mmXMLNodeI* v_psXMLCalcMethod_OutParams = v_psXMLCalcMethod->FindChild(mmImages::g_pAutoCalcXML_OUTParams_Node); + std::vector v_vCMOutParams = v_psXMLCalcMethod_OutParams->GetChilds(); + mmInt v_iCMOPCount = v_vCMOutParams.size(); + for(mmInt v_iCMOP=0;v_iCMOPFindChild(mmImages::g_pAutoCalcXML_Params_ParamValue_Node)->GetText(), + v_vCurrentCMOutParams[v_iCMOP]->FindChild(mmImages::g_pAutoCalcXML_Params_ParamValue_Node)->GetText()); + + mmString v_sName = v_vCMOutParams[v_iCMOP]->FindChild(mmImages::g_pAutoCalcXML_Params_ParamValue_Node)->GetText(); + mmString v_sValue = v_vCurrentCMOutParams[v_iCMOP]->FindChild(mmImages::g_pAutoCalcXML_Params_ParamValue_Node)->GetText(); + + SendLogMessage(mmLog::user,mmString(L"OutParam Name=") + + v_sName + + mmString(L" Value=") + + v_sValue); + }; + + delete v_psXMLDoc; + }; + + SendLogMessage(mmLog::debug,mmString(L"End UpdateOutputParamsOfSimpleCalculationMethod")); +} + +mmString mmImages::mmImagesComplexCalculationManagement::GetValueOfParameter(mmXML::mmXMLNodeI* p_psXMLCalcPatternDefinition, + mmString p_sParamName) +{ + SendLogMessage(mmLog::debug,mmString(L"Start GetValueOfParameter")); + + mmString v_sOutValue; + + mmXML::mmXMLNodeI* v_psXMLCalcPattern_InParams = p_psXMLCalcPatternDefinition->FindChild(mmImages::g_pComplexCalcXML_PatternInputParams_Node); + std::vector v_vCPInParams = v_psXMLCalcPattern_InParams->GetChilds(); + mmInt v_iCPIPCount = v_vCPInParams.size(); + for(mmInt v_iCMIP=0;v_iCMIPFindChild(mmImages::g_pComplexCalcXML_PatternInputParamName_Node)->GetText()) == 0) + { + mmXML::mmXMLNodeI* v_psXMLCalcPattern_InParam_ModifiedNode = + v_vCPInParams[v_iCMIP]->FindChild(mmImages::g_pComplexCalcXML_PatternInputParamValueModifiedNodeName_Node); + + if(v_psXMLCalcPattern_InParam_ModifiedNode == NULL) + { + v_sOutValue = v_vCPInParams[v_iCMIP]->FindChild(mmImages::g_pComplexCalcXML_PatternInputParamValue_Node)->GetText(); + } + else + { + mmString v_sModifierValue = GetValueOfParameter(p_psXMLCalcPatternDefinition,v_psXMLCalcPattern_InParam_ModifiedNode->GetText()); + + std::vector v_vAttributes = v_vCPInParams[v_iCMIP]->GetAttributes(); + + if(v_vAttributes.size() == 0) + { + v_sOutValue = mmStringUtilities::MMRealToString(mmStringUtilities::StringToMMReal(v_vCPInParams[v_iCMIP]->FindChild(mmImages::g_pComplexCalcXML_PatternInputParamValue_Node)->GetText()) * + mmStringUtilities::StringToMMReal(v_sModifierValue)); + } + else + { + v_sOutValue = GetValueOfParameter(p_psXMLCalcPatternDefinition,v_psXMLCalcPattern_InParam_ModifiedNode->GetText()); + }; + }; + + break; + }; + }; + + if(v_sOutValue.size() == 0) + { + mmXML::mmXMLNodeI* v_psXMLCalcPattern_OutParams = p_psXMLCalcPatternDefinition->FindChild(mmImages::g_pComplexCalcXML_PatternOutputParams_Node); + std::vector v_vCPOutParams = v_psXMLCalcPattern_OutParams->GetChilds(); + mmInt v_iCPOPCount = v_vCPOutParams.size(); + for(mmInt v_iCMOP=0;v_iCMOPFindChild(mmImages::g_pComplexCalcXML_PatternOutputParamName_Node)->GetText()) == 0) + { + mmXML::mmXMLNodeI* v_psXMLCalcPattern_OutParam_ModifiedNode = v_vCPOutParams[v_iCMOP]->FindChild(mmImages::g_pComplexCalcXML_PatternOutputParamValueModifiedNodeName_Node); + mmXML::mmXMLNodeI* v_psXMLCalcPattern_OutParam_Modified2ndNode = v_vCPOutParams[v_iCMOP]->FindChild(mmImages::g_pComplexCalcXML_PatternOutputParamValueModifiedSecondNodeName_Node); + + if(v_psXMLCalcPattern_OutParam_ModifiedNode == NULL) + { + v_sOutValue = v_vCPOutParams[v_iCMOP]->FindChild(mmImages::g_pComplexCalcXML_PatternOutputParamValue_Node)->GetText(); + } + else + { + if(v_psXMLCalcPattern_OutParam_Modified2ndNode == NULL) + { + mmString v_sModifierValue = GetValueOfParameter(p_psXMLCalcPatternDefinition,v_psXMLCalcPattern_OutParam_ModifiedNode->GetText()); + + if(v_vCPOutParams[v_iCMOP]->FindChild(mmImages::g_pComplexCalcXML_PatternOutputParamOperation_Node)->GetText().compare(mmImages::g_pComplexCalcXML_PatternOutputFormula_Multiplication) == 0) + { + v_sOutValue = mmStringUtilities::MMRealToString(mmStringUtilities::StringToMMReal(v_vCPOutParams[v_iCMOP]->FindChild(mmImages::g_pComplexCalcXML_PatternOutputParamValue_Node)->GetText()) * + mmStringUtilities::StringToMMReal(v_sModifierValue)); + } + else + { + if(v_vCPOutParams[v_iCMOP]->FindChild(mmImages::g_pComplexCalcXML_PatternOutputParamOperation_Node)->GetText().compare(mmImages::g_pComplexCalcXML_PatternOutputFormula_Division) == 0) + { + v_sOutValue = mmStringUtilities::MMRealToString(mmStringUtilities::StringToMMReal(v_sModifierValue)/ + mmStringUtilities::StringToMMReal(v_vCPOutParams[v_iCMOP]->FindChild(mmImages::g_pComplexCalcXML_PatternOutputParamValue_Node)->GetText())); + } + else + { + //mmReal v_rArg = mmStringUtilities::StringToMMReal(v_sModifierValue); + //mmReal v_rPow = mmStringUtilities::StringToMMReal(v_vCPOutParams[v_iCMOP]->FindChild(mmClouds::g_pComplexCalcXML_PatternOutputParamValue_Node)->GetText()); + //mmReal v_rRes = pow(v_rArg,v_rPow); + + v_sOutValue = mmStringUtilities::MMRealToString(pow(mmStringUtilities::StringToMMReal(v_sModifierValue), + mmStringUtilities::StringToMMReal(v_vCPOutParams[v_iCMOP]->FindChild(mmImages::g_pComplexCalcXML_PatternOutputParamValue_Node)->GetText()))); + }; + }; + } + else + { + mmString v_sModified1stValue = GetValueOfParameter(p_psXMLCalcPatternDefinition,v_psXMLCalcPattern_OutParam_ModifiedNode->GetText()); + + mmString v_sModified2ndValue = GetValueOfParameter(p_psXMLCalcPatternDefinition,v_vCPOutParams[v_iCMOP]-> + FindChild(mmImages::g_pComplexCalcXML_PatternOutputParamValueModifiedSecondNodeName_Node)-> + GetText()); + + if(v_vCPOutParams[v_iCMOP]->FindChild(mmImages::g_pComplexCalcXML_PatternOutputParamOperation_Node)->GetText().compare(mmImages::g_pComplexCalcXML_PatternOutputFormula_Addition) == 0) + { + v_sOutValue = mmStringUtilities::MMRealToString(mmStringUtilities::StringToMMReal(v_sModified1stValue) + + mmStringUtilities::StringToMMReal(v_sModified2ndValue)); + }; + if(v_vCPOutParams[v_iCMOP]->FindChild(mmImages::g_pComplexCalcXML_PatternOutputParamOperation_Node)->GetText().compare(mmImages::g_pComplexCalcXML_PatternOutputFormula_Subtraction) == 0) + { + v_sOutValue = mmStringUtilities::MMRealToString(mmStringUtilities::StringToMMReal(v_sModified1stValue) - + mmStringUtilities::StringToMMReal(v_sModified2ndValue)); + }; + if(v_vCPOutParams[v_iCMOP]->FindChild(mmImages::g_pComplexCalcXML_PatternOutputParamOperation_Node)->GetText().compare(mmImages::g_pComplexCalcXML_PatternOutputFormula_Multiplication) == 0) + { + v_sOutValue = mmStringUtilities::MMRealToString(mmStringUtilities::StringToMMReal(v_sModified1stValue) * + mmStringUtilities::StringToMMReal(v_sModified2ndValue)); + }; + if(v_vCPOutParams[v_iCMOP]->FindChild(mmImages::g_pComplexCalcXML_PatternOutputParamOperation_Node)->GetText().compare(mmImages::g_pComplexCalcXML_PatternOutputFormula_Division) == 0) + { + v_sOutValue = mmStringUtilities::MMRealToString(mmStringUtilities::StringToMMReal(v_sModified1stValue) / + mmStringUtilities::StringToMMReal(v_sModified2ndValue)); + }; + if(v_vCPOutParams[v_iCMOP]->FindChild(mmImages::g_pComplexCalcXML_PatternOutputParamOperation_Node)->GetText().compare(mmImages::g_pComplexCalcXML_PatternOutputFormula_Minimum) == 0) + { + mmReal v_r1stValue = mmStringUtilities::StringToMMReal(v_sModified1stValue); + mmReal v_r2ndValue = mmStringUtilities::StringToMMReal(v_sModified2ndValue); + + if(v_r1stValue < v_r2ndValue) + { + v_sOutValue = v_sModified1stValue; + } + else + { + v_sOutValue = v_sModified2ndValue; + }; + }; + if(v_vCPOutParams[v_iCMOP]->FindChild(mmImages::g_pComplexCalcXML_PatternOutputParamOperation_Node)->GetText().compare(mmImages::g_pComplexCalcXML_PatternOutputFormula_Maximum) == 0) + { + mmReal v_r1stValue = mmStringUtilities::StringToMMReal(v_sModified1stValue); + mmReal v_r2ndValue = mmStringUtilities::StringToMMReal(v_sModified2ndValue); + + if(v_r1stValue > v_r2ndValue) + { + v_sOutValue = v_sModified1stValue; + } + else + { + v_sOutValue = v_sModified2ndValue; + }; + }; + if(v_vCPOutParams[v_iCMOP]->FindChild(mmImages::g_pComplexCalcXML_PatternOutputParamOperation_Node)->GetText().compare(mmImages::g_pComplexCalcXML_PatternOutputFormula_Equal) == 0) + { + mmReal v_r1stValue = mmStringUtilities::StringToMMReal(v_sModified1stValue); + mmReal v_r2ndValue = mmStringUtilities::StringToMMReal(v_sModified2ndValue); + + if(v_r1stValue == v_r2ndValue) + { + v_sOutValue = mmImages::g_pAutoCalcXML_Params_ParamType_BoolValue_YES; + } + else + { + v_sOutValue = mmImages::g_pAutoCalcXML_Params_ParamType_BoolValue_NO; + }; + }; + if(v_vCPOutParams[v_iCMOP]->FindChild(mmImages::g_pComplexCalcXML_PatternOutputParamOperation_Node)->GetText().compare(mmImages::g_pComplexCalcXML_PatternOutputFormula_Greater) == 0) + { + mmReal v_r1stValue = mmStringUtilities::StringToMMReal(v_sModified1stValue); + mmReal v_r2ndValue = mmStringUtilities::StringToMMReal(v_sModified2ndValue); + + if(v_r1stValue > v_r2ndValue) + { + v_sOutValue = mmImages::g_pAutoCalcXML_Params_ParamType_BoolValue_YES; + } + else + { + v_sOutValue = mmImages::g_pAutoCalcXML_Params_ParamType_BoolValue_NO; + }; + }; + if(v_vCPOutParams[v_iCMOP]->FindChild(mmImages::g_pComplexCalcXML_PatternOutputParamOperation_Node)->GetText().compare(mmImages::g_pComplexCalcXML_PatternOutputFormula_Less) == 0) + { + mmReal v_r1stValue = mmStringUtilities::StringToMMReal(v_sModified1stValue); + mmReal v_r2ndValue = mmStringUtilities::StringToMMReal(v_sModified2ndValue); + + if(v_r1stValue < v_r2ndValue) + { + v_sOutValue = mmImages::g_pAutoCalcXML_Params_ParamType_BoolValue_YES; + } + else + { + v_sOutValue = mmImages::g_pAutoCalcXML_Params_ParamType_BoolValue_NO; + }; + }; + }; + }; + + break; + }; + }; + }; + + SendLogMessage(mmLog::info,mmString(L"GetValueOfParameter ")+ + p_sParamName + + mmString(L"=") + + v_sOutValue); + + SendLogMessage(mmLog::debug,mmString(L"End GetValueOfParameter")); + + return v_sOutValue; +} + +void mmImages::mmImagesComplexCalculationManagement::SetValueOfParameter( mmXML::mmXMLNodeI* p_psXMLCalcPatternDefinition, + mmString p_sParamName, + mmString p_sParamValue) +{ + SendLogMessage(mmLog::debug,mmString(L"Start SetValueOfParameter")); + + mmXML::mmXMLNodeI* v_psXMLCalcPattern_OutParams = + p_psXMLCalcPatternDefinition->FindChild(mmImages::g_pComplexCalcXML_PatternOutputParams_Node); + std::vector v_vCPOutParams = v_psXMLCalcPattern_OutParams->GetChilds(); + mmInt v_iCPOPCount = v_vCPOutParams.size(); + for(mmInt v_iCMOP=0;v_iCMOP + FindChild(mmImages::g_pComplexCalcXML_PatternOutputParamName_Node)-> + GetText()) == 0) + { + v_vCPOutParams[v_iCMOP]->FindChild(mmImages::g_pComplexCalcXML_PatternOutputParamValue_Node)->SetText(p_sParamValue); + }; + }; + + mmXML::mmXMLNodeI* v_psXMLCalcPattern_InParams = + p_psXMLCalcPatternDefinition->FindChild(mmImages::g_pComplexCalcXML_PatternInputParams_Node); + std::vector v_vCPInParams = v_psXMLCalcPattern_InParams->GetChilds(); + mmInt v_iCPIPCount = v_vCPInParams.size(); + for(mmInt v_iCMIP=0;v_iCMIPFindChild(mmImages::g_pComplexCalcXML_PatternInputParamName_Node)->GetText()) == 0) + { + v_vCPInParams[v_iCMIP]->FindChild(mmImages::g_pComplexCalcXML_PatternInputParamValue_Node)->SetText(p_sParamValue); + }; + }; + + SendLogMessage(mmLog::debug,mmString(L"End SetValueOfParameter")); +}; + +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +mmString mmImages::mmImagesComplexCalculationManagement::GetInputParamsOfComplexCalculationPattern(mmString p_sCCPIDName) +{ + SendLogMessage(mmLog::debug,mmString(L"Start GetInputParamsOfComplexCalculationPattern")); + + mmString v_sOutValue = L""; + + mmXML::mmXMLDocI* v_psXMLDoc = mmInterfaceInitializers::CreateXMLDocument(this->GetLogReceiver()); + v_psXMLDoc->CopyXMLRootNodeStructure(GetInputParamsOfCCPattern(p_sCCPIDName)); + v_sOutValue = v_psXMLDoc->SaveToXMLBuffer(); + + SendLogMessage(mmLog::debug,mmString(L"End GetInputParamsOfComplexCalculationPattern")); + return v_sOutValue; +} +//--------------------------------------------------------------------------- +mmString mmImages::mmImagesComplexCalculationManagement::GetOutputParamsOfComplexCalculationPattern(mmString p_sCCPIDName) +{ + SendLogMessage(mmLog::debug,mmString(L"Start GetOutputParamsOfComplexCalculationPattern")); + + mmString v_sOutValue = L""; + + mmXML::mmXMLDocI* v_psXMLDoc = mmInterfaceInitializers::CreateXMLDocument(this->GetLogReceiver()); + v_psXMLDoc->CopyXMLRootNodeStructure(GetOutputParamsOfCCPattern(p_sCCPIDName)); + v_sOutValue = v_psXMLDoc->SaveToXMLBuffer(); + + SendLogMessage(mmLog::debug,mmString(L"End GetOutputParamsOfComplexCalculationPattern")); + return v_sOutValue; +} +//--------------------------------------------------------------------------- +mmString mmImages::mmImagesComplexCalculationManagement::SetInputParamsOfComplexCalculationPattern(mmString p_sCCPIDName, mmString p_sNewParams) +{ + SendLogMessage(mmLog::debug,mmString(L"Start SetInputParamsOfComplexCalculationPattern")); + + mmXML::mmXMLDocI* v_psXMLDoc = mmInterfaceInitializers::CreateXMLDocument(this->GetLogReceiver()); + v_psXMLDoc->ParseXMLBuffer(p_sNewParams); + + mmXML::mmXMLNodeI* v_psXMLNode; + v_psXMLNode = GetInputParamsOfCCPattern(p_sCCPIDName); + mmXML::mmXMLNodeI* v_psXMLParent = v_psXMLNode->GetParent(); + delete v_psXMLNode; + mmString mtemp = v_psXMLDoc->GetXMLRootNode()->GetName(); + v_psXMLParent->AddChildWithStructure(v_psXMLDoc->GetXMLRootNode()); + + SendLogMessage(mmLog::debug,mmString(L"End SetInputParamsOfComplexCalculationPattern")); + return GetInputParamsOfComplexCalculationPattern(p_sCCPIDName); +} +//--------------------------------------------------------------------------- +mmString mmImages::mmImagesComplexCalculationManagement::SetOutputParamsOfComplexCalculationPattern(mmString p_sCCPIDName, mmString p_sNewParams) +{ + SendLogMessage(mmLog::debug,mmString(L"Start SetOutputParamsOfComplexCalculationPattern")); + + mmXML::mmXMLDocI* v_psXMLDoc = mmInterfaceInitializers::CreateXMLDocument(this->GetLogReceiver()); + v_psXMLDoc->ParseXMLBuffer(p_sNewParams); + + mmXML::mmXMLNodeI* v_psXMLNode; + v_psXMLNode = GetOutputParamsOfCCPattern(p_sCCPIDName); + mmXML::mmXMLNodeI* v_psXMLParent = v_psXMLNode->GetParent(); + delete v_psXMLNode; + mmString mtemp = v_psXMLDoc->GetXMLRootNode()->GetName(); + v_psXMLParent->AddChildWithStructure(v_psXMLDoc->GetXMLRootNode()); + + SendLogMessage(mmLog::debug,mmString(L"End SetOutputParamsOfComplexCalculationPattern")); + return GetOutputParamsOfComplexCalculationPattern(p_sCCPIDName); +} +//--------------------------------------------------------------------------- +mmXML::mmXMLNodeI* mmImages::mmImagesComplexCalculationManagement::GetInputParamsOfCCPattern(mmString p_sCCPIDName) +{ + SendLogMessage(mmLog::debug,mmString(L"Start GetInputParamsOfCCPattern")); + + std::vector v_vCCPatterns = m_psXMLComplexPatternContainer->GetXMLRootNode()->GetChilds(); + + mmInt v_iCCPCount = v_vCCPatterns.size(); + for(mmInt v_iCCP=0;v_iCCPFindChild(mmImages::g_pComplexCalcXML_PatternIDName_Node)->GetText().compare(p_sCCPIDName) == 0) + { + mmXML::mmXMLNodeI* v_vCCPInputParams = v_vCCPatterns[v_iCCP]->FindChild(mmImages::g_pComplexCalcXML_PatternInputParams_Node); + + SendLogMessage(mmLog::debug,mmString(L"End GetInputParamsOfCCPattern")); + + return v_vCCPInputParams; + }; + }; + + SendLogMessage(mmLog::debug,mmString(L"End GetInputParamsOfCCPattern")); + + return NULL; +} +//--------------------------------------------------------------------------- +mmXML::mmXMLNodeI* mmImages::mmImagesComplexCalculationManagement::GetOutputParamsOfCCPattern(mmString p_sCCPIDName) +{ + SendLogMessage(mmLog::debug,mmString(L"Start GetOutputParamsOfCCPattern")); + + std::vector v_vCCPatterns = m_psXMLComplexPatternContainer->GetXMLRootNode()->GetChilds(); + + mmInt v_iCCPCount = v_vCCPatterns.size(); + for(mmInt v_iCCP=0;v_iCCPFindChild(mmImages::g_pComplexCalcXML_PatternIDName_Node)->GetText().compare(p_sCCPIDName) == 0) + { + mmXML::mmXMLNodeI* v_vCCPInputParams = v_vCCPatterns[v_iCCP]->FindChild(mmImages::g_pComplexCalcXML_PatternOutputParams_Node); + + SendLogMessage(mmLog::debug,mmString(L"End GetOutputParamsOfCCPattern")); + + return v_vCCPInputParams; + }; + }; + + SendLogMessage(mmLog::debug,mmString(L"End GetOutputParamsOfCCPattern")); + + return NULL; +} +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- diff --git a/proj/libcalc2d/src/images/mmImagesStructure.cpp b/proj/libcalc2d/src/images/mmImagesStructure.cpp new file mode 100644 index 0000000..3ad9799 --- /dev/null +++ b/proj/libcalc2d/src/images/mmImagesStructure.cpp @@ -0,0 +1,704 @@ +#include + +#include + +#include +#include +#include + +#include +#include +#include + +#undef min +#undef max +#include +#include + + +struct FindByName { + FindByName(mmString const & p_sName) : m_sName(p_sName) {} + bool operator () (mmImages::mmLayer * const p_psLayer) { + return p_psLayer->GetName() == m_sName; + } + bool operator () (mmImages::mmImage * const p_psImage) { + return p_psImage->GetName() == m_sName; + } +private: + mmString const m_sName; +}; + +mmImages::mmLayer::mmLayer(mmString const & p_sName, mmUInt const p_iWidth, mmUInt const p_iHeight, mmReal const p_rDefaultValue, mmCallbackI * const p_psCallback) : + m_sName(p_sName), + m_rDefaultValue(p_rDefaultValue), + m_prValues((p_iWidth * p_iHeight) ? new mmReal[p_iWidth * p_iHeight] : NULL), + m_iWidth(p_iWidth), m_iHeight(p_iHeight), + m_psCallback(p_psCallback), + m_psLock(mmInterfaceInitializers::CreateReadWriteLock()) +{ + std::fill(m_prValues, m_prValues + m_iWidth * m_iHeight, m_rDefaultValue); + + if(m_psCallback != NULL) + m_psCallback->OnLayerCreate(this); +} + +mmImages::mmLayer::~mmLayer(void) { + delete m_psLock; + delete [] m_prValues; + + if(m_psCallback != NULL) + m_psCallback->OnLayerDestroy(this); +} + +mmUInt mmImages::mmLayer::GetWidth(void) const { + return m_iWidth; +} + +mmUInt mmImages::mmLayer::GetHeight(void) const { + return m_iHeight; +} + +mmReal mmImages::mmLayer::GetDefaultValue(void) const { + return m_rDefaultValue; +} + +void mmImages::mmLayer::Resize(mmUInt const p_iWidth, mmUInt const p_iHeight) { + m_psLock->LockForWrite(); + + if(p_iHeight * p_iWidth == 0) { + delete [] m_prValues; + m_prValues = NULL; + + m_iWidth = m_iHeight = 0; + } else { + mmReal * const v_prValues = new mmReal[p_iWidth * p_iHeight]; + + if(p_iWidth > m_iHeight || p_iWidth > m_iWidth) + std::fill(m_prValues, m_prValues + p_iWidth * p_iHeight, m_rDefaultValue); + + mmUInt const v_iCopyWidth = std::min(p_iWidth, m_iWidth), v_iCopyHeight = std::min(p_iHeight, m_iHeight); + for(mmUInt v_iY = 0; v_iY < v_iCopyHeight; ++v_iY) + ::memcpy(v_prValues + v_iY * v_iCopyWidth, m_prValues + v_iY * m_iWidth, v_iCopyWidth * sizeof(mmReal)); + + delete [] m_prValues; + + m_prValues = v_prValues; + m_iWidth = p_iWidth; + m_iHeight = p_iHeight; + + } + + m_sStats.Clear(); + + m_psLock->UnlockFromWrite(); + + if(m_psCallback != NULL) + m_psCallback->OnLayerPropertiesChange(this); +} + +mmImages::mmStats mmImages::mmLayer::GetStats(void) const { + return m_sStats; +} + +mmString mmImages::mmLayer::GetName(void) const { + return m_sName; +} + +void mmImages::mmLayer::SetName(mmString const & p_sName) { + m_psLock->LockForWrite(); + + m_sName = p_sName; + + m_psLock->UnlockFromWrite(); + + if(m_psCallback != NULL) + m_psCallback->OnLayerPropertiesChange(this); +} + +bool mmImages::mmLayer::GetRows(mmUInt const p_iStart, mmUInt const p_iCount, mmReal p_prValues[]) const { + if(p_iStart > m_iHeight || (p_iStart + p_iCount) > m_iHeight) + return false; + + m_psLock->LockForRead(); + + ::memcpy(p_prValues, m_prValues + p_iStart * m_iWidth, p_iCount * m_iWidth * sizeof(mmReal)); + + m_psLock->UnlockFromRead(); + + return true; +} + +bool mmImages::mmLayer::SetRows(mmUInt const p_iStart, mmUInt const p_iCount, mmReal const p_prValues[]) { + if(p_iStart > m_iHeight || (p_iStart + p_iCount) > m_iHeight) + return false; + + m_psLock->LockForWrite(); + + ::memcpy(m_prValues + p_iStart * m_iWidth, p_prValues, p_iCount * m_iWidth * sizeof(mmReal)); + + m_sStats.Update(m_prValues, m_iWidth * m_iHeight); + + m_psLock->UnlockFromWrite(); + + if(m_psCallback != NULL) + m_psCallback->OnLayerValuesChange(this); + + return true; +} + +bool mmImages::mmLayer::GetPixels(mmRect const & p_sRect, mmReal p_prValues[]) const { + if(p_sRect.iLeft > m_iWidth || p_sRect.iTop > m_iHeight || (p_sRect.iLeft + p_sRect.iWidth) > m_iWidth || (p_sRect.iTop + p_sRect.iHeight) > m_iHeight || p_sRect.iWidth * p_sRect.iHeight == 0) + return false; + + m_psLock->LockForRead(); + + for(mmUInt v_iRow = 0; v_iRow < p_sRect.iHeight; ++v_iRow) + ::memcpy(p_prValues + v_iRow * p_sRect.iWidth, m_prValues + (p_sRect.iTop + v_iRow) * m_iWidth + p_sRect.iLeft, p_sRect.iWidth * sizeof(mmReal)); + + m_psLock->UnlockFromRead(); + + return true; +} + +bool mmImages::mmLayer::SetPixels(mmRect const & p_sRect, mmReal const p_prValues[]) { + if(p_sRect.iLeft > m_iWidth || p_sRect.iTop > m_iHeight || (p_sRect.iLeft + p_sRect.iWidth) > m_iWidth || (p_sRect.iTop + p_sRect.iHeight) > m_iHeight || p_sRect.iWidth * p_sRect.iHeight == 0) + return false; + + m_psLock->LockForWrite(); + + for(mmUInt v_iRow = 0; v_iRow < p_sRect.iHeight; ++v_iRow) + ::memcpy(m_prValues + (p_sRect.iTop + v_iRow) * m_iWidth + p_sRect.iLeft, p_prValues + v_iRow * p_sRect.iWidth, p_sRect.iWidth * sizeof(mmReal)); + + m_sStats.Update(m_prValues, m_iWidth * m_iHeight); + + m_psLock->UnlockFromWrite(); + + if(m_psCallback != NULL) + m_psCallback->OnLayerValuesChange(this); + + return true; +} + +mmImages::mmImage::mmImage(mmString const & p_sName, mmUInt const p_iWidth, mmUInt const p_iHeight, mmPixelType const p_ePixelType, mmImageI::mmCallbackI * const p_psCallback) : + m_sName(p_sName), + m_iWidth(p_iWidth), m_iHeight(p_iHeight), + m_ePixelType(p_ePixelType), + m_psCallback(p_psCallback) +{ + switch(m_ePixelType) { + case mmP8: + m_sChannels.push_back(new mmLayer(L"I", m_iWidth, m_iHeight, 0.0, NULL)); + break; + case mmP24: + m_sChannels.push_back(new mmLayer(L"R", m_iWidth, m_iHeight, 0.0, NULL)); + m_sChannels.push_back(new mmLayer(L"G", m_iWidth, m_iHeight, 0.0, NULL)); + m_sChannels.push_back(new mmLayer(L"B", m_iWidth, m_iHeight, 0.0, NULL)); + break; + case mmP32: + m_sChannels.push_back(new mmLayer(L"R", m_iWidth, m_iHeight, 0.0, NULL)); + m_sChannels.push_back(new mmLayer(L"G", m_iWidth, m_iHeight, 0.0, NULL)); + m_sChannels.push_back(new mmLayer(L"B", m_iWidth, m_iHeight, 0.0, NULL)); + m_sChannels.push_back(new mmLayer(L"A", m_iWidth, m_iHeight, 0.0, NULL)); + break; + default: + break; + } + + if(m_psCallback != NULL) + m_psCallback->OnImageCreate(this); +} + +mmImages::mmImage::~mmImage(void) { + for(std::list::iterator v_iI = m_sChannels.begin(); v_iI != m_sChannels.end(); ++v_iI) + delete *v_iI; + + for(std::list::iterator v_iI = m_sLayers.begin(); v_iI != m_sLayers.end(); ++v_iI) + delete *v_iI; + + if(m_psCallback != NULL) + m_psCallback->OnImageDestroy(this); +} + +mmUInt mmImages::mmImage::GetWidth(void) const { + return m_iWidth; +} + +mmUInt mmImages::mmImage::GetHeight(void) const { + return m_iHeight; +} + +void mmImages::mmImage::Resize(mmUInt const p_iWidth, mmUInt const p_iHeight) { + for(std::list::iterator v_iI = m_sChannels.begin(); v_iI != m_sChannels.end(); ++v_iI) + (*v_iI)->Resize(p_iWidth, p_iHeight); + + if(m_psCallback != NULL) + m_psCallback->OnImagePropertiesChange(this); + + for(std::list::iterator v_iI = m_sLayers.begin(); v_iI != m_sLayers.end(); ++v_iI) + (*v_iI)->Resize(p_iWidth, p_iHeight); +} + +mmImages::mmImage::mmPixelType mmImages::mmImage::GetPixelType(void) const { + return m_ePixelType; +} + +mmString mmImages::mmImage::GetName(void) const { + return m_sName; +} + +void mmImages::mmImage::SetName(mmString const & p_sName) { + m_sName = p_sName; + + if(m_psCallback != NULL) + m_psCallback->OnImagePropertiesChange(this); +} + +mmImages::mmLayerI * mmImages::mmImage::GetChannel(mmUInt const p_iIndex) const { + if(p_iIndex < m_sChannels.size()) { + std::list::const_iterator v_sLayer = m_sChannels.begin(); + std::advance(v_sLayer, p_iIndex); + return *v_sLayer; + } else + return NULL; +} + +bool mmImages::mmImage::GetRows(mmUInt const p_iStart, mmUInt const p_iCount, mmPixel8 p_psValues[]) const { + if(m_ePixelType != mmP8 || p_iStart > (m_iWidth * m_iHeight) || (p_iStart + p_iCount) > (m_iWidth * m_iHeight) || p_iCount == 0) + return false; + + m_sChannels.front()->GetRows(p_iStart, p_iCount, &p_psValues->rI); + + return true; +} + +bool mmImages::mmImage::GetRows(mmUInt const p_iStart, mmUInt const p_iCount, mmPixel24 p_psValues[]) const { + if((m_ePixelType != mmP24 && m_ePixelType != mmP32) || p_iStart > (m_iWidth * m_iHeight) || (p_iStart + p_iCount) > (m_iWidth * m_iHeight) || p_iCount == 0) + return false; + + mmReal * v_prValues = new mmReal[p_iCount * m_iWidth]; + std::list::const_iterator v_sChannel = m_sChannels.begin(); + + (*v_sChannel)->GetRows(p_iStart, p_iCount, v_prValues); + for(mmUInt v_iI = 0; v_iI < p_iCount * m_iWidth; ++v_iI) + p_psValues[v_iI].rR = v_prValues[v_iI]; + + ++v_sChannel; + (*v_sChannel)->GetRows(p_iStart, p_iCount, v_prValues); + for(mmUInt v_iI = 0; v_iI < p_iCount * m_iWidth; ++v_iI) + p_psValues[v_iI].rG = v_prValues[v_iI]; + + ++v_sChannel; + (*v_sChannel)->GetRows(p_iStart, p_iCount, v_prValues); + for(mmUInt v_iI = 0; v_iI < p_iCount * m_iWidth; ++v_iI) + p_psValues[v_iI].rB = v_prValues[v_iI]; + + delete [] v_prValues; + + return true; +} + +bool mmImages::mmImage::GetRows(mmUInt const p_iStart, mmUInt const p_iCount, mmPixel32 p_psValues[]) const { + if(m_ePixelType != mmP32 || p_iStart > (m_iWidth * m_iHeight) || (p_iStart + p_iCount) > (m_iWidth * m_iHeight) || p_iCount == 0) + return false; + + mmReal * v_prValues = new mmReal[p_iCount * m_iWidth]; + std::list::const_iterator v_sChannel = m_sChannels.begin(); + + (*v_sChannel)->GetRows(p_iStart, p_iCount, v_prValues); + for(mmUInt v_iI = 0; v_iI < p_iCount * m_iWidth; ++v_iI) + p_psValues[v_iI].rR = v_prValues[v_iI]; + + ++v_sChannel; + (*v_sChannel)->GetRows(p_iStart, p_iCount, v_prValues); + for(mmUInt v_iI = 0; v_iI < p_iCount * m_iWidth; ++v_iI) + p_psValues[v_iI].rG = v_prValues[v_iI]; + + ++v_sChannel; + (*v_sChannel)->GetRows(p_iStart, p_iCount, v_prValues); + for(mmUInt v_iI = 0; v_iI < p_iCount * m_iWidth; ++v_iI) + p_psValues[v_iI].rB = v_prValues[v_iI]; + + ++v_sChannel; + (*v_sChannel)->GetRows(p_iStart, p_iCount, v_prValues); + for(mmUInt v_iI = 0; v_iI < p_iCount * m_iWidth; ++v_iI) + p_psValues[v_iI].rA = v_prValues[v_iI]; + + delete [] v_prValues; + + return true; +} + +bool mmImages::mmImage::SetRows(mmUInt const p_iStart, mmUInt const p_iCount, mmPixel8 const p_psValues[]) { + if(m_ePixelType != mmP8 || p_iStart > (m_iWidth * m_iHeight) || (p_iStart + p_iCount) > (m_iWidth * m_iHeight) || p_iCount == 0) + return false; + + m_sChannels.front()->SetRows(p_iStart, p_iCount, &p_psValues->rI); + + if(m_psCallback != NULL) + m_psCallback->OnImagePixelsChange(this); + + return true; +} + +bool mmImages::mmImage::SetRows(mmUInt const p_iStart, mmUInt const p_iCount, mmPixel24 const p_psValues[]) { + if((m_ePixelType != mmP24 && m_ePixelType != mmP32) || p_iStart > (m_iWidth * m_iHeight) || (p_iStart + p_iCount) > (m_iWidth * m_iHeight) || p_iCount == 0) + return false; + + mmReal * v_prValues = new mmReal[p_iCount * m_iWidth]; + std::list::iterator v_sChannel = m_sChannels.begin(); + + for(mmUInt v_iI = 0; v_iI < p_iCount * m_iWidth; ++v_iI) + v_prValues[v_iI] = p_psValues[v_iI].rR; + (*v_sChannel)->SetRows(p_iStart, p_iCount, v_prValues); + + ++v_sChannel; + for(mmUInt v_iI = 0; v_iI < p_iCount * m_iWidth; ++v_iI) + v_prValues[v_iI] = p_psValues[v_iI].rG; + (*v_sChannel)->SetRows(p_iStart, p_iCount, v_prValues); + + ++v_sChannel; + for(mmUInt v_iI = 0; v_iI < p_iCount * m_iWidth; ++v_iI) + v_prValues[v_iI] = p_psValues[v_iI].rB; + (*v_sChannel)->SetRows(p_iStart, p_iCount, v_prValues); + + delete [] v_prValues; + + if(m_psCallback != NULL) + m_psCallback->OnImagePixelsChange(this); + + return true; +} + +bool mmImages::mmImage::SetRows(mmUInt const p_iStart, mmUInt const p_iCount, mmPixel32 const p_psValues[]) { + if(m_ePixelType != mmP32 || p_iStart > (m_iWidth * m_iHeight) || (p_iStart + p_iCount) > (m_iWidth * m_iHeight) || p_iCount == 0) + return false; + + mmReal * v_prValues = new mmReal[p_iCount * m_iWidth]; + std::list::iterator v_sChannel = m_sChannels.begin(); + + for(mmUInt v_iI = 0; v_iI < p_iCount * m_iWidth; ++v_iI) + v_prValues[v_iI] = p_psValues[v_iI].rR; + (*v_sChannel)->SetRows(p_iStart, p_iCount, v_prValues); + + ++v_sChannel; + for(mmUInt v_iI = 0; v_iI < p_iCount * m_iWidth; ++v_iI) + v_prValues[v_iI] = p_psValues[v_iI].rG; + (*v_sChannel)->SetRows(p_iStart, p_iCount, v_prValues); + + ++v_sChannel; + for(mmUInt v_iI = 0; v_iI < p_iCount * m_iWidth; ++v_iI) + v_prValues[v_iI] = p_psValues[v_iI].rB; + (*v_sChannel)->SetRows(p_iStart, p_iCount, v_prValues); + + ++v_sChannel; + for(mmUInt v_iI = 0; v_iI < p_iCount * m_iWidth; ++v_iI) + v_prValues[v_iI] = p_psValues[v_iI].rA; + (*v_sChannel)->SetRows(p_iStart, p_iCount, v_prValues); + + delete [] v_prValues; + + if(m_psCallback != NULL) + m_psCallback->OnImagePixelsChange(this); + + return true; +} + +bool mmImages::mmImage::GetPixels(mmRect const & p_sRect, mmPixel8 p_psValues[]) const { + if(m_ePixelType != mmP8 || p_sRect.iLeft > m_iWidth || p_sRect.iTop > m_iHeight || (p_sRect.iLeft + p_sRect.iWidth) > m_iWidth || (p_sRect.iTop + p_sRect.iHeight) > m_iHeight || p_sRect.iWidth * p_sRect.iHeight == 0) + return false; + + m_sChannels.front()->GetPixels(p_sRect, &p_psValues->rI); + + return true; +} + +bool mmImages::mmImage::GetPixels(mmRect const & p_sRect, mmPixel24 p_psValues[]) const { + if((m_ePixelType != mmP24 && m_ePixelType != mmP32) || p_sRect.iLeft > m_iWidth || p_sRect.iTop > m_iHeight || (p_sRect.iLeft + p_sRect.iWidth) > m_iWidth || (p_sRect.iTop + p_sRect.iHeight) > m_iHeight || p_sRect.iWidth * p_sRect.iHeight == 0) + return false; + + mmReal * v_prValues = new mmReal[p_sRect.iWidth * p_sRect.iHeight]; + std::list::const_iterator v_sChannel = m_sChannels.begin(); + + (*v_sChannel)->GetPixels(p_sRect, v_prValues); + for(mmUInt v_iRow = 0; v_iRow < p_sRect.iHeight; ++v_iRow) + for(mmUInt v_iPixel = 0; v_iPixel < p_sRect.iWidth; ++v_iPixel) + p_psValues[v_iRow * p_sRect.iWidth + v_iPixel].rR = v_prValues[v_iRow * p_sRect.iWidth + v_iPixel]; + + ++v_sChannel; + (*v_sChannel)->GetPixels(p_sRect, v_prValues); + for(mmUInt v_iRow = 0; v_iRow < p_sRect.iHeight; ++v_iRow) + for(mmUInt v_iPixel = 0; v_iPixel < p_sRect.iWidth; ++v_iPixel) + p_psValues[v_iRow * p_sRect.iWidth + v_iPixel].rG = v_prValues[v_iRow * p_sRect.iWidth + v_iPixel]; + + ++v_sChannel; + (*v_sChannel)->GetPixels(p_sRect, v_prValues); + for(mmUInt v_iRow = 0; v_iRow < p_sRect.iHeight; ++v_iRow) + for(mmUInt v_iPixel = 0; v_iPixel < p_sRect.iWidth; ++v_iPixel) + p_psValues[v_iRow * p_sRect.iWidth + v_iPixel].rB = v_prValues[v_iRow * p_sRect.iWidth + v_iPixel]; + + delete [] v_prValues; + + return true; +} + +bool mmImages::mmImage::GetPixels(mmRect const & p_sRect, mmPixel32 p_psValues[]) const { + if(m_ePixelType != mmP32 || p_sRect.iLeft > m_iWidth || p_sRect.iTop > m_iHeight || (p_sRect.iLeft + p_sRect.iWidth) > m_iWidth || (p_sRect.iTop + p_sRect.iHeight) > m_iHeight || p_sRect.iWidth * p_sRect.iHeight == 0) + return false; + + mmReal * v_prValues = new mmReal[p_sRect.iWidth * p_sRect.iHeight]; + std::list::const_iterator v_sChannel = m_sChannels.begin(); + + (*v_sChannel)->GetPixels(p_sRect, v_prValues); + for(mmUInt v_iRow = 0; v_iRow < p_sRect.iHeight; ++v_iRow) + for(mmUInt v_iPixel = 0; v_iPixel < p_sRect.iWidth; ++v_iPixel) + p_psValues[v_iRow * p_sRect.iWidth + v_iPixel].rR = v_prValues[v_iRow * p_sRect.iWidth + v_iPixel]; + + ++v_sChannel; + (*v_sChannel)->GetPixels(p_sRect, v_prValues); + for(mmUInt v_iRow = 0; v_iRow < p_sRect.iHeight; ++v_iRow) + for(mmUInt v_iPixel = 0; v_iPixel < p_sRect.iWidth; ++v_iPixel) + p_psValues[v_iRow * p_sRect.iWidth + v_iPixel].rG = v_prValues[v_iRow * p_sRect.iWidth + v_iPixel]; + + ++v_sChannel; + (*v_sChannel)->GetPixels(p_sRect, v_prValues); + for(mmUInt v_iRow = 0; v_iRow < p_sRect.iHeight; ++v_iRow) + for(mmUInt v_iPixel = 0; v_iPixel < p_sRect.iWidth; ++v_iPixel) + p_psValues[v_iRow * p_sRect.iWidth + v_iPixel].rB = v_prValues[v_iRow * p_sRect.iWidth + v_iPixel]; + + ++v_sChannel; + (*v_sChannel)->GetPixels(p_sRect, v_prValues); + for(mmUInt v_iRow = 0; v_iRow < p_sRect.iHeight; ++v_iRow) + for(mmUInt v_iPixel = 0; v_iPixel < p_sRect.iWidth; ++v_iPixel) + p_psValues[v_iRow * p_sRect.iWidth + v_iPixel].rA = v_prValues[v_iRow * p_sRect.iWidth + v_iPixel]; + + delete [] v_prValues; + + return true; +} + +bool mmImages::mmImage::SetPixels(mmRect const & p_sRect, mmPixel8 const p_psValues[]) { + if(m_ePixelType != mmP8 || p_sRect.iLeft > m_iWidth || p_sRect.iTop > m_iHeight || (p_sRect.iLeft + p_sRect.iWidth) > m_iWidth || (p_sRect.iTop + p_sRect.iHeight) > m_iHeight || p_sRect.iWidth * p_sRect.iHeight == 0) + return false; + + m_sChannels.front()->SetPixels(p_sRect, &p_psValues->rI); + + if(m_psCallback != NULL) + m_psCallback->OnImagePixelsChange(this); + + return true; +} + +bool mmImages::mmImage::SetPixels(mmRect const & p_sRect, mmPixel24 const p_psValues[]) { + if((m_ePixelType != mmP24 && m_ePixelType != mmP32) || p_sRect.iLeft > m_iWidth || p_sRect.iTop > m_iHeight || (p_sRect.iLeft + p_sRect.iWidth) > m_iWidth || (p_sRect.iTop + p_sRect.iHeight) > m_iHeight || p_sRect.iWidth * p_sRect.iHeight == 0) + return false; + + mmReal * v_prValues = new mmReal[p_sRect.iWidth * p_sRect.iHeight]; + std::list::iterator v_sChannel = m_sChannels.begin(); + + for(mmUInt v_iRow = 0; v_iRow < p_sRect.iHeight; ++v_iRow) + for(mmUInt v_iPixel = 0; v_iPixel < p_sRect.iWidth; ++v_iPixel) + v_prValues[v_iRow * m_iWidth + v_iPixel] = p_psValues[v_iRow * m_iWidth + v_iPixel].rR; + (*v_sChannel)->SetPixels(p_sRect, v_prValues); + + ++v_sChannel; + for(mmUInt v_iRow = 0; v_iRow < p_sRect.iHeight; ++v_iRow) + for(mmUInt v_iPixel = 0; v_iPixel < p_sRect.iWidth; ++v_iPixel) + v_prValues[v_iRow * m_iWidth + v_iPixel] = p_psValues[v_iRow * m_iWidth + v_iPixel].rG; + (*v_sChannel)->SetPixels(p_sRect, v_prValues); + + ++v_sChannel; + for(mmUInt v_iRow = 0; v_iRow < p_sRect.iHeight; ++v_iRow) + for(mmUInt v_iPixel = 0; v_iPixel < p_sRect.iWidth; ++v_iPixel) + v_prValues[v_iRow * m_iWidth + v_iPixel] = p_psValues[v_iRow * m_iWidth + v_iPixel].rB; + (*v_sChannel)->SetPixels(p_sRect, v_prValues); + + delete [] v_prValues; + + if(m_psCallback != NULL) + m_psCallback->OnImagePixelsChange(this); + + return true; +} + +bool mmImages::mmImage::SetPixels(mmRect const & p_sRect, mmPixel32 const p_psValues[]) { + if(m_ePixelType != mmP32 || p_sRect.iLeft > m_iWidth || p_sRect.iTop > m_iHeight || (p_sRect.iLeft + p_sRect.iWidth) > m_iWidth || (p_sRect.iTop + p_sRect.iHeight) > m_iHeight || p_sRect.iWidth * p_sRect.iHeight == 0) + return false; + + mmReal * v_prValues = new mmReal[p_sRect.iWidth * p_sRect.iHeight]; + std::list::iterator v_sChannel = m_sChannels.begin(); + + for(mmUInt v_iRow = 0; v_iRow < p_sRect.iHeight; ++v_iRow) + for(mmUInt v_iPixel = 0; v_iPixel < p_sRect.iWidth; ++v_iPixel) + v_prValues[v_iRow * m_iWidth + v_iPixel] = p_psValues[v_iRow * m_iWidth + v_iPixel].rR; + (*v_sChannel)->SetPixels(p_sRect, v_prValues); + + ++v_sChannel; + for(mmUInt v_iRow = 0; v_iRow < p_sRect.iHeight; ++v_iRow) + for(mmUInt v_iPixel = 0; v_iPixel < p_sRect.iWidth; ++v_iPixel) + v_prValues[v_iRow * m_iWidth + v_iPixel] = p_psValues[v_iRow * m_iWidth + v_iPixel].rG; + (*v_sChannel)->SetPixels(p_sRect, v_prValues); + + ++v_sChannel; + for(mmUInt v_iRow = 0; v_iRow < p_sRect.iHeight; ++v_iRow) + for(mmUInt v_iPixel = 0; v_iPixel < p_sRect.iWidth; ++v_iPixel) + v_prValues[v_iRow * m_iWidth + v_iPixel] = p_psValues[v_iRow * m_iWidth + v_iPixel].rB; + (*v_sChannel)->SetPixels(p_sRect, v_prValues); + + ++v_sChannel; + for(mmUInt v_iRow = 0; v_iRow < p_sRect.iHeight; ++v_iRow) + for(mmUInt v_iPixel = 0; v_iPixel < p_sRect.iWidth; ++v_iPixel) + v_prValues[v_iRow * m_iWidth + v_iPixel] = p_psValues[v_iRow * m_iWidth + v_iPixel].rA; + (*v_sChannel)->SetPixels(p_sRect, v_prValues); + + delete [] v_prValues; + + if(m_psCallback != NULL) + m_psCallback->OnImagePixelsChange(this); + + return true; +} + +void mmImages::mmImage::SetRegionOfInterest(mmRect const & p_sRegion) { + m_sRegionOfInterest = p_sRegion; + + m_sRegionOfInterest.iLeft = std::min(m_sRegionOfInterest.iLeft, m_iWidth); + m_sRegionOfInterest.iTop = std::min(m_sRegionOfInterest.iTop, m_iHeight); + m_sRegionOfInterest.iWidth = std::min(m_sRegionOfInterest.iWidth, m_iWidth - m_sRegionOfInterest.iLeft); + m_sRegionOfInterest.iHeight = std::min(m_sRegionOfInterest.iHeight, m_iHeight - m_sRegionOfInterest.iTop); + + if(m_psCallback != NULL) + m_psCallback->OnImagePropertiesChange(this); +} + +mmRect mmImages::mmImage::GetRegionOfInterest(void) const { + return m_sRegionOfInterest; +} + +mmUInt mmImages::mmImage::CreateLayer(mmString const & p_sName, mmReal const p_rDefaultValue) { + m_sLayers.push_back(new mmLayer(p_sName, m_iWidth, m_iHeight, p_rDefaultValue, this)); + return static_cast(m_sLayers.size() - 1); +} + +mmUInt mmImages::mmImage::GetLayerCount(void) const { + return static_cast(m_sLayers.size()); +} + +mmImages::mmLayerI * mmImages::mmImage::GetLayer(mmUInt const p_iIndex) const { + if(p_iIndex < m_sLayers.size()) { + std::list::const_iterator v_sLayer = m_sLayers.begin(); + std::advance(m_sLayers.begin(), p_iIndex); + return *v_sLayer; + } else + return NULL; +} + +mmImages::mmLayerI * mmImages::mmImage::GetLayer(mmString const & p_sName) const { + std::list::const_iterator v_sLayer = std::find_if(m_sLayers.begin(), m_sLayers.end(), FindByName(p_sName)); + if(v_sLayer != m_sLayers.end()) + return *v_sLayer; + else + return NULL; +} + +bool mmImages::mmImage::DeleteLayer(mmUInt const p_iIndex) { + if(p_iIndex < m_sLayers.size()) { + std::list::iterator v_sLayer = m_sLayers.begin(); + std::advance(v_sLayer, p_iIndex); + delete *v_sLayer; + m_sLayers.erase(v_sLayer); + return true; + } else + return false; +} + +bool mmImages::mmImage::DeleteLayer(mmString const & p_sName) { + std::list::iterator v_sLayer = std::find_if(m_sLayers.begin(), m_sLayers.end(), FindByName(p_sName)); + if(v_sLayer != m_sLayers.end()) { + delete *v_sLayer; + m_sLayers.erase(v_sLayer); + return true; + } else + return false; +} + +void mmImages::mmImage::SetMetadata(mmString const & p_sMetadata) { + m_sMetadata = p_sMetadata; +} + +mmString mmImages::mmImage::GetMetadata(void) { + return m_sMetadata; +} + +void mmImages::mmImage::OnLayerCreate(mmLayerI * p_psLayer) { + if(m_psCallback != NULL) + m_psCallback->OnLayerCreate(this, p_psLayer); +} + +void mmImages::mmImage::OnLayerDestroy(mmLayerI * p_psLayer) { + if(m_psCallback != NULL) + m_psCallback->OnLayerDestroy(this, p_psLayer); +} + +void mmImages::mmImage::OnLayerPropertiesChange(mmLayerI * p_psLayer) { + if(m_psCallback != NULL) + m_psCallback->OnLayerPropertiesChange(this, p_psLayer); +} + +void mmImages::mmImage::OnLayerValuesChange(mmLayerI * p_psLayer) { + if(m_psCallback != NULL) + m_psCallback->OnLayerValuesChange(this, p_psLayer); +} + +mmImages::mmImageStructure::mmImageStructure(mmImageI::mmCallbackI * const p_psCallback) : + m_psCallback(p_psCallback) +{} + +mmImages::mmImageStructure::~mmImageStructure(void) { +} + +mmUInt mmImages::mmImageStructure::CreateImage(mmString const & p_sName, mmUInt const p_iWidth, mmUInt const p_iHeight, mmImageI::mmPixelType const p_ePixelType) { + m_sImages.push_back(new mmImage(p_sName, p_iWidth, p_iHeight, p_ePixelType, m_psCallback)); + return static_cast(m_sImages.size() - 1); +} + +mmUInt mmImages::mmImageStructure::GetImageCount(void) const { + return static_cast(m_sImages.size()); +} + +mmImages::mmImageI * mmImages::mmImageStructure::GetImage(mmUInt const p_iIndex) const { + if(p_iIndex < m_sImages.size()) { + std::list::const_iterator v_sImage = m_sImages.begin(); + std::advance(m_sImages.begin(), p_iIndex); + return *v_sImage; + } else + return NULL; +} + +mmImages::mmImageI * mmImages::mmImageStructure::GetImage(mmString const & p_sName) const { + std::list::const_iterator v_sImage = std::find_if(m_sImages.begin(), m_sImages.end(), FindByName(p_sName)); + if(v_sImage != m_sImages.end()) + return *v_sImage; + else + return NULL; +} + +bool mmImages::mmImageStructure::DeleteImage(mmUInt const p_iIndex) { + if(p_iIndex < m_sImages.size()) { + std::list::iterator v_sImage = m_sImages.begin(); + std::advance(v_sImage, p_iIndex); + delete *v_sImage; + m_sImages.erase(v_sImage); + return true; + } else + return false; +} + +bool mmImages::mmImageStructure::DeleteImage(mmString const & p_sName) { + std::list::iterator v_sImage = std::find_if(m_sImages.begin(), m_sImages.end(), FindByName(p_sName)); + if(v_sImage != m_sImages.end()) { + delete *v_sImage; + m_sImages.erase(v_sImage); + return true; + } else + return false; +} \ No newline at end of file diff --git a/proj/libcalc2d/src/interfaces/mmGlobalInterfacesStorage.cpp b/proj/libcalc2d/src/interfaces/mmGlobalInterfacesStorage.cpp new file mode 100644 index 0000000..a3b956e --- /dev/null +++ b/proj/libcalc2d/src/interfaces/mmGlobalInterfacesStorage.cpp @@ -0,0 +1,52 @@ +#include + +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +//// mmInterfacesStorage::mmGlobalInterfacesStorage +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +//mmInterfacesStorage::mmGlobalInterfacesStorage::mmGlobalInterfacesStorage(mmMemory::mmMemoryManagerI* p_psMemoryManager, +// mmLog::mmLogReceiverI* p_psLogReceiver ): mmLog::mmLogSender(L"mmInterfacesStorage::mmGlobalInterfacesStorage",p_psLogReceiver) +// +//{ +// SendLogMessage(mmLog::debug,mmString(L"Start Constructor")); +// +// m_psMemoryManager = p_psMemoryManager; +// +// SendLogMessage(mmLog::debug,mmString(L"End Constructor")); +//} +// +//mmInterfacesStorage::mmGlobalInterfacesStorage::~mmGlobalInterfacesStorage() +//{ +// SendLogMessage(mmLog::debug,mmString(L"Start Destructor")); +// +// SendLogMessage(mmLog::debug,mmString(L"End Destructor")); +//} +// +//mmMemory::mmMemoryManagerI* mmInterfacesStorage::mmGlobalInterfacesStorage::GetMemoryManager(void) +//{ +// SendLogMessage(mmLog::debug,mmString(L"Start GetMemoryManager")); +// +// SendLogMessage(mmLog::debug,mmString(L"End GetMemoryManager")); +// +// return m_psMemoryManager; +//} +// +//mmLog::mmLogReceiverI* mmInterfacesStorage::mmGlobalInterfacesStorage::GetLogManager(void) +//{ +// SendLogMessage(mmLog::debug,mmString(L"Start GetLogManager")); +// +// SendLogMessage(mmLog::debug,mmString(L"End GetLogManager")); +// +// return this->GetLogReceiver(); +//} +// +mmInterfacesStorage::mmGlobalInterfacesStorage::mmGlobalInterfacesStorage(mmLog::mmLogReceiverI* p_psLogReceiver ) : m_psLogReceiver(p_psLogReceiver) {} + +mmLog::mmLogReceiverI* mmInterfacesStorage::mmGlobalInterfacesStorage::GetLogManager(void) { + return m_psLogReceiver; +} + +mmLog::mmLogReceiverI* mmInterfacesStorage::mmGlobalInterfacesStorage::GetLogReceiver(void) { + return m_psLogReceiver; +} diff --git a/proj/libcalc2d/src/interfaces/mmIHardware.cpp b/proj/libcalc2d/src/interfaces/mmIHardware.cpp new file mode 100644 index 0000000..1c16d16 --- /dev/null +++ b/proj/libcalc2d/src/interfaces/mmIHardware.cpp @@ -0,0 +1,51 @@ +#include + +mmInt mmImageProcessing::GetPixelSize(mmImageProcessing::ePixelType p_ePixelType) +{ + mmInt v_iResult; + + switch(p_ePixelType) + { + case mmImageProcessing::pixel_R8G8B8: + { + v_iResult = 3; + }; + break; + case mmImageProcessing::pixel_B8G8R8: + { + v_iResult = 3; + }; + break; + case mmImageProcessing::pixel_Gray8: + { + v_iResult = 1; + }; + break; + case mmImageProcessing::pixel_Gray16: + { + v_iResult = 2; + }; + break; + case mmImageProcessing::pixel_B8G8R8A8: + { + v_iResult = 4; + }; + break; + case mmImageProcessing::pixel_R8G8B8A8: + { + v_iResult = 4; + }; + break; + case mmImageProcessing::pixel_R16G16B16: + { + v_iResult = 6; + }; + break; + default: + { + throw mmError(mmeImageProcessingUnknownPixelType); + }; + }; + + return v_iResult; +} diff --git a/proj/libcalc2d/src/interfaces/mmIImages.cpp b/proj/libcalc2d/src/interfaces/mmIImages.cpp new file mode 100644 index 0000000..8ad7046 --- /dev/null +++ b/proj/libcalc2d/src/interfaces/mmIImages.cpp @@ -0,0 +1,62 @@ +#include + +#include + +mmUInt const mmImages::mmImageI::iInvalid = std::numeric_limits::max(); +mmUInt const mmImages::mmLayerI::iInvalid = std::numeric_limits::max(); + +mmReal const mmImages::mmStats::rInvalid = std::numeric_limits::quiet_NaN(); + +mmImages::mmStats::mmStats(void) : rMin(rInvalid), rMax(rInvalid), rAverage(rInvalid), rStdDev(rInvalid) +{} + +void mmImages::mmStats::Clear(void) { + rMin = rInvalid; + rMax = rInvalid; + rAverage = rInvalid; + rStdDev = rInvalid; +} + +void mmImages::mmStats::Update(mmReal const p_prValues[], mmUInt const p_iSize) { + if(p_iSize == 0) + return; + + rAverage = 0.0; + rStdDev = 0.0; + rMin = std::numeric_limits::max(); + rMax = -std::numeric_limits::max(); + + for(mmUInt v_iI = 0; v_iI < p_iSize; ++v_iI) { + rAverage += p_prValues[v_iI]; + if(p_prValues[v_iI] < rMin) + rMin = p_prValues[v_iI]; + if(p_prValues[v_iI] > rMax) + rMax = p_prValues[v_iI]; + } + rAverage /= static_cast(p_iSize); + + mmReal v_rTemp; + for(mmUInt v_iI = 0; v_iI < p_iSize; ++v_iI) { + v_rTemp = p_prValues[v_iI] - rAverage; + rStdDev += v_rTemp * v_rTemp; + } + rStdDev = ::sqrt(rStdDev / static_cast(p_iSize)); +} + +const wchar_t* mmImages::g_pAutoCalcXML_Params_ParamType_ImageName = L"Image name..."; +const wchar_t* mmImages::g_pAutoCalcXML_Params_ParamType_ImagesNames = L"Image names..."; +const wchar_t* mmImages::g_pAutoCalcXML_Params_ParamType_ImageCount_All = L"All"; +const wchar_t* mmImages::g_pAutoCalcXML_Params_ParamType_DataLayerName = L"Data layer name..."; +const wchar_t* mmImages::g_pAutoCalcXML_Params_ParamType_RealValue = L"Real value..."; +const wchar_t* mmImages::g_pAutoCalcXML_Params_ParamType_IntegerValue = L"Integer value..."; +const wchar_t* mmImages::g_pAutoCalcXML_Params_ParamType_BoolValue = L"Yes/No value..."; +const wchar_t* mmImages::g_pAutoCalcXML_Params_ParamType_BoolValue_YES = L"YES"; +const wchar_t* mmImages::g_pAutoCalcXML_Params_ParamType_BoolValue_NO = L"NO"; +const wchar_t* mmImages::g_pAutoCalcXML_Params_ParamType_String = L"String value..."; + +const wchar_t* mmImages::g_pAutoCalcXML_INParams_Node = L"AutoINParams"; +const wchar_t* mmImages::g_pAutoCalcXML_OUTParams_Node = L"AutoOUTParams"; +const wchar_t* mmImages::g_pAutoCalcXML_Params_Param_Node = L"AutoParam"; +const wchar_t* mmImages::g_pAutoCalcXML_Params_ParamName_Node = L"AutoParamName"; +const wchar_t* mmImages::g_pAutoCalcXML_Params_ParamType_Node = L"AutoParamType"; +const wchar_t* mmImages::g_pAutoCalcXML_Params_ParamValue_Node = L"AutoParamValue"; diff --git a/proj/libcalc2d/src/log/mmLogFile.cpp b/proj/libcalc2d/src/log/mmLogFile.cpp new file mode 100644 index 0000000..ba7210d --- /dev/null +++ b/proj/libcalc2d/src/log/mmLogFile.cpp @@ -0,0 +1,48 @@ +#include + +#include + +mmLog::mmLogFile::mmLogFile(mmString p_sLogFileName) +{ + m_psLogFile = mmInterfaceInitializers::CreateTextFileForWrite(); + + m_psLogFile->Open(p_sLogFileName,mmFileIO::trunc_for_write); +} + +mmLog::mmLogFile::~mmLogFile() +{ + m_psLogFile->Flush(); + + delete m_psLogFile; +} + +void mmLog::mmLogFile::SendLogMessage(eLogMessagePriority p_ePriority,mmString* p_psString) +{ + switch(p_ePriority) + { + case mmLog::debug: + { + m_psLogFile->WriteChar('D'); + }; + break; + case mmLog::info: + { + m_psLogFile->WriteChar('I'); + }; + break; + case mmLog::user: + { + m_psLogFile->WriteChar('U'); + }; + break; + case mmLog::critical: + { + m_psLogFile->WriteChar('C'); + }; + break; + }; + + m_psLogFile->WriteChar(' '); + + m_psLogFile->WriteLine(*p_psString); +} diff --git a/proj/libcalc2d/src/log/mmLogRedirector.cpp b/proj/libcalc2d/src/log/mmLogRedirector.cpp new file mode 100644 index 0000000..d519df9 --- /dev/null +++ b/proj/libcalc2d/src/log/mmLogRedirector.cpp @@ -0,0 +1,119 @@ +#include + +#include + +mmLog::mmLogRedirector::mmLogRedirector() +{ + m_psExclusiveLock = mmInterfaceInitializers::CreateExclusiveLock(); +} + +mmLog::mmLogRedirector::~mmLogRedirector() +{ + delete m_psExclusiveLock; +} + +bool mmLog::mmLogRedirector::IsRegistered(mmLogReceiverI* p_pLogReceiver) +{ + mmInt v_iCount = static_cast(m_sReceiverTable.size()); + mmInt v_i; + bool bIsFound = false; + + for(v_i=0;v_i(m_sReceiverTable.size()); + mmInt v_i; + + // sprawdzam czy nie ma pustego elementu + for(v_i=0;v_i(m_sReceiverTable.size()-1); +} + +void mmLog::mmLogRedirector::RegisterLogReceiver(eLogMessagePriority p_eMinPriority, + mmLogReceiverI* p_pLogReceiver) +{ + bool bIsRegistered; + + // jeśli jest już zarejestrowana to zgłaszam wyjątek + m_psExclusiveLock->Lock(); + bIsRegistered = IsRegistered(p_pLogReceiver); + m_psExclusiveLock->Unlock(); + if(bIsRegistered) + { + throw mmError(mmeLogReceiverObjectAlreadyRegistered); + }; + + // tworzę nowy element + m_psExclusiveLock->Lock(); + mmInt v_iFreeIndex = GetFreeReceiverTableIndex(); + m_sReceiverTable[v_iFreeIndex].ePriority = p_eMinPriority; + m_sReceiverTable[v_iFreeIndex].pReceiver = p_pLogReceiver; + m_psExclusiveLock->Unlock(); +} + +void mmLog::mmLogRedirector::UnregisterLogReceiver(mmLogReceiverI* p_pLogReceiver) +{ + mmInt v_iUnregisterCount = 0; + + m_psExclusiveLock->Lock(); + mmInt v_iCount = static_cast(m_sReceiverTable.size()); + mmInt v_i; + + for(v_i=0;v_iUnlock(); + + if(v_iUnregisterCount != 1) + { + throw mmError(mmeLogReceiverObjectIsNotRegistered); + }; +} + +void mmLog::mmLogRedirector::SendLogMessage(eLogMessagePriority p_ePriority,mmString* p_psString) +{ + m_psExclusiveLock->Lock(); + mmInt v_iCount = static_cast(m_sReceiverTable.size()); + mmInt v_i; + + for(v_i=0;v_iSendLogMessage(p_ePriority,p_psString); + }; + }; + }; + m_psExclusiveLock->Unlock(); +} + diff --git a/proj/libcalc2d/src/log/mmLogSender.cpp b/proj/libcalc2d/src/log/mmLogSender.cpp new file mode 100644 index 0000000..a3e02fa --- /dev/null +++ b/proj/libcalc2d/src/log/mmLogSender.cpp @@ -0,0 +1,55 @@ +#include + +#include +#include + +mmLog::mmLogSender::mmLogSender(mmString p_sClassName,mmLog::mmLogReceiverI* p_psLog) +{ + m_sClassName = p_sClassName; + m_psLog = p_psLog; +} + +void mmLog::mmLogSender::SendLogMessage(eLogMessagePriority p_ePriority,mmString p_sString) +{ + if(m_psLog != NULL) + { + mmString v_sLogMessage = mmStringUtilities::GetCurrentDateTimeString() + + mmString(L" ") + + mmStringUtilities::MMRealToString(mmOperatingSystem::GetApplicationTime(),3) + + mmString(L" ") + + mmStringUtilities::MMIntToString(mmOperatingSystem::GetCurrentThreadID()) + + mmString(L" ") + + m_sClassName + + mmString(L" ") + + mmStringUtilities::PointerToString(this) + + mmString(L" ") + + p_sString; + + m_psLog->SendLogMessage(p_ePriority,&v_sLogMessage); + }; +} + +mmLog::mmLogReceiverI* mmLog::mmLogSender::GetLogReceiver(void) +{ + return m_psLog; +} + +void mmLog::mmLogSender::SendLogMessage(void* p_pClassPointer,eLogMessagePriority p_ePriority,mmString p_sString) +{ + if(m_psLog != NULL) + { + mmString v_sLogMessage = mmStringUtilities::GetCurrentDateTimeString() + + mmString(L" ") + + mmStringUtilities::MMRealToString(mmOperatingSystem::GetApplicationTime(),3) + + mmString(L" ") + + mmStringUtilities::MMIntToString(mmOperatingSystem::GetCurrentThreadID()) + + mmString(L" ") + + m_sClassName + + mmString(L" ") + + mmStringUtilities::PointerToString(p_pClassPointer) + + mmString(L" ") + + p_sString; + + m_psLog->SendLogMessage(p_ePriority,&v_sLogMessage); + }; +} diff --git a/proj/libcalc2d/src/mmError.cpp b/proj/libcalc2d/src/mmError.cpp new file mode 100644 index 0000000..792585a --- /dev/null +++ b/proj/libcalc2d/src/mmError.cpp @@ -0,0 +1,25 @@ +#include + +//////////////////////////////////////////////////////////////////////////////// +/// Table with error numbers. Table ends with -1 value. +//////////////////////////////////////////////////////////////////////////////// +//const mmInt g_tErrorCodesTable[] = {20000, +// 20100, +// -1}; + +mmError::mmError(mmInt p_iErrID) +{ + m_iErrorID = p_iErrID; +} + +mmInt mmError::GetErrorCode(void) +{ + return m_iErrorID; +} + +mmString mmError::GetErrorString(void) +{ + // TODO + + return mmString(L"no error string"); +} diff --git a/proj/libcalc2d/src/mmInterfaceInitializers.cpp b/proj/libcalc2d/src/mmInterfaceInitializers.cpp new file mode 100644 index 0000000..ade8b44 --- /dev/null +++ b/proj/libcalc2d/src/mmInterfaceInitializers.cpp @@ -0,0 +1,167 @@ +#include +#include +#include +#include +#include + +#include +#include +#include + +mmSynchronize::mmExclusiveLockI* mmInterfaceInitializers::CreateExclusiveLock(mmLog::mmLogReceiverI *p_psLogReceiver) +{ + try + { + return (new mmSynchronize::mmExclusiveLockCSWindows(p_psLogReceiver)); + } + catch(std::bad_alloc) + { + throw mmError(mmeBadAlloc); + }; +} + +mmSynchronize::mmReadWriteLockI* mmInterfaceInitializers::CreateReadWriteLock(mmLog::mmLogReceiverI *p_psLogReceiver) +{ + try + { + return (new mmSynchronize::mmReadWriteLockCSWindows(p_psLogReceiver)); + } + catch(std::bad_alloc) + { + throw mmError(mmeBadAlloc); + }; +} + + +mmFileIO::mmFileUtilsI* mmInterfaceInitializers::CreateFileUtils(mmLog::mmLogReceiverI* p_psLogReceiver) +{ + try + { + return (new mmFileIO::mmFileUtilsSTD(p_psLogReceiver)); + } + catch(std::bad_alloc) + { + throw mmError(mmeBadAlloc); + }; +} + +mmFileIO::mmTextFileReadI* mmInterfaceInitializers::CreateTextFileForRead(mmLog::mmLogReceiverI* p_psLogReceiver) +{ + try + { + return (new mmFileIO::mmTextFileReadSTD(p_psLogReceiver)); + } + catch(std::bad_alloc) + { + throw mmError(mmeBadAlloc); + }; +} + +mmFileIO::mmBinaryFileReadI* mmInterfaceInitializers::CreateBinaryFileForRead(mmLog::mmLogReceiverI* p_psLogReceiver) +{ + try + { + return (new mmFileIO::mmBinaryFileReadSTD(p_psLogReceiver)); + } + catch(std::bad_alloc) + { + throw mmError(mmeBadAlloc); + }; +} + +mmFileIO::mmTextFileWriteI* mmInterfaceInitializers::CreateTextFileForWrite(mmLog::mmLogReceiverI* p_psLogReceiver) +{ + try + { + return (new mmFileIO::mmTextFileWriteSTD(p_psLogReceiver)); + } + catch(std::bad_alloc) + { + throw mmError(mmeBadAlloc); + }; +} + +mmFileIO::mmBinaryFileWriteI* mmInterfaceInitializers::CreateBinaryFileForWrite(mmLog::mmLogReceiverI* p_psLogReceiver) +{ + try + { + return (new mmFileIO::mmBinaryFileWriteSTD(p_psLogReceiver)); + } + catch(std::bad_alloc) + { + throw mmError(mmeBadAlloc); + }; +} + + +mmLog::mmLogReceiverI* mmInterfaceInitializers::CreateLogFile(mmString p_sLogFileName) +{ + try + { + return (new mmLog::mmLogFile(p_sLogFileName)); + } + catch(std::bad_alloc) + { + throw mmError(mmeBadAlloc); + }; +} + +mmXML::mmXMLDocI* mmInterfaceInitializers::CreateXMLDocument(mmLog::mmLogReceiverI* p_psLogReceiver) +{ + try + { + return (new mmXML::mmXMLDocBB(p_psLogReceiver)); + } + catch(std::bad_alloc) + { + throw mmError(mmeBadAlloc); + }; +} + +mmXML::mmXMLNodeI* mmInterfaceInitializers::CreateXMLNode(mmLog::mmLogReceiverI* p_psLogReceiver) +{ + try + { + return (new mmXML::mmXMLNodeBB(p_psLogReceiver)); + } + catch(std::bad_alloc) + { + throw mmError(mmeBadAlloc); + }; +} +mmThread::mmThreadI* mmInterfaceInitializers::CreateDefaultThread(mmLog::mmLogReceiverI* p_psLogReceiver) +{ + try + { + return (new mmThread::mmThreadWindows(p_psLogReceiver)); + } + catch(std::bad_alloc) + { + throw mmError(mmeBadAlloc); + }; +} + +mmImages::mmImageStructureI* mmInterfaceInitializers::CreateDefaultImageStructure(mmImages::mmImageI::mmCallbackI * p_psCallback, mmLog::mmLogReceiverI* p_psLogReceiver) +{ + try + { + return (new mmImages::mmImageStructure(p_psCallback)); + } + catch(std::bad_alloc) + { + throw mmError(mmeBadAlloc); + }; +} + +mmImages::mmImagesCalculationMethodContainerI* mmInterfaceInitializers::CreateDefaultImagesCalculationMethodContainer(mmLog::mmLogReceiverI* p_psLogReceiver) +{ + try + { + return (new mmImages::mmImagesCalculationMethodContainerForWindows(p_psLogReceiver)); + } + catch(std::bad_alloc) + { + throw mmError(mmeBadAlloc); + }; +} + diff --git a/proj/libcalc2d/src/mmOperatingSystemCalls.cpp b/proj/libcalc2d/src/mmOperatingSystemCalls.cpp new file mode 100644 index 0000000..6b7c8fe --- /dev/null +++ b/proj/libcalc2d/src/mmOperatingSystemCalls.cpp @@ -0,0 +1,269 @@ + +#pragma hdrstop + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +mmInt mmOperatingSystem::GetCurrentThreadID(void) +{ + return GetCurrentThreadId(); +} + +void mmOperatingSystem::CreateDir(mmString p_sDirName) +{ + int v_iRes = _wmkdir(p_sDirName.c_str()); + if(v_iRes != 0) + { + switch(errno) + { + case EACCES: + { + throw mmError(mmeFileIOPermissionToFileDenied); + }; + case ENOENT: + { + throw mmError(mmeFileIONoSuchFileOrDirectory); + }; + default: + { + throw mmError(mmeUnknownError); + }; + }; + }; +} + +void mmOperatingSystem::RemoveDir(mmString p_sDirName) +{ + int v_iRes = _wrmdir(p_sDirName.c_str()); + if(v_iRes != 0) + { + switch(errno) + { + case EACCES: + { + throw mmError(mmeFileIOPermissionToFileDenied); + }; + case ENOENT: + { + throw mmError(mmeFileIONoSuchFileOrDirectory); + }; + default: + { + throw mmError(mmeUnknownError); + }; + }; + }; +} + +bool mmOperatingSystem::IsExistingDir(mmString p_sDirName) +{ + bool v_bRes = false; + + // pobieram aktywny dysk i ścieżkę + int v_iDriveNo = _getdrive(); + wchar_t* v_pcCurDir = _wgetcwd(NULL,_MAX_PATH); + if(v_pcCurDir == NULL) + { + throw mmError(mmeBadAlloc); + }; + + // prubuję przejść do ścieżki p_sDirName + if(_wchdir(p_sDirName.c_str()) == 0) + { + v_bRes = true; + }; + + // przywracam poprzedni dysk i ścieżkę + _chdrive(v_iDriveNo); + if(_wchdir(v_pcCurDir) != 0) + { + throw mmError(mmeUnknownError); + }; + + // zwalniam pamięć przydzieloną przez getcwd + free(v_pcCurDir); + + return v_bRes; +} + +mmString mmOperatingSystem::GetApplicationDirectory(void) +{ + + + TCHAR v_ptcAppPath[MAX_PATH + 1]; + + // Clear destination buffer + ::ZeroMemory( v_ptcAppPath, sizeof(v_ptcAppPath) ); + + // Get fully-qualified path for the executable + if ( ! ::GetModuleFileName(NULL, v_ptcAppPath, MAX_PATH ) ) + { + // Failure + return (L""); + } + mmString v_sAppPath( v_ptcAppPath ); + + v_sAppPath.resize(v_sAppPath.find_last_of(L"\\")); + + return v_sAppPath; +} + +mmString mmOperatingSystem::GetApplicationName(void) +{ + + + MAX_PATH; + TCHAR v_ptcAppPath[MAX_PATH + 1]; + + + // Clear destination buffer + ::ZeroMemory( v_ptcAppPath, sizeof(v_ptcAppPath) ); + + // Get fully-qualified path for the executable + if ( ! ::GetModuleFileName(NULL, v_ptcAppPath, MAX_PATH ) ) + { + // Failure + return (L""); + } + + mmString v_sAppNameAndPath( v_ptcAppPath ); + + mmString v_sAppName = v_sAppNameAndPath.substr(v_sAppNameAndPath.find_last_of(L"\\")+1,v_sAppNameAndPath.size()-v_sAppNameAndPath.find_last_of(L"\\")-1); + + return v_sAppName; + +} + +mmString mmOperatingSystem::GetCurrentWorkingDir(void) +{ + wchar_t v_ctDirectory[_MAX_PATH]; + + wchar_t v_cLetter[2]; + v_cLetter[0] = 'A'+_getdrive()-1; + v_cLetter[1] = 0; + if(_wgetcwd(v_ctDirectory,_MAX_PATH) == NULL) + { + throw mmError(mmeUnknownError); + }; + + mmString v_sWorkingDir = mmString(v_cLetter) + + mmString(L":\\") + + mmString(v_ctDirectory); + + return v_sWorkingDir; +} + +std::vector mmOperatingSystem::GetDirectoryElements(mmString p_sDirName, + mmString p_sDirWildcards) +{ + std::vector v_sDirElements; + _wfinddata_t v_sActFileInfo; + mmFileIO::mmFileUtilsI::sDirElement v_sActElement; + intptr_t v_hSearchHandle; + int v_iRes = 0; + + // pobieram pierwszy element + mmString v_sString((p_sDirName + mmString(L"\\") + p_sDirWildcards).c_str()); + v_hSearchHandle = _wfindfirst(const_cast(v_sString.c_str()), &v_sActFileInfo); + if(v_hSearchHandle == -1) + { + //if( (_doserrno == ENOENT) || (_doserrno == EINVAL) ) + { + throw mmError(mmeFileIONoSuchFileOrDirectory); + } + //else + //{ + // throw mmError(mmeUnknownError); + //}; + } + else + { + while(v_iRes != -1) + { + // przetwarzam element + v_sActElement.sName = v_sActFileInfo.name; + // nie przetwarzam elementów "." i ".." + if( (v_sActElement.sName.compare(L".") != 0) && (v_sActElement.sName.compare(L"..") != 0) ) + { + if(v_sActFileInfo.attrib & _A_SUBDIR) + { + v_sActElement.bFile = false; + } + else + { + v_sActElement.bFile = true; + }; + v_sDirElements.push_back(v_sActElement); + }; + // pobieram następny + v_iRes = _wfindnext(v_hSearchHandle,&v_sActFileInfo); + }; + }; + + _findclose(v_hSearchHandle); + + return v_sDirElements; +} + +bool mmOperatingSystem::IsExistingFile(mmString p_sFileName) +{ + return ::_waccess(p_sFileName.c_str(), 0) != -1; +} + +mmReal mmOperatingSystem::GetApplicationTime(void) +{ + std::clock_t v_sCurrentClock; + + v_sCurrentClock = clock(); + return (static_cast(v_sCurrentClock)/CLK_TCK); +} + + +void mmOperatingSystem::StopThread(mmInt p_iMiliSeconds) +{ + Sleep(p_iMiliSeconds); +} + +mmString mmOperatingSystem::GetUniqueIDString(void) +{ + mmString v_sOutIDString; + + // Hard Drive ID + DWORD v_sSN,v_sDW1,v_sDW2; + wchar_t v_cS1[256]; + wchar_t v_cS2[256]; + + mmString v_sWinDir = _wgetenv(L"windir"); + mmString v_sDrive = v_sWinDir.substr(0,3); + GetVolumeInformation(v_sDrive.c_str(),v_cS1,256,&v_sSN,&v_sDW1,&v_sDW2,v_cS2,256); + + wchar_t v_cHDD[256]; + swprintf(v_cHDD,L"%d",v_sSN); + mmString v_sHDD = v_cHDD; + + // Program tick count + std::clock_t v_sCurrentClock = v_sCurrentClock = clock(); + + wchar_t v_cCLK[256]; + swprintf(v_cCLK,L"%d",v_sCurrentClock); + mmString v_sCLK = v_cCLK; + + // date time + mmString v_sDateTime = mmStringUtilities::GetCurrentDateTimeString(); + + v_sOutIDString = v_sHDD + v_sCLK + mmString(L"_") + v_sDateTime; + + return v_sOutIDString; +} + diff --git a/proj/libcalc2d/src/mmPixel.cpp b/proj/libcalc2d/src/mmPixel.cpp new file mode 100644 index 0000000..2b77a3e --- /dev/null +++ b/proj/libcalc2d/src/mmPixel.cpp @@ -0,0 +1,246 @@ +#include + +mmUInt const mmPixel8::iComponents = 1; +mmPixel8::mmPixel8(void) : rI(0.0) {} +mmPixel8::mmPixel8(mmReal const p_rI) : rI(p_rI) {} + +mmUInt const mmPixel24::iComponents = 3; +mmPixel24::mmPixel24(void) : rR(0.0), rG(0.0), rB(0.0) {} +mmPixel24::mmPixel24(mmReal const p_rR, mmReal const p_rG, mmReal const p_rB) : rR(p_rR), rG(p_rG), rB(p_rB) {} +mmPixel24::mmPixel24(mmPixel8 const & p_smmPixel8) : rR(p_smmPixel8.rI), rG(p_smmPixel8.rI), rB(p_smmPixel8.rI) {} + +mmUInt const mmPixel32::iComponents = 4; +mmPixel32::mmPixel32(void) : rR(0.0), rG(0.0), rB(0.0), rA(0.0) {} +mmPixel32::mmPixel32(mmReal const p_rR, mmReal const p_rG, mmReal const p_rB, mmReal const p_rA) : rR(p_rR), rG(p_rG), rB(p_rB), rA(p_rA) {} +mmPixel32::mmPixel32(mmPixel8 const & p_smmPixel8) : rR(p_smmPixel8.rI), rG(p_smmPixel8.rI), rB(p_smmPixel8.rI), rA(0.0) {} +mmPixel32::mmPixel32(mmPixel24 const & p_smmPixel24) : rR(p_smmPixel24.rR), rG(p_smmPixel24.rG), rB(p_smmPixel24.rB), rA(0.0) {} + +inline mmPixel8 operator + (mmPixel8 p_sP1, mmPixel8 const & p_sP2) { + p_sP1.rI += p_sP2.rI; + + return p_sP1; +} + +inline mmPixel8 operator - (mmPixel8 p_sP1, mmPixel8 const & p_sP2) { + p_sP1.rI -= p_sP2.rI; + + return p_sP1; +} + +inline mmPixel8 operator += (mmPixel8 & p_sP1, mmPixel8 const & p_sP2) { + p_sP1.rI += p_sP2.rI; + + return p_sP1; +} + +inline mmPixel8 operator -= (mmPixel8 & p_sP1, mmPixel8 const & p_sP2) { + p_sP1.rI -= p_sP2.rI; + + return p_sP1; +} + +inline mmPixel8 operator * (mmPixel8 p_sP, mmReal const p_rS) { + p_sP.rI *= p_rS; + + return p_sP; +} + +inline mmPixel8 operator * (mmReal const p_rS, mmPixel8 p_sP) { + p_sP.rI *= p_rS; + + return p_sP; +} + +inline mmPixel8 operator / (mmPixel8 p_sP, mmReal const p_rS) { + p_sP.rI /= p_rS; + + return p_sP; +} + +inline mmPixel8 operator *= (mmPixel8 & p_sP, mmReal const p_rS) { + p_sP.rI *= p_rS; + + return p_sP; +} + +inline mmPixel8 operator *= (mmReal const p_rS, mmPixel8 & p_sP) { + p_sP.rI *= p_rS; + + return p_sP; +} + +inline mmPixel8 operator /= (mmPixel8 & p_sP, mmReal const p_rS) { + p_sP.rI /= p_rS; + + return p_sP; +} + +inline mmPixel24 operator + (mmPixel24 p_sP1, mmPixel24 const & p_sP2) { + p_sP1.rR += p_sP2.rR; + p_sP1.rG += p_sP2.rG; + p_sP1.rB += p_sP2.rB; + + return p_sP1; +} + +inline mmPixel24 operator - (mmPixel24 p_sP1, mmPixel24 const & p_sP2) { + p_sP1.rR -= p_sP2.rR; + p_sP1.rG -= p_sP2.rG; + p_sP1.rB -= p_sP2.rB; + + return p_sP1; +} + +inline mmPixel24 operator += (mmPixel24 & p_sP1, mmPixel24 const & p_sP2) { + p_sP1.rR += p_sP2.rR; + p_sP1.rG += p_sP2.rG; + p_sP1.rB += p_sP2.rB; + + return p_sP1; +} + +inline mmPixel24 operator -= (mmPixel24 & p_sP1, mmPixel24 const & p_sP2) { + p_sP1.rR -= p_sP2.rR; + p_sP1.rG -= p_sP2.rG; + p_sP1.rB -= p_sP2.rB; + + return p_sP1; +} + +inline mmPixel24 operator * (mmPixel24 p_sP, mmReal const p_rS) { + p_sP.rR *= p_rS; + p_sP.rG *= p_rS; + p_sP.rB *= p_rS; + + return p_sP; +} + +inline mmPixel24 operator * (mmReal const p_rS, mmPixel24 p_sP) { + p_sP.rR *= p_rS; + p_sP.rG *= p_rS; + p_sP.rB *= p_rS; + + return p_sP; +} + +inline mmPixel24 operator / (mmPixel24 p_sP, mmReal const p_rS) { + p_sP.rR /= p_rS; + p_sP.rG /= p_rS; + p_sP.rB /= p_rS; + + return p_sP; +} + +inline mmPixel24 operator *= (mmPixel24 & p_sP, mmReal const p_rS) { + p_sP.rR *= p_rS; + p_sP.rG *= p_rS; + p_sP.rB *= p_rS; + + return p_sP; +} + +inline mmPixel24 operator *= (mmReal const p_rS, mmPixel24 & p_sP) { + p_sP.rR *= p_rS; + p_sP.rG *= p_rS; + p_sP.rB *= p_rS; + + return p_sP; +} + +inline mmPixel24 operator /= (mmPixel24 & p_sP, mmReal const p_rS) { + p_sP.rR /= p_rS; + p_sP.rG /= p_rS; + p_sP.rB /= p_rS; + + return p_sP; +} + +inline mmPixel32 operator + (mmPixel32 p_sP1, mmPixel32 const & p_sP2) { + p_sP1.rR += p_sP2.rR; + p_sP1.rG += p_sP2.rG; + p_sP1.rB += p_sP2.rB; + p_sP1.rA += p_sP2.rA; + + return p_sP1; +} + +inline mmPixel32 operator - (mmPixel32 p_sP1, mmPixel32 const & p_sP2) { + p_sP1.rR -= p_sP2.rR; + p_sP1.rG -= p_sP2.rG; + p_sP1.rB -= p_sP2.rB; + p_sP1.rA -= p_sP2.rA; + + return p_sP1; +} + +inline mmPixel32 operator += (mmPixel32 & p_sP1, mmPixel32 const & p_sP2) { + p_sP1.rR += p_sP2.rR; + p_sP1.rG += p_sP2.rG; + p_sP1.rB += p_sP2.rB; + p_sP1.rA += p_sP2.rA; + + return p_sP1; +} + +inline mmPixel32 operator -= (mmPixel32 & p_sP1, mmPixel32 const & p_sP2) { + p_sP1.rR -= p_sP2.rR; + p_sP1.rG -= p_sP2.rG; + p_sP1.rB -= p_sP2.rB; + p_sP1.rA -= p_sP2.rA; + + return p_sP1; +} + +inline mmPixel32 operator * (mmPixel32 p_sP, mmReal const p_rS) { + p_sP.rR *= p_rS; + p_sP.rG *= p_rS; + p_sP.rB *= p_rS; + p_sP.rA *= p_rS; + + return p_sP; +} + +inline mmPixel32 operator * (mmReal const p_rS, mmPixel32 p_sP) { + p_sP.rR *= p_rS; + p_sP.rG *= p_rS; + p_sP.rB *= p_rS; + p_sP.rA *= p_rS; + + return p_sP; +} + +inline mmPixel32 operator / (mmPixel32 p_sP, mmReal const p_rS) { + p_sP.rR /= p_rS; + p_sP.rG /= p_rS; + p_sP.rB /= p_rS; + p_sP.rA /= p_rS; + + return p_sP; +} + +inline mmPixel32 operator *= (mmPixel32 & p_sP, mmReal const p_rS) { + p_sP.rR *= p_rS; + p_sP.rG *= p_rS; + p_sP.rB *= p_rS; + p_sP.rA *= p_rS; + + return p_sP; +} + +inline mmPixel32 operator *= (mmReal const p_rS, mmPixel32 & p_sP) { + p_sP.rR *= p_rS; + p_sP.rG *= p_rS; + p_sP.rB *= p_rS; + p_sP.rA *= p_rS; + + return p_sP; +} + +inline mmPixel32 operator /= (mmPixel32 & p_sP, mmReal const p_rS) { + p_sP.rR /= p_rS; + p_sP.rG /= p_rS; + p_sP.rB /= p_rS; + p_sP.rA /= p_rS; + + return p_sP; +} \ No newline at end of file diff --git a/proj/libcalc2d/src/mmStringUtilities.cpp b/proj/libcalc2d/src/mmStringUtilities.cpp new file mode 100644 index 0000000..71e22aa --- /dev/null +++ b/proj/libcalc2d/src/mmStringUtilities.cpp @@ -0,0 +1,376 @@ +#include + +#include + +#include + +mmString mmStringUtilities::BoolToString(bool p_bInput) +{ + if(p_bInput) + { + return mmString(L"true"); + }; + + return mmString(L"false"); +} + +mmString mmStringUtilities::MMIntToString(mmInt p_iInput, + mmInt p_iLength) +{ + wchar_t v_tcTemp[256]; + + if(p_iLength == 0) + { + swprintf(v_tcTemp,L"%d",p_iInput); + } + else + { + wchar_t v_tcTempFormat[16]; + + swprintf(v_tcTempFormat,L"%s0%dd",L"%",p_iLength); + swprintf(v_tcTemp,v_tcTempFormat,p_iInput); + }; + + return mmString(v_tcTemp); +} + +mmString mmStringUtilities::MMRealToString(mmReal p_rInput,mmInt p_iPrecision) +{ + wchar_t v_tcTemp[256]; + wchar_t v_tcTempFormat[16]; + + if(p_iPrecision >= 0) + { + swprintf(v_tcTempFormat,L"%s.%df",L"%",p_iPrecision); + } + else + { + swprintf(v_tcTempFormat,L"%sf",L"%"); + }; + + swprintf(v_tcTemp,v_tcTempFormat,p_rInput); + + return mmString(v_tcTemp); +} + +mmString mmStringUtilities::PointerToString(void* p_pInput) +{ + wchar_t v_tcTemp[256]; + + swprintf(v_tcTemp,L"%p",p_pInput); + + return mmString(v_tcTemp); +} + +mmInt mmStringUtilities::StringToMMInt(mmString p_sStr) +{ + int v_iTemp; + + swscanf(p_sStr.c_str(),L"%d",&v_iTemp); + + return v_iTemp; +} + +mmReal mmStringUtilities::StringToMMReal(mmString p_sStr) +{ + double v_rTemp; + + swscanf(p_sStr.c_str(),L"%lf",&v_rTemp); + + return v_rTemp; +} + +bool mmStringUtilities::StringToBool(mmString p_sStr) +{ + if( ( (p_sStr[0] == 't') || + (p_sStr[0] == 'T') ) && + ( (p_sStr[1] == 'r') || + (p_sStr[1] == 'R') ) && + ( (p_sStr[2] == 'u') || + (p_sStr[2] == 'U') ) && + ( (p_sStr[3] == 'e') || + (p_sStr[3] == 'E') ) ) + { + return true; + }; + + return false; +} + +/* +void mmStringUtilities::StringToUnsignedCharTable(std::string* p_psStr,unsigned char* p_psBuffer,mmInt* p_piReadCount) +{ + mmInt v_i = 0; + mmInt v_iActReadByte = 0; + mmInt v_iStringSize = static_cast(p_psStr->size()); + mmInt v_iLo,v_iHi; + + while(v_itm_year+1900, + v_psDateTimeStruc->tm_mon+1, + v_psDateTimeStruc->tm_mday, + v_psDateTimeStruc->tm_hour, + v_psDateTimeStruc->tm_min, + v_psDateTimeStruc->tm_sec); + + return mmString(v_tcTemp); +} + +mmString mmStringUtilities::MMIntToHHMMSSString(mmInt p_iInput) +{ + mmInt v_iHours = p_iInput/3600; + mmInt v_iMinutes = (p_iInput - v_iHours*3600)/60; + mmInt v_iSeconds = p_iInput - v_iHours*3600 - v_iMinutes*60; + + mmString v_sOutString = MMIntToString(v_iHours) + + mmString(L"h") + + MMIntToString(v_iMinutes,2) + + mmString(L"m") + + MMIntToString(v_iSeconds,2) + + mmString(L"s"); + + return v_sOutString; +} + +mmString mmStringUtilities::MMCharStringToMMString(const std::string p_sInputString) +{ + std::wostringstream v_sStream; + + const std::ctype& v_sCtfacet = std::use_facet< std::ctype >(v_sStream.getloc()); + + mmInt v_iCSize = p_sInputString.size(); + for(mmInt v_iC=0;v_iC& v_sCtfacet = std::use_facet< std::ctype >(v_sStream.getloc()); + + mmInt v_iCSize = p_sInputString.size(); + for(mmInt v_iC=0;v_iC mmStringUtilities::MMStringToVectorOfInt(const mmString p_sInputString) +{ + std::vector v_vOutVector; + + mmInt v_iInt,v_iStart,v_iStop; + mmInt v_iLen = p_sInputString.size(); + + v_iStart = 0; + v_iStop = -1; + while(v_iStop < v_iLen) + { + v_iStop++; + v_iStart = v_iStop; + while(v_iStop < v_iLen) + { + if(p_sInputString[v_iStop] != L' ') + { + v_iStop++; + } + else + { + break; + }; + }; + + if(v_iStop <= v_iLen) + { + mmString v_sTempInt = p_sInputString.substr(v_iStart,v_iStop-v_iStart); + + swscanf(v_sTempInt.c_str(),L"%d",&v_iInt); + v_vOutVector.push_back(v_iInt); + }; + }; + + return v_vOutVector; +} + +std::vector mmStringUtilities::MMStringToVectorOfMMString(const mmString p_sInputString) +{ + std::vector v_vOutVector; + + mmInt v_iStart,v_iStop; + mmInt v_iLen = p_sInputString.size(); + + v_iStart = 0; + v_iStop = -1; + while(v_iStop < v_iLen) + { + v_iStop++; + v_iStart = v_iStop; + while(v_iStop < v_iLen) + { + if(p_sInputString[v_iStop] != L' ') + { + v_iStop++; + } + else + { + break; + }; + }; + + if(v_iStop <= v_iLen) + { + v_vOutVector.push_back(p_sInputString.substr(v_iStart,v_iStop-v_iStart)); + }; + }; + + return v_vOutVector; +} + +mmString mmStringUtilities::MMStringToUpper(const mmString p_sInputString) +{ + mmString v_sOutString = p_sInputString; + + mmInt v_iCSize = p_sInputString.size(); + for(mmInt v_iC=0;v_iC +#include +//--------------------------------------------------------------------------- +mmXML::mmXMLNodePath::mmXMLNodePath( void ) { + Reset(); +} +//--------------------------------------------------------------------------- + +mmXML::mmXMLNodePath::mmXMLNodePath( mmString const & p_tPath ) { + AddString( p_tPath ); + Reset(); +} +//--------------------------------------------------------------------------- + +mmXML::mmXMLNodePath& mmXML::mmXMLNodePath::operator += ( mmString const & p_tPath ) { + if( ToString() == L"" ) + m_lsPath.clear(); + AddString( p_tPath ); + return *this; +} +//--------------------------------------------------------------------------- + +mmXML::mmXMLNodePath& mmXML::mmXMLNodePath::operator += ( mmXMLNodeID const & p_sNode ) { + m_lsPath.push_back( p_sNode ); + return *this; +} +//--------------------------------------------------------------------------- + +void mmXML::mmXMLNodePath::operator = ( mmString const & p_tPath ) { + m_lsPath.clear(); + AddString( p_tPath ); + Reset(); +} +//--------------------------------------------------------------------------- + +bool mmXML::mmXMLNodePath::operator == ( mmXMLNodePath const & p_sNodePath ) const { + return ( ToString() == p_sNodePath.ToString() ); +} +//--------------------------------------------------------------------------- + +mmXML::mmXMLNodePath::operator mmXMLNodeID() const { + return *m_lsiCurrent++; +} +//--------------------------------------------------------------------------- + +void mmXML::mmXMLNodePath::Reset( void ) const { + m_lsiCurrent = m_lsPath.begin(); +} +//--------------------------------------------------------------------------- + +bool mmXML::mmXMLNodePath::End( void ) const { + return ( m_lsiCurrent == m_lsPath.end() ); +} +//--------------------------------------------------------------------------- + +mmString mmXML::mmXMLNodePath::ToString( void ) const { + std::wstringstream v_sOutput; + std::list::const_iterator v_lsiLast = m_lsPath.end(); + v_lsiLast--; + for( std::list::const_iterator v_lsiI = m_lsPath.begin(); v_lsiI != m_lsPath.end(); ++v_lsiI ) { + v_sOutput << v_lsiI->tName; + if( v_lsiI->iIndex ) + v_sOutput << L"," << v_lsiI->iIndex; + if( v_lsiI != v_lsiLast ) + v_sOutput << L"/"; + } + return v_sOutput.str(); +} +//--------------------------------------------------------------------------- + +void mmXML::mmXMLNodePath::Reverse( void ) { + m_lsPath.reverse(); + Reset(); +} +//--------------------------------------------------------------------------- + +void mmXML::mmXMLNodePath::AddString( mmString const & p_usPath ) { + int v_iPosI; + mmXMLNodeID v_sNode; + + std::vector v_vcNodeNames; + Tokenize( p_usPath, L'/', v_vcNodeNames ); + for( std::vector::iterator v_vciI = v_vcNodeNames.begin(); v_vciI != v_vcNodeNames.end(); ++v_vciI ) { + if( ( v_iPosI = v_vciI->find_first_of( L"," ) ) > 0 ) { + v_sNode.iIndex = StringToMMInt( v_vciI->substr( v_iPosI+1 ) ); + v_sNode.tName = v_vciI->substr( 0, v_iPosI ); + } else { + v_sNode.iIndex = 0; + v_sNode.tName = *v_vciI; + } + m_lsPath.push_back( v_sNode ); + } +} +//--------------------------------------------------------------------------- + +void mmXML::mmXMLNodePath::Norm( void ) { + std::for_each( m_lsPath.begin(), m_lsPath.end(), MakeZero() ); +} +//--------------------------------------------------------------------------- + +bool mmXML::IsValidNodePosition( mmXMLNodePosition p_xNodePosition ) { + return ( p_xNodePosition.iGroupIndex >= 0 && p_xNodePosition.iLeafIndex >= 0 ); +} +//--------------------------------------------------------------------------- + +mmXML::mmXMLPositionedNode mmXML::CreateAutomation( mmXMLDocI * _p_xDoc, mmXMLAutoType p_eXMLAutoType ) { + mmXML::mmXMLNodeI * _v_xRootNode; + mmXML::mmXMLPositionedNode v_xPositionedRootNode; + + if( p_eXMLAutoType == mmXML::g_eXMLAutoInput ) + _p_xDoc->CreateXMLRootNode( mmImages::g_pAutoCalcXML_INParams_Node ); + else if( p_eXMLAutoType == mmXML::g_eXMLAutoOutput ) + _p_xDoc->CreateXMLRootNode( mmImages::g_pAutoCalcXML_OUTParams_Node ); + _v_xRootNode = _p_xDoc->GetXMLRootNode(); + v_xPositionedRootNode._v_xNode = _v_xRootNode; + v_xPositionedRootNode.sPosition.iGroupIndex = 0; + v_xPositionedRootNode.sPosition.iLeafIndex = 1; + + return v_xPositionedRootNode; +} +//---------------------------------------------------------------------------------- + +mmXML::mmXMLPositionedNode mmXML::CreateAutomationInput( mmXMLDocI * _p_xDoc ) { + return CreateAutomation( _p_xDoc, mmXML::g_eXMLAutoInput ); +} +//---------------------------------------------------------------------------------- + +mmXML::mmXMLPositionedNode mmXML::CreateAutomationOutput( mmXMLDocI * _p_xDoc ) { + return CreateAutomation( _p_xDoc, mmXML::g_eXMLAutoOutput ); +} +//---------------------------------------------------------------------------------- + +mmXML::mmXMLNodePosition mmXML::AddParam( mmXMLPositionedNode * _p_xPositionedRootNode, mmString p_tName, mmXMLDataType p_eType, void * _p_DefaultValue ) { + mmXML::mmXMLNodePosition v_xOutputP; + + v_xOutputP = AddParam( _p_xPositionedRootNode, p_tName, p_eType, mmXML::ConvertToString( p_eType, _p_DefaultValue ) ); + + return v_xOutputP; +} +//---------------------------------------------------------------------------------- + +mmXML::mmXMLNodePosition mmXML::AddParam( mmXML::mmXMLPositionedNode * _p_xPositionedRootNode, mmString p_tName, mmXML::mmXMLDataType p_eType, mmString p_tDefaultValue ) { + mmXML::mmXMLNodeI * _v_xParamNode, * _v_xNode, * _v_xRootNode; + mmXML::mmXMLNodePosition v_xParamPosition; + mmString v_tType; + + if( ( v_tType = GetTypeTransition( p_eType ) ) == L"" ) { + v_xParamPosition.iLeafIndex = -1; + v_xParamPosition.iGroupIndex = -1; + return v_xParamPosition; + } + + _v_xRootNode = _p_xPositionedRootNode->_v_xNode; + _v_xParamNode = _v_xRootNode->AddChild( mmImages::g_pAutoCalcXML_Params_Param_Node ); + _v_xNode = _v_xParamNode->AddChild( mmImages::g_pAutoCalcXML_Params_ParamName_Node ); + _v_xNode->SetText( p_tName ); + _v_xNode = _v_xParamNode->AddChild( mmImages::g_pAutoCalcXML_Params_ParamType_Node ); + _v_xNode->SetText( v_tType ); + _v_xNode = _v_xParamNode->AddChild( mmImages::g_pAutoCalcXML_Params_ParamValue_Node ); + _v_xNode->SetText( p_tDefaultValue ); + + v_xParamPosition.iLeafIndex = _p_xPositionedRootNode->sPosition.iGroupIndex++; + v_xParamPosition.iGroupIndex = 0; + + return v_xParamPosition; +} +//---------------------------------------------------------------------------------- + +void mmXML::UpdateOutputParam( mmImages::mmImagesCalculationMethodI::sCalculationAutomationParams * _p_sAutomationParams, mmXML::mmXMLNodePosition p_xNodePosition, void * _p_OutputValue ) { + mmXML::mmXMLNodeI * _v_xRootNode; + mmXML::mmXMLDocI * _v_xDoc; + mmString v_tOutputValue; + + _v_xDoc = mmInterfaceInitializers::CreateXMLDocument( NULL ); + _v_xDoc->ParseXMLBuffer( _p_sAutomationParams->sOutParams ); + _v_xRootNode = _v_xDoc->GetXMLRootNode(); + v_tOutputValue = mmXML::ConvertToString( mmXML::GetTypeTransition( _v_xRootNode->GetChild( p_xNodePosition.iLeafIndex )->FindChild( mmImages::g_pAutoCalcXML_Params_ParamType_Node )->GetText() ), _p_OutputValue ); + _v_xRootNode->GetChild( p_xNodePosition.iLeafIndex )->FindChild( mmImages::g_pAutoCalcXML_Params_ParamValue_Node )->SetText( v_tOutputValue ); + CopyOutputParams( _v_xDoc, _p_sAutomationParams ); + + delete _v_xDoc; +} +//---------------------------------------------------------------------------------- + +void mmXML::UpdateOutputParam( mmImages::mmImagesCalculationMethodI::sCalculationAutomationParams * _p_sAutomationParams, mmXML::mmXMLNodePosition p_xNodePosition, mmString p_tOutputValue ) { + mmXML::mmXMLNodeI * _v_xRootNode; + mmXML::mmXMLDocI * _v_xDoc; + + _v_xDoc = mmInterfaceInitializers::CreateXMLDocument( NULL ); + _v_xDoc->ParseXMLBuffer( _p_sAutomationParams->sOutParams ); + _v_xRootNode = _v_xDoc->GetXMLRootNode(); + _v_xRootNode->GetChild( p_xNodePosition.iLeafIndex )->FindChild( mmImages::g_pAutoCalcXML_Params_ParamValue_Node )->SetText( p_tOutputValue ); + CopyOutputParams( _v_xDoc, _p_sAutomationParams ); + + delete _v_xDoc; +} +//---------------------------------------------------------------------------------- + +void mmXML::CopyInputParams( mmXML::mmXMLDocI * _p_xDoc, mmImages::mmImagesCalculationMethodI::sCalculationAutomationParams * _p_sAutomationParams ) { + mmString v_tInParams = _p_xDoc->SaveToXMLBuffer(); + mmInt v_iStrSize = v_tInParams.copy( _p_sAutomationParams->sInParams, INOUT_PARAMS_SIZE, 0 ); + _p_sAutomationParams->sInParams[ v_iStrSize ] = 0; +} +//---------------------------------------------------------------------------------- + +void mmXML::CopyOutputParams( mmXML::mmXMLDocI * _p_xDoc, mmImages::mmImagesCalculationMethodI::sCalculationAutomationParams * _p_sAutomationParams ) { + mmString v_tOutParams = _p_xDoc->SaveToXMLBuffer(); + mmInt v_iStrSize = v_tOutParams.copy( _p_sAutomationParams->sOutParams, INOUT_PARAMS_SIZE, 0 ); + _p_sAutomationParams->sOutParams[ v_iStrSize ] = 0; +} +//---------------------------------------------------------------------------------- + +bool mmXML::SetValueByName( mmXML::mmXMLDocI * _p_xDoc, mmString p_tParamName, void * _p_InputPointer ) { + mmXML::mmXMLNodeI * _v_xRootNode, * _v_xGroupNode, * _v_sValueNode; + mmString v_tType, v_tValue, v_tTypeNodeName, v_tValueNodeName, v_tMainNodeName, v_tNameNodeName; + + _v_xRootNode = _p_xDoc->GetXMLRootNode(); + + _v_xGroupNode = _v_xRootNode; + v_tMainNodeName = mmImages::g_pAutoCalcXML_Params_Param_Node; + v_tTypeNodeName = mmImages::g_pAutoCalcXML_Params_ParamType_Node; + v_tValueNodeName = mmImages::g_pAutoCalcXML_Params_ParamValue_Node; + v_tNameNodeName = mmImages::g_pAutoCalcXML_Params_ParamName_Node; + + std::vector v_vcChildNodes = _v_xGroupNode->GetChilds(); + for( std::vector::iterator v_vciI = v_vcChildNodes.begin(); v_vciI != v_vcChildNodes.end(); ++v_vciI ) { + if( (*v_vciI)->FindChild( v_tNameNodeName )->GetText() == p_tParamName ) { + _v_sValueNode = (*v_vciI)->FindChild( v_tValueNodeName ); + v_tType = (*v_vciI)->FindChild( v_tTypeNodeName )->GetText(); + break; + } + } + if( _v_sValueNode == NULL ) + return false; + + _v_sValueNode->SetText( ConvertToString( GetTypeTransition( v_tType ), _p_InputPointer ) ); + + return true; +} +//---------------------------------------------------------------------------------- + +bool mmXML::SetValue( mmXML::mmXMLDocI * _p_xDoc, mmXML::mmXMLNodePosition p_xNodePosition, void * _p_InputPointer ) { + mmXML::mmXMLNodeI * _v_xRootNode, * _v_sNode; + mmString v_tType, v_tValue; + + if( ! IsValidNodePosition( p_xNodePosition ) ) + return false; + + _v_xRootNode = _p_xDoc->GetXMLRootNode(); + + _v_sNode = _v_xRootNode->GetChild( p_xNodePosition.iLeafIndex )->FindChild( mmImages::g_pAutoCalcXML_Params_ParamValue_Node ); + v_tType = _v_xRootNode->GetChild( p_xNodePosition.iLeafIndex )->FindChild( mmImages::g_pAutoCalcXML_Params_ParamType_Node )->GetText(); + + _v_sNode->SetText( ConvertToString( GetTypeTransition( v_tType ), _p_InputPointer ) ); + + return true; +} +//---------------------------------------------------------------------------------- + +bool mmXML::GetValueByName( mmXML::mmXMLDocI * _p_xDoc, mmString p_tParamName, void * _p_OutputPointer ) { + mmXML::mmXMLNodeI * _v_xRootNode=NULL, * _v_xGroupNode=NULL, * _v_sNode=NULL, * _v_sValueNode=NULL; + mmString v_tType, v_tValue, v_tTypeNodeName, v_tValueNodeName, v_tMainNodeName, v_tNameNodeName; + mmInt * _v_iOutput; + mmReal * _v_rOutput; + bool * _v_bOutput; + mmString * _v_tOutput; + + _v_xRootNode = _p_xDoc->GetXMLRootNode(); + _v_xGroupNode = _v_xRootNode; + + v_tMainNodeName = mmImages::g_pAutoCalcXML_Params_Param_Node; + v_tTypeNodeName = mmImages::g_pAutoCalcXML_Params_ParamType_Node; + v_tValueNodeName = mmImages::g_pAutoCalcXML_Params_ParamValue_Node; + v_tNameNodeName = mmImages::g_pAutoCalcXML_Params_ParamName_Node; + + std::vector v_vcChildNodes = _v_xGroupNode->GetChilds(); + for( std::vector::iterator v_vciI = v_vcChildNodes.begin(); v_vciI != v_vcChildNodes.end(); ++v_vciI ) { + if( ( _v_sNode = (*v_vciI)->FindChild( v_tNameNodeName ) ) != NULL && _v_sNode->GetText() == p_tParamName ) { + v_tValue = (*v_vciI)->FindChild( v_tValueNodeName )->GetText(); + if( (*v_vciI)->FindChild( L"ProperType" ) != NULL ) + v_tType = (*v_vciI)->FindChild( L"ProperType" )->GetText(); + else + v_tType = (*v_vciI)->FindChild( v_tTypeNodeName )->GetText(); + break; + } + } + + switch( GetTypeTransition( v_tType ) ) { + case g_eXMLReal: + _v_rOutput = static_cast( _p_OutputPointer ); + *_v_rOutput = mmStringUtilities::StringToMMReal( v_tValue ); + break; + case g_eXMLInt: + _v_iOutput = static_cast( _p_OutputPointer ); + *_v_iOutput = mmStringUtilities::StringToMMInt( v_tValue ); + break; + case g_eXMLString: + case g_eXMLImageName: + case g_eXMLDataLayerName: + _v_tOutput = static_cast( _p_OutputPointer ); + *_v_tOutput = v_tValue; + break; + case g_eXMLBool: + _v_bOutput = static_cast( _p_OutputPointer ); + *_v_bOutput = mmStringUtilities::StringToBool( v_tValue ); + break; + default: + return false; + } + + return true; +} +//---------------------------------------------------------------------------------- + +bool mmXML::GetValue( mmXML::mmXMLDocI * _p_xDoc, mmXML::mmXMLNodePosition p_xNodePosition, void * _p_OutputPointer ) { + mmXML::mmXMLNodeI * _v_xRootNode; + mmString v_tType, v_tValue; + mmInt * _v_iOutput; + mmReal * _v_rOutput; + bool * _v_bOutput; + mmString * _v_tOutput; + + if( ! IsValidNodePosition( p_xNodePosition ) ) + return false; + + _v_xRootNode = _p_xDoc->GetXMLRootNode(); + + v_tValue = _v_xRootNode->GetChild( p_xNodePosition.iLeafIndex )->FindChild( mmImages::g_pAutoCalcXML_Params_ParamValue_Node )->GetText(); + v_tType = _v_xRootNode->GetChild( p_xNodePosition.iLeafIndex )->FindChild( mmImages::g_pAutoCalcXML_Params_ParamType_Node )->GetText(); + + switch( GetTypeTransition( v_tType ) ) { + case g_eXMLReal: + _v_rOutput = static_cast( _p_OutputPointer ); + *_v_rOutput = mmStringUtilities::StringToMMReal( v_tValue ); + break; + case g_eXMLInt: + _v_iOutput = static_cast( _p_OutputPointer ); + *_v_iOutput = mmStringUtilities::StringToMMInt( v_tValue ); + break; + case g_eXMLString: + case g_eXMLImageName: + case g_eXMLDataLayerName: + _v_tOutput = static_cast( _p_OutputPointer ); + *_v_tOutput = v_tValue; + break; + case g_eXMLBool: + _v_bOutput = static_cast( _p_OutputPointer ); + *_v_bOutput = mmStringUtilities::StringToBool( v_tValue ); + break; + default: + return false; + } + + return true; +} +//---------------------------------------------------------------------------------- + +mmXML::mmXMLDataType mmXML::GetTypeTransition( mmString p_tType ) { + if( p_tType.compare( mmImages::g_pAutoCalcXML_Params_ParamType_IntegerValue ) == 0 ) + return g_eXMLInt; + else if( p_tType.compare( mmImages::g_pAutoCalcXML_Params_ParamType_RealValue ) == 0 ) + return g_eXMLReal; + else if( p_tType.compare( mmImages::g_pAutoCalcXML_Params_ParamType_ImageName ) == 0 ) + return g_eXMLImageName; + else if( p_tType.compare( mmImages::g_pAutoCalcXML_Params_ParamType_DataLayerName ) == 0 ) + return g_eXMLDataLayerName; + else if( p_tType.compare( mmImages::g_pAutoCalcXML_Params_ParamType_BoolValue ) == 0 ) + return g_eXMLBool; + else if( p_tType.compare( mmImages::g_pAutoCalcXML_Params_ParamType_String ) == 0 ) + return g_eXMLString; + return g_eXMLUnknownDataType; +} +//---------------------------------------------------------------------------------- + +mmString mmXML::GetTypeTransition( mmXML::mmXMLDataType p_eDataType ) { + switch( p_eDataType ) { + case mmXML::g_eXMLReal: + return mmImages::g_pAutoCalcXML_Params_ParamType_RealValue; + case mmXML::g_eXMLInt: + return mmImages::g_pAutoCalcXML_Params_ParamType_IntegerValue; + case mmXML::g_eXMLImageName: + return mmImages::g_pAutoCalcXML_Params_ParamType_ImageName; + case mmXML::g_eXMLDataLayerName: + return mmImages::g_pAutoCalcXML_Params_ParamType_DataLayerName; + case mmXML::g_eXMLBool: + return mmImages::g_pAutoCalcXML_Params_ParamType_BoolValue; + case mmXML::g_eXMLString: + return mmImages::g_pAutoCalcXML_Params_ParamType_String; + default: + return L""; + } +} +//---------------------------------------------------------------------------------- + +mmString mmXML::ConvertToString( mmXML::mmXMLDataType p_eType, void * _p_Data ) { + if( _p_Data != NULL ) + switch( p_eType ) { + case g_eXMLInt: + return mmStringUtilities::MMIntToString( *static_cast( _p_Data ) ); + case g_eXMLReal: + return mmStringUtilities::MMRealToString( *static_cast( _p_Data ) ); + case g_eXMLString: + case g_eXMLImageName: + case g_eXMLDataLayerName: + return *static_cast( _p_Data ); + case g_eXMLBool: + return mmStringUtilities::BoolToString( *static_cast( _p_Data ) ); + default: + return L""; + } + else + return L""; +} +//---------------------------------------------------------------------------------- + +mmXML::mmXMLNodeI* mmXML::GetNodeAt( mmXMLNodeI* _p_sRootNode, mmXMLNodePath const & p_sNodePath, bool p_bCreateNode ) { + mmXMLNodeI* _v_sXMLNode = _p_sRootNode, *_v_sTmpNode; + mmXMLNodePath::mmXMLNodeID v_sNode; + if( p_sNodePath.ToString() == L"" ) + return _p_sRootNode; + p_sNodePath.Reset(); + while( ! p_sNodePath.End() ) { + v_sNode = p_sNodePath; + if( ( _v_sTmpNode = _v_sXMLNode->FindChild( v_sNode.tName ) ) != NULL ) + _v_sXMLNode = _v_sTmpNode; + else + if( p_bCreateNode ) + _v_sXMLNode = _v_sXMLNode->AddChild( v_sNode.tName ); + else + return NULL; + + while( v_sNode.iIndex ) + if( ( _v_sTmpNode = _v_sXMLNode->GetNextSibling() ) != NULL ) + if( _v_sTmpNode->GetName() == v_sNode.tName ) { + _v_sXMLNode = _v_sTmpNode; + --v_sNode.iIndex; + } + else + if( p_bCreateNode ) + _v_sXMLNode = _v_sXMLNode->GetParent()->AddChild( v_sNode.tName ); + else + return NULL; + } + return _v_sXMLNode; +} +//--------------------------------------------------------------------------- + diff --git a/proj/libcalc2d/src/synchronize/mmSynchronizeWindowsImpl.cpp b/proj/libcalc2d/src/synchronize/mmSynchronizeWindowsImpl.cpp new file mode 100644 index 0000000..2d677ec --- /dev/null +++ b/proj/libcalc2d/src/synchronize/mmSynchronizeWindowsImpl.cpp @@ -0,0 +1,292 @@ +#include + +#include +#include + +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +//// mmSynchronize::mmExclusiveLockCSWindows +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +mmSynchronize::mmExclusiveLockCSWindows::mmExclusiveLockCSWindows(mmLog::mmLogReceiverI *p_psLogReceiver): + mmLog::mmLogSender(L"mmSynchronize::mmExclusiveLockCSWindows",p_psLogReceiver) +{ + SendLogMessage(mmLog::debug,mmString(L"Start Constructor")); + + ::InitializeCriticalSectionAndSpinCount(&m_sCriticalSection, 300); + + SendLogMessage(mmLog::debug,mmString(L"End Constructor")); +} + +mmSynchronize::mmExclusiveLockCSWindows::~mmExclusiveLockCSWindows() +{ + SendLogMessage(mmLog::debug,mmString(L"Start Destructor")); + + if(m_sCriticalSection.LockCount > -1) + { + SendLogMessage(mmLog::critical,mmString(L"Destructor Locked")); + + throw mmError(mmeExclusiveLockLocked); + }; + + ::DeleteCriticalSection(&m_sCriticalSection); + + SendLogMessage(mmLog::debug,mmString(L"End Destructor")); +} + +bool mmSynchronize::mmExclusiveLockCSWindows::TryLock(void) +{ + bool v_bIsLocked = true; + + SendLogMessage(mmLog::debug,mmString(L"Start TryLock")); + + if(::TryEnterCriticalSection(&m_sCriticalSection) == 0) + { + v_bIsLocked = false; + }; + + SendLogMessage(mmLog::debug,mmString(L"End TryLock Locked=") + mmStringUtilities::BoolToString(v_bIsLocked)); + + return v_bIsLocked; +} + +void mmSynchronize::mmExclusiveLockCSWindows::Lock(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start Lock")); + + ::EnterCriticalSection(&m_sCriticalSection); + + SendLogMessage(mmLog::debug,mmString(L"End Lock")); +} + +void mmSynchronize::mmExclusiveLockCSWindows::Unlock(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start Unlock")); + + ::LeaveCriticalSection(&m_sCriticalSection); + + SendLogMessage(mmLog::debug,mmString(L"End Unlock")); +} + + +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +//// mmSynchronize::mmReadWriteLockCSWindows +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +mmSynchronize::mmReadWriteLockCSWindows::mmReadWriteLockCSWindows(mmLog::mmLogReceiverI *p_psLogReceiver): + mmLog::mmLogSender(L"mmSynchronize::mmReadWriteLockCSWindows",p_psLogReceiver) +{ + SendLogMessage(mmLog::debug,mmString(L"Start Constructor")); + + try + { + m_psExclusiveLock = mmInterfaceInitializers::CreateExclusiveLock(p_psLogReceiver); + } + catch(mmError &v_sErr) + { + if(v_sErr.GetErrorCode() == mmeBadAlloc) + { + SendLogMessage(mmLog::critical,mmString(L"Constructor ErrorAllocationMemory")); + }; + + throw; + }; + + m_iReadWriteCount = 0; + m_bWaitForWriteLock = false; + + SendLogMessage(mmLog::debug,mmString(L"End Constructor PtrToExclusiveLock=") + mmStringUtilities::PointerToString(m_psExclusiveLock)); +} + +mmSynchronize::mmReadWriteLockCSWindows::~mmReadWriteLockCSWindows() +{ + SendLogMessage(mmLog::debug,mmString(L"Start Destructor")); + + delete m_psExclusiveLock; + + if(m_iReadWriteCount != 0) + { + SendLogMessage(mmLog::critical,mmString(L"Destructor BadEndConditions RWCount=") + + mmStringUtilities::MMIntToString(m_iReadWriteCount)); + + throw mmError(mmeReadWriteLockBadEndLockCount); + }; + if(m_bWaitForWriteLock) + { + SendLogMessage(mmLog::critical,mmString(L"Destructor BadEndConditions WaitForWrite=") + + mmStringUtilities::BoolToString(m_bWaitForWriteLock)); + + throw mmError(mmeReadWriteLockWaitForWrite); + }; + + SendLogMessage(mmLog::debug,mmString(L"End Destructor")); +} + +bool mmSynchronize::mmReadWriteLockCSWindows::TryLockForRead(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start TryLockForRead")); + + bool v_bIsLocked = false; + + m_psExclusiveLock->Lock(); + if( (m_iReadWriteCount >= 0) && (!m_bWaitForWriteLock) ) + { + m_iReadWriteCount++; + v_bIsLocked = true; + }; + m_psExclusiveLock->Unlock(); + + SendLogMessage(mmLog::debug,mmString(L"End TryLockForRead LockCount=") + + mmStringUtilities::MMIntToString(m_iReadWriteCount) + + mmString(L" Locked=") + + mmStringUtilities::BoolToString(v_bIsLocked)); + + return v_bIsLocked; +} + +void mmSynchronize::mmReadWriteLockCSWindows::LockForRead(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start LockForRead")); + + bool v_bIsLocked = false; + + while(!v_bIsLocked) + { + if(TryLockForRead()) + { + v_bIsLocked = true; + } + else + { + Sleep(1); + }; + }; + + SendLogMessage(mmLog::debug,mmString(L"End LockForRead LockCount=") + + mmStringUtilities::MMIntToString(m_iReadWriteCount)); +} + +void mmSynchronize::mmReadWriteLockCSWindows::UnlockFromRead(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start UnlockFromRead")); + + bool v_bIsReadWriteLockDeSynchronized = false; + + m_psExclusiveLock->Lock(); + if(m_iReadWriteCount > 0) + { + m_iReadWriteCount--; + } + else + { + v_bIsReadWriteLockDeSynchronized = true; + }; + m_psExclusiveLock->Unlock(); + + if(v_bIsReadWriteLockDeSynchronized) + { + SendLogMessage(mmLog::critical,mmString(L"UnlockFromRead TooManyUnlocksFromRead")); + + throw mmError(mmeReadWriteLockReadUnlocked); + }; + + SendLogMessage(mmLog::debug,mmString(L"End UnlockFromRead LockCount=") + + mmStringUtilities::MMIntToString(m_iReadWriteCount)); +} + +bool mmSynchronize::mmReadWriteLockCSWindows::TryLockForWrite(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start TryLockForWrite")); + + bool v_bIsLocked = false; + + m_psExclusiveLock->Lock(); + if(m_iReadWriteCount == 0) + { + m_iReadWriteCount = -1; + v_bIsLocked = true; + }; + m_psExclusiveLock->Unlock(); + + SendLogMessage(mmLog::debug,mmString(L"End TryLockForWrite LockCount=") + + mmStringUtilities::MMIntToString(m_iReadWriteCount) + + mmString(L" Locked=") + + mmStringUtilities::BoolToString(v_bIsLocked)); + + return v_bIsLocked; +} + +void mmSynchronize::mmReadWriteLockCSWindows::LockForWrite(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start LockForWrite")); + + bool v_bIsLocked = false; + + while(!v_bIsLocked) + { + m_psExclusiveLock->Lock(); + if(m_iReadWriteCount == 0) + { + m_iReadWriteCount = -1; + v_bIsLocked = true; + } + else + { + if( (m_iReadWriteCount > 0) && (!m_bWaitForWriteLock) ) + { + m_bWaitForWriteLock = true; + }; + }; + m_psExclusiveLock->Unlock(); + + if(!v_bIsLocked) + { + Sleep(1); + }; + }; + + SendLogMessage(mmLog::debug,mmString(L"End LockForWrite LockCount=") + + mmStringUtilities::MMIntToString(m_iReadWriteCount)); +} + +void mmSynchronize::mmReadWriteLockCSWindows::UnlockFromWrite(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start UnlockFromWrite")); + + bool v_bIsReadWriteLockDeSynchronized = false; + + m_psExclusiveLock->Lock(); + if(m_iReadWriteCount == -1) + { + m_iReadWriteCount = 0; + m_bWaitForWriteLock = false; + } + else + { + v_bIsReadWriteLockDeSynchronized = true; + }; + m_psExclusiveLock->Unlock(); + + if(v_bIsReadWriteLockDeSynchronized) + { + SendLogMessage(mmLog::critical,mmString(L"UnlockFromWrite TooManyUnlocksFromWrite")); + + throw mmError(mmeReadWriteLockWriteUnlocked); + }; + + SendLogMessage(mmLog::debug,mmString(L"End UnlockFromWrite LockCount=") + + mmStringUtilities::MMIntToString(m_iReadWriteCount)); +} + +mmInt mmSynchronize::mmReadWriteLockCSWindows::GetLockState(bool* p_pbWaitForWrite) +{ + SendLogMessage(mmLog::debug,mmString(L"Start GetLockState")); + + mmInt v_iLockState = m_iReadWriteCount; + *p_pbWaitForWrite = m_bWaitForWriteLock; + + this->SendLogMessage(mmLog::debug,mmString(L"End GetLockState")); + + return v_iLockState; +} diff --git a/proj/libcalc2d/src/thread/mmThreadWindowsImpl.cpp b/proj/libcalc2d/src/thread/mmThreadWindowsImpl.cpp new file mode 100644 index 0000000..a2313fc --- /dev/null +++ b/proj/libcalc2d/src/thread/mmThreadWindowsImpl.cpp @@ -0,0 +1,310 @@ +#include + +#include + +#include +#include +#include + +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +//// mmThreads::mmThreadWindows +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +mmThread::mmThreadWindows::mmThreadWindows(mmLog::mmLogReceiverI *p_psLogReceiver): + mmLog::mmLogSender(L"mmThread::mmThreadWindows",p_psLogReceiver) +{ + mmInt v_iTemp; + + SendLogMessage(mmLog::debug,mmString(L"Start Constructor")); + + try + { + //m_psExclusiveLock = mmInterfaceInitializers::CreateExclusiveLock(p_psLogReceiver); + m_psExclusiveLock = mmInterfaceInitializers::CreateExclusiveLock(NULL); + } + catch(mmError &v_sErr) + { + if(v_sErr.GetErrorCode() == mmeBadAlloc) + { + SendLogMessage(mmLog::critical,mmString(L"Constructor ErrorAllocationMemory")); + }; + + throw v_sErr; + }; + + m_hWinThreadHandle = CreateThread(NULL,0,ThreadRedirectFunction,this,CREATE_SUSPENDED,reinterpret_cast(&v_iTemp)); + //SetThreadPriority(m_hWinThreadHandle,THREAD_PRIORITY_HIGHEST); + + // jeśli utworzenie nowego wątka się nie powiedzie + if(m_hWinThreadHandle == NULL) + { + delete m_psExclusiveLock; + + SendLogMessage(mmLog::critical,mmString(L"Constructor CreationThreadError")); + + throw mmError(mmeThreadCreateThreadError); + }; + + m_eThreadStatus = created; + SendLogMessage(mmLog::debug,mmString(L"Constructor Status=created")); + + m_psThreadExecutionClass = NULL; + + SendLogMessage(mmLog::debug,mmString(L"End Constructor PtrToExclusiveLock=") + + mmStringUtilities::PointerToString(m_psExclusiveLock) + + mmString(L"; ThreadID=") + + mmStringUtilities::MMIntToString(v_iTemp)); +} + +mmThread::mmThreadWindows::~mmThreadWindows() +{ + SendLogMessage(mmLog::debug,mmString(L"Start Destructor")); + + // zatrzymuję wątek + this->Stop(); + + if(WaitForSingleObject(m_hWinThreadHandle,INFINITE) != WAIT_OBJECT_0) + { + SendLogMessage(mmLog::critical,mmString(L"Destructor BadStateOfThread")); + }; + + CloseHandle(m_hWinThreadHandle); + + delete m_psExclusiveLock; + + SendLogMessage(mmLog::debug,mmString(L"End Destructor")); +} + +DWORD WINAPI mmThread::mmThreadWindows::ThreadRedirectFunction(LPVOID p_pThreadClassPointer) +{ + mmThread::mmThreadWindows* v_pThreadWindows = reinterpret_cast(p_pThreadClassPointer); + + v_pThreadWindows->ThreadExecute(); + + return 0; +} + +void mmThread::mmThreadWindows::ThreadExecute(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start ThreadExecute")); + + + CoInitializeEx(NULL,COINIT_MULTITHREADED); + bool v_bIsCalculated = m_psThreadExecutionClass->Execute(); + CoUninitialize(); + + m_psExclusiveLock->Lock(); + if(v_bIsCalculated) + { + m_eThreadStatus = finished; + SendLogMessage(mmLog::debug,mmString(L"ThreadExecute Status=finished")); + } + else + { + m_eThreadStatus = stopped; + SendLogMessage(mmLog::debug,mmString(L"ThreadExecute Status=stopped")); + }; + + // to wywołanie jest w sekcji krytycznej dlatego, że często po tej metodzie + // wywołuje się destruktora i wtedy to wywołanie jest już w nie istniejącym + // obiekcie + SendLogMessage(mmLog::debug,mmString(L"End ThreadExecute")); + + m_psExclusiveLock->Unlock(); +} + +void mmThread::mmThreadWindows::RegisterThreadExecutionClass(mmThreadExecutionI* p_psThreadExecutionClass) +{ + SendLogMessage(mmLog::debug,mmString(L"Start RegisterThreadExecutionClass")); + + m_psExclusiveLock->Lock(); + try + { + if( (m_eThreadStatus == created) || (m_eThreadStatus == initialized) ) + { + m_psThreadExecutionClass = p_psThreadExecutionClass; + if(m_eThreadStatus != initialized) + { + m_eThreadStatus = initialized; + SendLogMessage(mmLog::debug,mmString(L"RegisterThreadExecutionClass Status=initialized")); + }; + + SendLogMessage(mmLog::debug,mmString(L"RegisterThreadExecutionClass Registered PtrToExecutionObject=") + + mmStringUtilities::PointerToString(m_psThreadExecutionClass)); + } + else + { + SendLogMessage(mmLog::critical,mmString(L"RegisterThreadExecutionClass CantRegister")); + + throw mmError(mmeThreadCantRegisterExecutionClass); + }; + } + catch(mmError &v_sErr) + { + m_psExclusiveLock->Unlock(); + + throw v_sErr; + }; + + m_psExclusiveLock->Unlock(); + + SendLogMessage(mmLog::debug,mmString(L"End RegisterThreadExecutionClass")); +} + +void mmThread::mmThreadWindows::Run(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start Run")); + + m_psExclusiveLock->Lock(); + try + { + // tylko kiedy wątek jest w stanie initialized może być wywoływana metoda Run + if(this->m_eThreadStatus == initialized) + { + if(ResumeThread(m_hWinThreadHandle) == 1) + { + m_eThreadStatus = running; + SendLogMessage(mmLog::debug,mmString(L"Run Status=running")); + } + else + { + SendLogMessage(mmLog::critical,mmString(L"Run ResumeThreadError")); + + throw mmError(mmeThreadResumeError); + }; + } + else + { + SendLogMessage(mmLog::critical,mmString(L"Run BadThreadStateError")); + + throw mmError(mmeThreadBadThreadState); + }; + } + catch(mmError &v_sErr) + { + m_psExclusiveLock->Unlock(); + + throw v_sErr; + }; + + m_psExclusiveLock->Unlock(); + + SendLogMessage(mmLog::debug,mmString(L"End Run")); +} + +void mmThread::mmThreadWindows::Stop(void) +{ + SendLogMessage(mmLog::debug,mmString(L"Start Stop")); + + bool bIsCreatedInitializedStoppedOrFinished = false; + + while(!bIsCreatedInitializedStoppedOrFinished) + { + m_psExclusiveLock->Lock(); + // w przypadku: kiedy jest uruchomiony ale nie wiadomo czy już liczy + if(m_eThreadStatus == running) + { + if(m_psThreadExecutionClass->IsExecuting()) + { + m_eThreadStatus = stopping; + SendLogMessage(mmLog::debug,mmString(L"Stop Status=stopping")); + + // informuję o zatrzymaniu wątka klasę liczącą + m_psThreadExecutionClass->StopExecution(); + }; + } + else + { + // w innych + if(m_eThreadStatus != stopping) + { + bIsCreatedInitializedStoppedOrFinished = true; + }; + }; + m_psExclusiveLock->Unlock(); + + if(!bIsCreatedInitializedStoppedOrFinished) + { + Sleep(1); + }; + }; + + SendLogMessage(mmLog::debug,mmString(L"End Stop")); +} + +mmThread::mmThreadI::eStatus mmThread::mmThreadWindows::GetStatus(void) +{ +// SendLogMessage(mmLog::debug,mmString(L"Start GetStatus")); + + eStatus v_eTempStat; + + m_psExclusiveLock->Lock(); + v_eTempStat = m_eThreadStatus; + m_psExclusiveLock->Unlock(); + + mmString v_sStatusString; + + switch(v_eTempStat) + { + case created: + { + v_sStatusString = L"created"; + }; + break; + case initialized: + { + v_sStatusString = L"initialized"; + }; + break; + case running: + { + v_sStatusString = L"running"; + }; + break; + case stopping: + { + v_sStatusString = L"stopping"; + }; + break; + case stopped: + { + v_sStatusString = L"stopped"; + }; + break; + case finished: + { + v_sStatusString = L"finished"; + }; + break; + default: + { + SendLogMessage(mmLog::critical,mmString(L"GetStatus UnknownThreadState")); + + throw mmError(mmeThreadUnknownThreadState); + }; + }; + + SendLogMessage(mmLog::debug,mmString(L"End GetStatus Status=")+ + v_sStatusString); + + return v_eTempStat; +} + +mmReal mmThread::mmThreadWindows::GetProgress(void) +{ + mmReal v_rProgress = -1.0; + + SendLogMessage(mmLog::debug,mmString(L"Start GetProgress")); + + m_psExclusiveLock->Lock(); + if(m_eThreadStatus == running) + { + v_rProgress = m_psThreadExecutionClass->GetProgress(); + }; + m_psExclusiveLock->Unlock(); + + SendLogMessage(mmLog::debug,mmString(L"End GetProgress")); + + return v_rProgress; +} diff --git a/proj/libcalc2d/src/windows/mmDllSupport.cpp b/proj/libcalc2d/src/windows/mmDllSupport.cpp new file mode 100644 index 0000000..0c773c1 --- /dev/null +++ b/proj/libcalc2d/src/windows/mmDllSupport.cpp @@ -0,0 +1,59 @@ +#include + +#include +#include +#pragma comment ( lib, "Imagehlp.lib" ) + +#include + + +mmString mmDLLSupport::FindSymbolInDLLExportTable(mmString p_sDLLName, + mmString p_sName) +{ + mmString v_sFullSymbol; + + LOADED_IMAGE v_sLoadedImage; + + std::string v_sCharStringDllName = mmStringUtilities::MMStringToCharString(p_sDLLName); + std::string v_sCharStringName = mmStringUtilities::MMStringToCharString(p_sName); + + if(MapAndLoad(const_cast(v_sCharStringDllName.c_str()), + "", + &v_sLoadedImage, + TRUE, + TRUE)) + { + PIMAGE_EXPORT_DIRECTORY v_sExpDir; + v_sExpDir = (PIMAGE_EXPORT_DIRECTORY)(v_sLoadedImage.FileHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress); + if(v_sExpDir != NULL) + { + v_sExpDir = (PIMAGE_EXPORT_DIRECTORY)ImageRvaToVa(v_sLoadedImage.FileHeader, v_sLoadedImage.MappedAddress, (DWORD)v_sExpDir, 0); + + //PDWORD* v_pExpNames = (PDWORD *)ImageRvaToVa(v_sLoadedImage.FileHeader, v_sLoadedImage.MappedAddress, v_sExpDir->AddressOfNames, 0); + PDWORD v_pExpNames = (PDWORD )ImageRvaToVa(v_sLoadedImage.FileHeader, v_sLoadedImage.MappedAddress, v_sExpDir->AddressOfNames, 0); + + mmInt v_iTemp; + mmInt v_iExportSymbolCount = v_sExpDir->NumberOfNames; + for (v_iTemp=0;v_iTemp +//#endif +// uwaga - StdAfx jest specyficzny dla visuala. Po jego załączeniu nie można dać #endif zamykającego #ifndef MADMAC + +// uwaga2 - zdefiniowanie MADMAC odblokowuje logowanie i rzucanie wyjatkow +#define MADMAC +#include + +#ifndef RELEASE_PTR +#define RELEASE_PTR(x) \ + if( x != NULL ) \ + { \ + x.Release(); \ + x = NULL; \ + } +#endif + + + +#ifdef MADMAC +#include +#include +#endif +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +//// mmXML::mmXMLNodeBB +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// + + +int Is_MSXML_Node(MSXML2::IXMLDOMNodePtr pChild) +{ + + MSXML2::tagDOMNodeType v_i = ( pChild->nodeType); + // I handle only few node type other are ignored and are considered as NODE_ELEMENT + // + // Handled Node type by this wrapper: + // - NODE_ELEMENT + // - NODE_TEXT + // - NODE_CDATA_SECTION + // - NODE_PROCESSING_INSTRUCTION + + // if(pChild->nodeType == MSXML2::NODE_TEXT) return MSXML2::NODE_TEXT; + // if(pChild->nodeType == MSXML2::NODE_CDATA_SECTION) return MSXML2::NODE_CDATA_SECTION; + // if(pChild->nodeType == MSXML2::NODE_PROCESSING_INSTRUCTION ) return MSXML2::NODE_PROCESSING_INSTRUCTION; + //return HRESULT( pChild->nodeType); + // return MSXML2::NODE_ELEMENT; + return v_i; +} + +#ifdef MADMAC +mmXML::mmXMLNodeBB::mmXMLNodeBB( mmLog::mmLogReceiverI* p_psLogReceiver): +mmLog::mmLogSender(L"mmXML::mmXMLNodeBB",p_psLogReceiver) +{ + SendLogMessage(mmLog::debug,mmString(L"Start Constructor")); + + SendLogMessage(mmLog::debug,mmString(L"End Constructor")); +} +#else +mmXML::mmXMLNodeBB::mmXMLNodeBB( ) +{ + +} +#endif + +mmXML::mmXMLNodeBB::~mmXMLNodeBB() +{ + //SendLogMessage(mmLog::debug,mmString(L"Start Destructor")); + + RemoveAllChilds(); + + //SendLogMessage(mmLog::debug,mmString(L"End Destructor")); +} + +mmString mmXML::mmXMLNodeBB::GetName(void) +{ +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"Start GetName")); + + SendLogMessage(mmLog::debug,mmString(L"End GetName Name=") + + m_sNodeName); +#endif + return m_sNodeName; +} + +void mmXML::mmXMLNodeBB::SetName(mmString p_sName) +{ +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"Start SetName") + + m_sNodeName); +#endif + m_sNodeName = p_sName; +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"End SetName")); +#endif +} + +bool mmXML::mmXMLNodeBB::IsLeaf(void) +{ + bool v_bIsLeaf = true; +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"Start IsLeaf")); +#endif + if(m_sChilds.size() != 0) + { + v_bIsLeaf = false; + }; + +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"End IsLeaf Result=") + + mmStringUtilities::BoolToString(v_bIsLeaf)); +#endif + + return v_bIsLeaf; +} + +std::vector mmXML::mmXMLNodeBB::GetAttributes(void) +{ +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"Start GetAttributes")); + + SendLogMessage(mmLog::debug,mmString(L"End GetAttributes")); +#endif + return m_sAttributes; +} + +void mmXML::mmXMLNodeBB::AddAttribute(mmString p_sAttrName, + mmString p_sAttrValue) +{ +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"Start AddAttribute Name=") + + p_sAttrName + + mmString(L" Value=") + + p_sAttrValue); +#endif + mmXML::sXMLAttribute v_sAttr; + + v_sAttr.sName = p_sAttrName; + v_sAttr.sValue = p_sAttrValue; + + m_sAttributes.push_back(v_sAttr); + +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"End AddAttribute")); +#endif +} + +#ifdef MADMAC +void mmXML::mmXMLNodeBB::RemoveAttribute(mmString p_sAttrName) +#else +bool mmXML::mmXMLNodeBB::RemoveAttribute(mmString p_sAttrName) +#endif +{ +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"Start RemoveAttribute Name=") + + p_sAttrName); +#endif; + + mmInt v_i,v_iAttrCount,v_iRemovedCount; + std::vector v_sNewAttributes; + + v_iRemovedCount = 0; + v_iAttrCount = static_cast(m_sAttributes.size()); + for(v_i=0;v_i mmXML::mmXMLNodeBB::GetChilds(void) +{ +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"Start GetChilds")); + + SendLogMessage(mmLog::debug,mmString(L"End GetChilds")); +#endif + return m_sChilds; +} + +mmXML::mmXMLNodeI* mmXML::mmXMLNodeBB::AddChild(mmString p_sChildName) +{ +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"Start AddChild Name=") + + p_sChildName); + + mmXMLNodeBB* v_psNode = new mmXML::mmXMLNodeBB(GetLogReceiver()); +#else + mmXMLNodeBB* v_psNode = new mmXML::mmXMLNodeBB(); +#endif + + v_psNode->m_sNodeName = p_sChildName; + v_psNode->m_psParent = this; + m_sChilds.push_back(v_psNode); + +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"End AddChild")); +#endif + return v_psNode; +} + +void mmXML::mmXMLNodeBB::AddChildWithStructure(mmXMLNodeI* p_psChildNode) +{ +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"Start AddChildWithStructure")); + mmXMLNodeBB* v_psNode = new mmXML::mmXMLNodeBB(GetLogReceiver()); +#else + mmXMLNodeBB* v_psNode = new mmXML::mmXMLNodeBB(); +#endif + + v_psNode->m_psParent = p_psChildNode->GetParent(); + v_psNode->m_sNodeName = p_psChildNode->GetName(); + v_psNode->m_sNodeValue = p_psChildNode->GetText(); + v_psNode->m_sAttributes = p_psChildNode->GetAttributes(); + + std::vector v_vChilds = p_psChildNode->GetChilds(); + mmInt v_iChildsCount = v_vChilds.size(); + for(mmInt v_iC=0;v_iCAddChildWithStructure(v_vChilds[v_iC]); + }; + + m_sChilds.push_back(v_psNode); +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"End AddChildWithStructure")); +#endif +} + +mmXML::mmXMLNodeI* mmXML::mmXMLNodeBB::FindChild(mmString p_sChildName) +{ +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"Start FindChild Name=")+ + p_sChildName); +#endif + + mmInt v_i,v_iChildCount; + mmXML::mmXMLNodeI* v_psFoundNode = NULL; + + v_iChildCount = static_cast(m_sChilds.size()); + for(v_i=0;v_iGetName().compare(p_sChildName) == 0) +#else + if(m_sChilds[v_i]->GetName().compare(p_sChildName) == 0) +#endif + { + v_psFoundNode = m_sChilds[v_i]; + break; + }; + }; +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"End FindChild")); +#endif + return v_psFoundNode; +} + +mmXML::mmXMLNodeI* mmXML::mmXMLNodeBB::FindNextChild(mmXML::mmXMLNodeI* p_psCurrentChild, mmString p_sChildName) +{ +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"Start FindChild Name=")+ + p_sChildName); +#endif + + mmInt v_i,v_iChildCount; + mmXML::mmXMLNodeI* v_psFoundNode = NULL; + + v_iChildCount = static_cast(m_sChilds.size()); + bool v_bCurrentNodeFound = false; + + for(v_i=0;v_iGetName().compare(p_sChildName) == 0) +#else + if(m_sChilds[v_i]->GetName().compare(p_sChildName) == 0) +#endif + { + if (( v_bCurrentNodeFound == true) ) + { + v_psFoundNode = m_sChilds[v_i]; + break; + } + if ( (p_psCurrentChild == m_sChilds[ v_i ] ) && ( v_bCurrentNodeFound == false) ) + v_bCurrentNodeFound = true; + + }; + }; +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"End FindChild")); +#endif + return v_psFoundNode; +} + +#ifdef MADMAC +mmXML::mmXMLNodeI* mmXML::mmXMLNodeBB::GetChild(mmInt p_iChildIndex) +#else +mmXML::mmXMLNodeI* mmXML::mmXMLNodeBB::GetChild(mmInt p_iChildIndex) +#endif +{ +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"Start GetChild")); +#endif + + mmInt v_i,v_iChildCount; + mmXML::mmXMLNodeI* v_psFoundNode = NULL; + + v_iChildCount = static_cast(m_sChilds.size()); + for(v_i=0;v_i v_sNewChilds; + + v_iChildCount = static_cast(m_sChilds.size()); + for(v_i=0;v_i(m_sChilds.size()); + for(v_i=0;v_i v_sChildNodes = m_psParent->GetChilds(); + mmXML::mmXMLNodeI* v_psNode = NULL; + for( std::vector::iterator v_sI = v_sChildNodes.begin(); v_sI != v_sChildNodes.end()-1; ++v_sI ) { + if( *v_sI == static_cast(this) ) { + v_psNode = *(v_sI+1); + break; + } + } +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"End GetNextSibling")); +#endif + return v_psNode; +} + +mmXML::mmXMLNodeI* mmXML::mmXMLNodeBB::GetPrevSibling( void ) { +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"End GetPrevSibling")); +#endif + if( m_psParent == NULL ) + return NULL; + std::vector v_sChildNodes = m_psParent->GetChilds(); + mmXML::mmXMLNodeI* v_psNode = NULL; + for( std::vector::iterator v_sI = v_sChildNodes.begin()+1; v_sI != v_sChildNodes.end(); ++v_sI ) { + if( *v_sI == static_cast(this) ) { + v_psNode = *(v_sI-1); + break; + } + } +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"End GetPrevSibling")); +#endif + return v_psNode; +} + +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +//// mmXML::mmXMLDocBB +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +#ifdef MADMAC +mmXML::mmXMLDocBB::mmXMLDocBB(mmLog::mmLogReceiverI *p_psLogReceiver): +mmLog::mmLogSender(L"mmXML::mmXMLBB",p_psLogReceiver) +#else +mmXML::mmXMLDocBB::mmXMLDocBB() +#endif +{ +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"Start Constructor")); +#endif + //CoInitializeEx(NULL,COINIT_APARTMENTTHREADED); + m_bOLEInitialized = false; + InitializeXML(); +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"End Constructor")); +#endif +} + +mmXML::mmXMLDocBB::~mmXMLDocBB() +{ +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"Start Destructor")); +#endif + + this->Reset_XML_Document(); + m_psXMLBBDoc.Release(); + CoUninitialize(); +#ifdef MADMAC + + + SendLogMessage(mmLog::debug,mmString(L"End Destructor")); +#endif +} + +#ifdef MADMAC +void mmXML::mmXMLDocBB::ParseXMLFile(mmString p_sXMLFileName) +#else +bool mmXML::mmXMLDocBB::ParseXMLFile(mmString p_sXMLFileName) +#endif +{ +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"Start ParseXMLFile File=") + + p_sXMLFileName); +#endif + // delete XML structure + m_sRootNode.RemoveAllChilds(); + m_sRootNode.RemoveAllAttributes(); + + // load XMLDocument + + if (Load_XML_Document(p_sXMLFileName) == false) + +#ifdef MADMAC + { + + SendLogMessage(mmLog::critical,mmString(L"ParseXMLFile Error") ); + + throw mmError(mmeXMLParseError); + + }; +#else + + + return false; +#endif + + // refresh XML structure from XMLDocument + LoadNodeStructureFromXMLDocument(); +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"End ParseXMLFile")); +#else + return true; +#endif +} +#ifdef MADMAC +void mmXML::mmXMLDocBB::ParseXMLBuffer(mmString p_sXMLBuffer) +#else +bool mmXML::mmXMLDocBB::ParseXMLBuffer(mmString p_sXMLBuffer) +#endif +{ +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"Start ParseXMLBuffer")); +#endif + // delete XML structure + m_sRootNode.RemoveAllChilds(); + m_sRootNode.RemoveAllAttributes(); + + // load XMLDocument + try + { + this->Load_XML_From_Buffer(p_sXMLBuffer); + } +#ifdef MADMAC + catch(...) + { + SendLogMessage(mmLog::critical,mmString(L"ParseXMLFile Error")); + + throw mmError(mmeXMLParseError); + + } +#else + catch(...) + { + + return false; + + + }; +#endif + // refresh XML structure from XMLDocument + LoadNodeStructureFromXMLDocument(); +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"End ParseXMLBuffer")); +#else + return true; +#endif +} + +#ifdef MADMAC +void mmXML::mmXMLDocBB::SaveToXMLFile(mmString p_sXMLFileName) +#else +bool mmXML::mmXMLDocBB::SaveToXMLFile(mmString p_sXMLFileName) +#endif +{ + +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"Start SaveToXMLFile File=") + + p_sXMLFileName); +#endif + + // save XML structure into XMLDocument + SaveNodeStructureIntoXMLDocument(); + + // using XMLDocument API + mmString v_sOutString = GetXMLFormattedString(); + + // opening TXT file +#ifdef MADMAC + mmFileIO::mmTextFileWriteI* v_psTxtFile = mmInterfaceInitializers::CreateTextFileForWrite(this->GetLogReceiver()); + v_psTxtFile->Open(p_sXMLFileName,mmFileIO::trunc_for_write); + v_psTxtFile->WriteLine(v_sOutString); + delete v_psTxtFile; +#else + m_psXMLBBDoc->save( _bstr_t( p_sXMLFileName.c_str() ) ); +#endif +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"End SaveToXMLFile")); +#else + return true; +#endif +} + +mmString mmXML::mmXMLDocBB::SaveToXMLBuffer(void) +{ +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"Start SaveToXMLBuffer")); +#endif + // save XML structure into XMLDocument + SaveNodeStructureIntoXMLDocument(); + + // using XMLDocument API + mmString v_sOutString = GetXMLFormattedString(); +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"End SaveToXMLBuffer")); +#endif + return v_sOutString; +} + +bool mmXML::mmXMLDocBB::IsXMLStructureValid(void) +{ +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"Start IsXMLStructureValid")); +#endif + bool v_bIsValid = true; + // TODO: validate XML structure + +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"End IsXMLStructureValid")); +#endif + return v_bIsValid; +} + +#ifdef MADMAC +mmXML::mmXMLNodeI* mmXML::mmXMLDocBB::GetXMLRootNode(void) +#else +mmXML::mmXMLNodeI* mmXML::mmXMLDocBB::GetXMLRootNode( void ) +#endif +{ +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"Start GetXMLRootNode")); + + SendLogMessage(mmLog::debug,mmString(L"End GetXMLRootNode")); +#endif; + return &m_sRootNode; +} + +void mmXML::mmXMLDocBB::CreateXMLRootNode(mmString p_sRootNodeName) +{ +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"Start CreateXMLRootNode NodeName=") + + p_sRootNodeName); +#endif + m_sRootNode.RemoveAllChilds(); + m_sRootNode.RemoveAllAttributes(); + m_sRootNode.SetName(p_sRootNodeName); + m_sRootNode.SetText(mmString(L"")); + +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"End CreateXMLRootNode")); +#endif +} + +void mmXML::mmXMLDocBB::CopyXMLRootNodeStructure(mmXMLNodeI* p_psNode) +{ +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"Start CopyXMLRootNodeStructure")); +#endif + CreateXMLRootNode(p_psNode->GetName()); + + std::vector v_vRootAttributes = p_psNode->GetAttributes(); + mmInt v_iAttrCount = v_vRootAttributes.size(); + for(mmInt v_iA=0;v_iA v_vChilds = p_psNode->GetChilds(); + mmInt v_iChildsCount = v_vChilds.size(); + for(mmInt v_iC=0;v_iC v_sAttribs = p_psMMNode->GetAttributes(); + v_iCount = v_sAttribs.size(); + + + for(v_i=0;v_iget_attributes( &pXMLNamedNodeMap ); + + MSXML2::IXMLDOMNodePtr pAtty = + m_psXMLBBDoc->createNode( _variant_t( (long)MSXML2::NODE_ATTRIBUTE), _bstr_t(v_sAttribs[ v_i ].sName.c_str()), ""); + + pAtty->put_text( _bstr_t(v_sAttribs[ v_i ].sValue.c_str()) ); + pXMLNamedNodeMap->setNamedItem( pAtty); + + }; + + + // adding child nodes or text values for leaves + std::vector v_sChilds = p_psMMNode->GetChilds(); + v_iCount = v_sChilds.size(); + if(v_iCount > 0) + { + // childs + for(v_i=0;v_icreateNode(MSXML2::NODE_ELEMENT, _bstr_t(v_sChilds[v_i]->GetName().c_str()), ""); + + + v_sNewNode = p_sBBNode->appendChild(v_sNewNode); + FillXMLNodeIntoXMLDocument(v_sNewNode,v_sChilds[v_i]); + }; + } + else + { + // text + p_sBBNode->put_text(_bstr_t(p_psMMNode->GetText().c_str())); + }; +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"End FillXMLNodeIntoXMLDocument")); +#endif +} + + +void mmXML::mmXMLDocBB::SaveNodeStructureIntoXMLDocument(void) +{ +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"Start SaveNodeStructureIntoXMLDocument")); +#endif + // delete existing XMLDocument + m_psXMLBBDoc.Release(); + + // create new one + InitializeXML(); + + wchar_t v_pcXML[1024]; + + swprintf_s(v_pcXML, 1023, L"%s <%s>", L"", m_sRootNode.GetName().c_str(), m_sRootNode.GetName().c_str()); + + m_psXMLBBDoc->loadXML(_bstr_t( v_pcXML )); + m_psDocRoot = m_psXMLBBDoc->documentElement; + + + FillXMLNodeIntoXMLDocument(m_psDocRoot,&m_sRootNode); + m_psXMLBBDoc->documentElement = m_psDocRoot; + +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"End SaveNodeStructureIntoXMLDocument")); +#endif +} + +mmString mmXML::mmXMLDocBB::GetXMLFormattedString(void) +{ +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"Start GetXMLFormattedString")); +#endif + mmString v_sOutString(L""); + + // formatowanie + + if( m_psXMLBBDoc == NULL ) + { + return v_sOutString; + } + + HRESULT hr = S_OK; + + MSXML2::IMXWriterPtr pMXWriter = NULL; + MSXML2::ISAXXMLReaderPtr pSAXReader = NULL; + MSXML2::ISAXContentHandlerPtr pISAXContentHandler = NULL; + MSXML2::ISAXErrorHandlerPtr pISAXErrorHandler = NULL; + MSXML2::ISAXDTDHandlerPtr pISAXDTDHandler = NULL; + try + { + + // create + hr = pMXWriter.CreateInstance( __uuidof(MSXML2::MXXMLWriter)); + if( FAILED(hr) ) + { + RELEASE_PTR(pISAXDTDHandler); + RELEASE_PTR(pISAXErrorHandler); + RELEASE_PTR(pISAXContentHandler); + RELEASE_PTR(pSAXReader); + RELEASE_PTR(pMXWriter); + } + + hr = pSAXReader.CreateInstance( __uuidof(MSXML2::SAXXMLReader)); + if( FAILED(hr) ) + { + RELEASE_PTR(pISAXDTDHandler); + RELEASE_PTR(pISAXErrorHandler); + RELEASE_PTR(pISAXContentHandler); + RELEASE_PTR(pSAXReader); + RELEASE_PTR(pMXWriter); + } + + // save in formatted + pISAXContentHandler = pMXWriter; + pISAXErrorHandler = pMXWriter; + pISAXDTDHandler = pMXWriter; + + if (FAILED (pMXWriter->put_omitXMLDeclaration (VARIANT_FALSE)) || + FAILED (pMXWriter->put_standalone (VARIANT_FALSE)) || + FAILED (pMXWriter->put_indent (VARIANT_TRUE)) || + FAILED (pMXWriter->put_encoding(_bstr_t("UTF-8")) ) + ) + { + + RELEASE_PTR(pISAXDTDHandler); + RELEASE_PTR(pISAXErrorHandler); + RELEASE_PTR(pISAXContentHandler); + RELEASE_PTR(pSAXReader); + RELEASE_PTR(pMXWriter); + } + + if (FAILED(pSAXReader->putContentHandler (pISAXContentHandler)) || + FAILED(pSAXReader->putDTDHandler (pISAXDTDHandler)) || + FAILED(pSAXReader->putErrorHandler (pISAXErrorHandler)) || + FAILED(pSAXReader->putProperty ((unsigned short*)L"http://xml.org/sax/properties/lexical-handler", _variant_t(pMXWriter.GetInterfacePtr()))) || + FAILED(pSAXReader->putProperty ((unsigned short*)L"http://xml.org/sax/properties/declaration-handler", _variant_t(pMXWriter.GetInterfacePtr())))) + { + RELEASE_PTR(pISAXDTDHandler); + RELEASE_PTR(pISAXErrorHandler); + RELEASE_PTR(pISAXContentHandler); + RELEASE_PTR(pSAXReader); + RELEASE_PTR(pMXWriter); + } + + IStream * pOutStream = NULL; + ::CreateStreamOnHGlobal( NULL, TRUE, &pOutStream); + + _bstr_t m_sString; + _variant_t out; + HGLOBAL hg = NULL; + hr = pMXWriter->put_output(_variant_t(pOutStream)); + GetHGlobalFromStream(pOutStream,&hg); + void * output; + output = GlobalLock(hg); + + + + if( FAILED(hr) ) + { + RELEASE_PTR(pISAXDTDHandler); + RELEASE_PTR(pISAXErrorHandler); + RELEASE_PTR(pISAXContentHandler); + RELEASE_PTR(pSAXReader); + RELEASE_PTR(pMXWriter); + } + + hr = pSAXReader->parse(m_psXMLBBDoc.GetInterfacePtr()); + if( FAILED(hr) ) + { + RELEASE_PTR(pISAXDTDHandler); + RELEASE_PTR(pISAXErrorHandler); + RELEASE_PTR(pISAXContentHandler); + RELEASE_PTR(pSAXReader); + RELEASE_PTR(pMXWriter); + } + + // zapisz do stringa + HRESULT hr = S_OK; + LPVOID pOutput = NULL; + HGLOBAL hGlobal = NULL; + + hr = ::GetHGlobalFromStream( pOutStream, &hGlobal); + if( FAILED(hr) ) + { + return v_sOutString; + } + ::GlobalUnlock(hGlobal); + LARGE_INTEGER llStart = {0, 0}; + ULARGE_INTEGER ullSize = {0, 0}; + pOutStream->Seek( llStart, STREAM_SEEK_CUR, &ullSize); + pOutput = ::GlobalLock(hGlobal); + + + char * v_pcText = new char[ int(ullSize.QuadPart) + 1 ]; + ZeroMemory( v_pcText, int(ullSize.QuadPart) + 1 ); + memcpy( v_pcText, (const char * ) pOutput, int(ullSize.QuadPart) ); + + v_sOutString.clear(); + v_sOutString.append( (mmStringUtilities::MMCharStringToMMString(v_pcText)).c_str()); + + + + ::GlobalUnlock(hGlobal); + delete [] v_pcText; + + } + catch ( _com_error e ) + { +// TRACE( _T("CXml::SaveWithFormatted( %s ) failed:%s\n"), lpszFilePath, e.ErrorMessage()); + hr = e.Error(); + } + RELEASE_PTR(pISAXDTDHandler); + RELEASE_PTR(pISAXErrorHandler); + RELEASE_PTR(pISAXContentHandler); + RELEASE_PTR(pSAXReader); + RELEASE_PTR(pMXWriter); + +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"End GetXMLFormattedString")); +#endif + + return v_sOutString; +} + +void mmXML::mmXMLDocBB::FillXMLNodeFromXMLDocument(MSXML2::IXMLDOMNodePtr p_sBBNode, mmXMLNodeI* p_psMMNode) +{ +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"Start FillXMLNodeFromXMLDocument")); +#endif + // adding attributes + mmInt v_i,v_iCount; + sXMLAttribute v_sXMLAttr; + + v_iCount = p_sBBNode->Getattributes()->Getlength(); + for(v_i=0;v_iGetattributes()->Getitem( v_i )->GetnodeName()); + v_sXMLAttr.sValue = (mmString)(const wchar_t *) _bstr_t (p_sBBNode->Getattributes()->Getitem( v_i )->GetnodeValue()); + + p_psMMNode->AddAttribute(v_sXMLAttr.sName,v_sXMLAttr.sValue); + }; + + // adding child nodes or text values for leafs + v_iCount = p_sBBNode->GetchildNodes()->Getlength(); + + if(v_iCount > 0) + { + // bylo 0! + + if( (v_iCount == 1) && ( Is_MSXML_Node(p_sBBNode->GetfirstChild()) == MSXML2::NODE_TEXT) ) + { + // text + p_psMMNode->SetText((mmString)(const wchar_t *)(p_sBBNode->Gettext())); + } + else + { + // childs + for(v_i=0;v_iAddChild((mmString)(const wchar_t *)(p_sBBNode->GetchildNodes()->Getitem(v_i)->GetnodeName())); + + FillXMLNodeFromXMLDocument(p_sBBNode->GetchildNodes()->Getitem(v_i),v_psChildNode); + }; + }; + }; +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"End FillXMLNodeFromXMLDocument")); +#endif +} + +void mmXML::mmXMLDocBB::LoadNodeStructureFromXMLDocument(void) +{ +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"Start LoadNodeStructureFromXMLDocument")); +#endif + MSXML2::IXMLDOMElementPtr v_sRootNode = m_psXMLBBDoc->documentElement; + m_sRootNode.SetName((mmStringUtilities::MMCharStringToMMString((const char *) v_sRootNode->GetnodeName()))); +// m_sRootNode.SetName((mmString((const wchar_t *) v_sRootNode->GetnodeName()))); + FillXMLNodeFromXMLDocument(v_sRootNode,&m_sRootNode); + +#ifdef MADMAC + SendLogMessage(mmLog::debug,mmString(L"End LoadNodeStructureFromXMLDocument")); +#endif +} + + +bool mmXML::mmXMLDocBB::InitializeXML() +{ + m_sLastError = L"ok"; + + // -- Init OLE Object Comunication for MSXML (only once time)-- + // + + if(!m_bOLEInitialized) + { CoInitializeEx(NULL, COINIT_APARTMENTTHREADED ); + m_bOLEInitialized = true; + } + + // -- Instantiate an XML document -- + // + HRESULT hr = m_psXMLBBDoc.CreateInstance(MSXML2::CLSID_DOMDocument); + if (FAILED(hr)) + { + // coinit not called + if (hr == -2147221008) + { + m_bOLEInitialized = false; + InitializeXML(); + } + else + return false; + } + + return true; +} +void mmXML::mmXMLDocBB::Reset_XML_Document() +{ + // Init + // + this->InitializeXML(); + m_psDocRoot = m_psXMLBBDoc->documentElement; + + +} +bool mmXML::mmXMLDocBB::Load_XML_Document(mmString strFileName) +{ + m_sLastError = L"ok"; + + // Reset Document + // + this->Reset_XML_Document(); + + // Convert xml file name string to something COM can handle (BSTR) + // + //mmString sFileName = strFileName; + //_bstr_t bstrFileName; + //bstrFileName = sFileName.AllocSysString(); + + // Call the MSXML2::IXMLDOMDocumentPtr's load function to load the XML document + // + variant_t vResult; + // UWAGA - VS 2008 SP1 - load nie dziala, trzeba loadXML + vResult = m_psXMLBBDoc->load (_bstr_t(strFileName.c_str())); + if (((bool)vResult) == TRUE) // success! + { + // Now that the document is loaded, we need to initialize the root pointer + // + m_psDocRoot = m_psXMLBBDoc->documentElement; + + + + return true; + } + else + { // XML document is not loaded, return error + // + m_sLastError = L"XML Document FAILED to load"; + return false; + } +} + +void mmXML::mmXMLDocBB::Load_XML_From_Buffer(mmString source) +{ + // Reset the document + // + this->Reset_XML_Document(); + + // Load from Buffer + // + variant_t vResult; + // UWAGA - VS 2008 SP1 - load nie dziala, trzeba loadXML + vResult = m_psXMLBBDoc->loadXML(_bstr_t(source.c_str())); + if (((bool)vResult) == TRUE) // success! + { + // Now that the document is loaded, we need to initialize the root pointer + // + m_psDocRoot = m_psXMLBBDoc->documentElement; + + + + return ; + } + else + { // XML document is not loaded, return error + // + MSXML2::IXMLDOMParseErrorPtr v_ptr = m_psXMLBBDoc->parseError; + m_sLastError = v_ptr->reason; + return ; + } + + +} + +

24c?mL=Q1-4XCA+B$%4Lw12;2(a3g2laNt%k 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