From 117f834c7175e310b164d0e12a58162b2d820b0b Mon Sep 17 00:00:00 2001 From: Yury Rodzikau Date: Tue, 24 Jun 2025 12:16:39 +0200 Subject: [PATCH 1/3] LibMCEnv: Implements LaserON signal visualization in WebGUI * Extends the DataTableScatterPlotOptions class with the ListDataChannels method for storing and transmitting LaserOn signal; * Implements the ScatterPlotDataChannel(Iterator), ScatterPlotDataColumn(Iterator) classes for storing and transferring additional channels and data columns; * Implements saving and querying of LaserOn signal status to/from the database; * Implements additional HTTP request for acquiring LaserOn signal data on the WebGUI side; * implements additional "LaserOn" mode for LaserOn signal visualization in WebGUI; Signed-off-by: Yury Rodzikau --- ACT/LibMCEnv.xml | 43 ++- Artifacts/clientdist/clientpackage.zip | Bin 4542238 -> 4542715 bytes Artifacts/clientdist/clientsourcepackage.zip | Bin 206216 -> 207016 bytes .../src/common/AMCImplementation_LayerView.js | 52 +++ Client/src/modules/AMCModule_LayerView.vue | 149 ++++++-- .../libmcdriver_scanlabsmc_smcjobinstance.cpp | 2 +- .../HeadersDev/CppDynamic/libmcenv_dynamic.h | 110 ++++++ .../CppDynamic/libmcenv_dynamic.hpp | 359 ++++++++++++++++++ .../HeadersDev/CppDynamic/libmcenv_types.hpp | 4 + Framework/InterfacesCore/libmcenv_abi.hpp | 101 +++++ .../InterfacesCore/libmcenv_interfaces.hpp | 102 +++++ .../libmcenv_interfacewrapper.cpp | 323 ++++++++++++++++ Framework/InterfacesCore/libmcenv_types.hpp | 4 + Implementation/API/amc_api_handler_ui.cpp | 39 ++ Implementation/API/amc_api_handler_ui.hpp | 4 +- Implementation/Core/amc_scatterplot.cpp | 5 + Implementation/Core/amc_scatterplot.hpp | 7 + .../LibMCEnv/libmcenv_datatable.cpp | 67 ++++ .../LibMCEnv/libmcenv_datatable.hpp | 2 + .../libmcenv_datatablescatterplotoptions.cpp | 26 +- .../libmcenv_datatablescatterplotoptions.hpp | 6 +- .../libmcenv_scatterplotdatachannel.cpp | 99 +++++ .../libmcenv_scatterplotdatachannel.hpp | 107 ++++++ ...ibmcenv_scatterplotdatachanneliterator.cpp | 77 ++++ ...ibmcenv_scatterplotdatachanneliterator.hpp | 104 +++++ .../libmcenv_scatterplotdatacolumn.cpp | 71 ++++ .../libmcenv_scatterplotdatacolumn.hpp | 104 +++++ ...libmcenv_scatterplotdatacolumniterator.cpp | 80 ++++ ...libmcenv_scatterplotdatacolumniterator.hpp | 100 +++++ 29 files changed, 2105 insertions(+), 42 deletions(-) create mode 100644 Implementation/LibMCEnv/libmcenv_scatterplotdatachannel.cpp create mode 100644 Implementation/LibMCEnv/libmcenv_scatterplotdatachannel.hpp create mode 100644 Implementation/LibMCEnv/libmcenv_scatterplotdatachanneliterator.cpp create mode 100644 Implementation/LibMCEnv/libmcenv_scatterplotdatachanneliterator.hpp create mode 100644 Implementation/LibMCEnv/libmcenv_scatterplotdatacolumn.cpp create mode 100644 Implementation/LibMCEnv/libmcenv_scatterplotdatacolumn.hpp create mode 100644 Implementation/LibMCEnv/libmcenv_scatterplotdatacolumniterator.cpp create mode 100644 Implementation/LibMCEnv/libmcenv_scatterplotdatacolumniterator.hpp diff --git a/ACT/LibMCEnv.xml b/ACT/LibMCEnv.xml index b3765a6b..267adfaf 100644 --- a/ACT/LibMCEnv.xml +++ b/ACT/LibMCEnv.xml @@ -997,7 +997,42 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1045,9 +1080,11 @@ + + + - - + diff --git a/Artifacts/clientdist/clientpackage.zip b/Artifacts/clientdist/clientpackage.zip index 65d8f8fb22b5e658df3e53663d0e45782905b09b..712cb68d3326589b136e36ace4ee3260ba254fc8 100644 GIT binary patch delta 44892 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 OoHzk=mxTB~{r>}3Np3j+ delta 44412 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 DL+7t5 diff --git a/Artifacts/clientdist/clientsourcepackage.zip b/Artifacts/clientdist/clientsourcepackage.zip index 50c9a5e67fda1bdcfe5fa4ad3fde3306ea6cb07a..0320a7ab8985ae0ea73aa41eb107f302d1150d53 100644 GIT binary patch delta 12476 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

xeBQDP3ng(e=^=#&h^j!~qJQDk#U$aKjb9^}oT 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 diff --git a/Client/src/common/AMCImplementation_LayerView.js b/Client/src/common/AMCImplementation_LayerView.js index b4de0441..b985b012 100644 --- a/Client/src/common/AMCImplementation_LayerView.js +++ b/Client/src/common/AMCImplementation_LayerView.js @@ -325,6 +325,31 @@ class LayerViewImpl { } } + + makeLaserOnColors () + { + this.laserOnPointsColorArray = null; + + if (this.laser && this.laser.laseron && this.layerPointsArray) { + + let pointCount = this.layerPointsArray.length / 2; + let colors = []; + + for (let pointIndex = 0; pointIndex < pointCount; pointIndex++) { + + let laseron = this.laser.laseron[pointIndex]; + + // laseron = 0 => Blue + // laseron = 1 => Red + const hue = laseron * 240 / 360; + + colors.push (this.hslToRgb (hue, 1.0, 0.5)); + } + + this.layerPointsColorArray = colors; + } + + } hslToRgb(h, s, l) { // Ensure h, s, l are in the range [0, 1] @@ -396,6 +421,19 @@ class LayerViewImpl { this.updateColors (); this.updateLayerPoints (); } + + loadPointsChannelData(pointsChannelName, pointsColumnName, pointsChannelDataArray) { + + // Ensure the channel-level object exists + if (!Object.prototype.hasOwnProperty.call(this, pointsChannelName)) { + this[pointsChannelName] = {}; + } + + // Assign the data array to the corresponding column + this[pointsChannelName][pointsColumnName] = pointsChannelDataArray; + + this.makeLaserOnColors (); + } clearPoints () { @@ -410,6 +448,16 @@ class LayerViewImpl { this.updateLayerPoints (); } + clearPointsChannelData (pointsChannelName) + { + // Ensure the channel-level object exists + if (Object.prototype.hasOwnProperty.call(this, pointsChannelName)) { + this[pointsChannelName] = {}; + } + + this.layerPointsColorArray = null; + } + updateColors () { this.layerPointsColorArray = null; @@ -422,6 +470,10 @@ class LayerViewImpl { this.makeVelocityColors (); } + if (this.layerPointsMode == "laseron") { + this.makeLaserOnColors (); + } + } setColorMode (newColorMode) { diff --git a/Client/src/modules/AMCModule_LayerView.vue b/Client/src/modules/AMCModule_LayerView.vue index 84880195..4a490747 100644 --- a/Client/src/modules/AMCModule_LayerView.vue +++ b/Client/src/modules/AMCModule_LayerView.vue @@ -154,11 +154,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. this.LayerViewerInstance.setColorMode ("velocity"); } else if (this.LayerViewerInstance.layerPointsMode == "velocity") { - this.LayerViewerInstance.setColorMode ("uniform"); + this.LayerViewerInstance.setColorMode ("laseron"); + } + else if (this.LayerViewerInstance.layerPointsMode == "laseron") { + this.LayerViewerInstance.setColorMode ("uniform"); } else { this.LayerViewerInstance.setColorMode ("time"); - } - + } }, onToggleToolpathClick: function () { @@ -233,6 +235,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. if (this.LayerViewerInstance.layerPointsMode == "velocity") { return "Color: Velocity"; } + + if (this.LayerViewerInstance.layerPointsMode == "laseron") { + return "Color: LaserOn"; + } return "Color: Uniform"; }, @@ -297,6 +303,102 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. } } }, + + queryPoints: function (scatterplotuuid) + { + this.loadingScatterplot = true; + this.LayerViewerInstance.glInstance.removeElement("layerdata_points"); + this.LayerViewerInstance.clearPoints (); + + this.Application.axiosGetArrayBufferRequest("/ui/pointcloud/" + scatterplotuuid) + .then(responseData => { + let pointcoordinates = new Float32Array(responseData.data); + + if (this.LayerViewerInstance) { + this.LayerViewerInstance.loadPoints (pointcoordinates); + } + + this.loadingScatterplot = false; + + }) + .catch(err => { + if (err.response) { + console.log (err.response); + } else { + console.log ("fatal error while retrieving point cloud "); + } + if (this.LayerViewerInstance) { + this.LayerViewerInstance.RenderScene (true); + } + + this.loadingScatterplot = false; + }); + + }, + + queryPointsChannelData: function (scatterplotuuid, pointsChannelName) + { + this.loadingScatterplot = true; + + this.LayerViewerInstance.clearPointsChannelData (pointsChannelName); + + this.Application.axiosGetArrayBufferRequest("/ui/pointchanneldata/" + scatterplotuuid + "/" + pointsChannelName) + .then(responseData => { + + const contentType = responseData.headers['content-type']; + + if (contentType && contentType.includes("application/json")) { + + try { + const jsonText = new TextDecoder().decode(responseData.data); + + const parsed = JSON.parse(jsonText); + + if (parsed && typeof parsed === 'object') { + + for (const [key, value] of Object.entries(parsed)) { + + if (Array.isArray(value)) { + const floatArray = new Float32Array(value); + console.log(`Key "${key}" contains Float32Array with length: ${floatArray.length}`); + if (key.toLowerCase() === 'laseron') { + if (this.LayerViewerInstance) { + this.LayerViewerInstance.loadPointsChannelData ("laser", key.toLowerCase(), floatArray); + } else { + console.log(`${key}: ${floatArray.length}`); + } + } + } else { + console.warn(`Key "${key}" is not an array and will be ignored.`); + } + } + } else { + console.warn("Parsed JSON is not an object."); + } + } catch (e) { + console.error("Error while parsing JSON response:", e); + } + } else { + console.error("Error while parsing response: not a JSON"); + } + + this.loadingScatterplot = false; + + }) + .catch(err => { + if (err.response) { + console.log (err.response); + } else { + console.log ("fatal error while retrieving point cloud "); + } + if (this.LayerViewerInstance) { + this.LayerViewerInstance.RenderScene (true); + } + + this.loadingScatterplot = false; + }); + }, + onLayerChanged: function (sender) { @@ -333,45 +435,22 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // }); - if (platform.scatterplotuuid != "00000000-0000-0000-0000-000000000000") { - this.loadingScatterplot = true; - this.LayerViewerInstance.glInstance.removeElement("layerdata_points"); - this.LayerViewerInstance.clearPoints (); - - this.Application.axiosGetArrayBufferRequest("/ui/pointcloud/" + platform.scatterplotuuid) - .then(responseData => { - let pointcoordinates = new Float32Array(responseData.data); - - if (this.LayerViewerInstance) { - this.LayerViewerInstance.loadPoints (pointcoordinates); - } - - this.loadingScatterplot = false; - - }) - .catch(err => { - if (err.response) { - console.log (err.response); - } else { - console.log ("fatal error while retrieving point cloud "); - } - if (this.LayerViewerInstance) { - this.LayerViewerInstance.RenderScene (true); - } - - this.loadingScatterplot = false; - }); + this.queryPoints (platform.scatterplotuuid); + + this.queryPointsChannelData (platform.scatterplotuuid, "laser"); + } else { this.loadingScatterplot = false; this.LayerViewerInstance.glInstance.removeElement("layerdata_points"); + this.LayerViewerInstance.clearPoints (); - - - } - + + this.LayerViewerInstance.clearPointsChannelData ("laser") + + } } } } diff --git a/Drivers/ScanLabSMC/Implementation/libmcdriver_scanlabsmc_smcjobinstance.cpp b/Drivers/ScanLabSMC/Implementation/libmcdriver_scanlabsmc_smcjobinstance.cpp index 3ece391e..d2f5efac 100644 --- a/Drivers/ScanLabSMC/Implementation/libmcdriver_scanlabsmc_smcjobinstance.cpp +++ b/Drivers/ScanLabSMC/Implementation/libmcdriver_scanlabsmc_smcjobinstance.cpp @@ -674,7 +674,7 @@ void CSMCJobInstance::ReadSimulationFile(LibMCEnv::PDataTable pDataTable) } } else if (version.m_nMajor == 1) { - if (version.m_nMinor == 0) + if (version.m_nMinor == 0 || version.m_nMinor == 1) { if (m_bSendToHardware) ReadLogRecordFile(pDataTable); diff --git a/Framework/HeadersDev/CppDynamic/libmcenv_dynamic.h b/Framework/HeadersDev/CppDynamic/libmcenv_dynamic.h index 89f2c2e0..f2b22490 100644 --- a/Framework/HeadersDev/CppDynamic/libmcenv_dynamic.h +++ b/Framework/HeadersDev/CppDynamic/libmcenv_dynamic.h @@ -964,6 +964,98 @@ typedef LibMCEnvResult (*PLibMCEnvDataTableCSVWriteOptions_GetSeparatorPtr) (Lib */ typedef LibMCEnvResult (*PLibMCEnvDataTableCSVWriteOptions_SetSeparatorPtr) (LibMCEnv_DataTableCSVWriteOptions pDataTableCSVWriteOptions, const char * pSeparator); +/************************************************************************************************************************* + Class definition for ScatterPlotDataColumn +**************************************************************************************************************************/ + +/** +* Returns the Column Identifier. +* +* @param[in] pScatterPlotDataColumn - ScatterPlotDataColumn instance. +* @param[in] nColumnIdentifierBufferSize - size of the buffer (including trailing 0) +* @param[out] pColumnIdentifierNeededChars - will be filled with the count of the written bytes, or needed buffer size. +* @param[out] pColumnIdentifierBuffer - buffer of Identifier of the column to use. Must be alphanumeric and not empty., may be NULL +* @return error code or 0 (success) +*/ +typedef LibMCEnvResult (*PLibMCEnvScatterPlotDataColumn_GetColumnIdentifierPtr) (LibMCEnv_ScatterPlotDataColumn pScatterPlotDataColumn, const LibMCEnv_uint32 nColumnIdentifierBufferSize, LibMCEnv_uint32* pColumnIdentifierNeededChars, char * pColumnIdentifierBuffer); + +/** +* Returns Scale Factor to use. +* +* @param[in] pScatterPlotDataColumn - ScatterPlotDataColumn instance. +* @param[out] pScaleFactor - Scale factor to use. The channel value will be computed as raw value times scale factor plus offset factor. +* @return error code or 0 (success) +*/ +typedef LibMCEnvResult (*PLibMCEnvScatterPlotDataColumn_GetScaleFactorPtr) (LibMCEnv_ScatterPlotDataColumn pScatterPlotDataColumn, LibMCEnv_double * pScaleFactor); + +/** +* Returns Offset Factor to use. +* +* @param[in] pScatterPlotDataColumn - ScatterPlotDataColumn instance. +* @param[out] pOffsetFactor - Offset factor to use. The channel value will be computed as raw value times scale factor plus offset factor. +* @return error code or 0 (success) +*/ +typedef LibMCEnvResult (*PLibMCEnvScatterPlotDataColumn_GetOffsetFactorPtr) (LibMCEnv_ScatterPlotDataColumn pScatterPlotDataColumn, LibMCEnv_double * pOffsetFactor); + +/************************************************************************************************************************* + Class definition for ScatterPlotDataColumnIterator +**************************************************************************************************************************/ + +/** +* Returns the Current Channel Column the iterator points at. +* +* @param[in] pScatterPlotDataColumnIterator - ScatterPlotDataColumnIterator instance. +* @param[out] pScatterPlotDataColumnInstance - returns the DataChannel instance. +* @return error code or 0 (success) +*/ +typedef LibMCEnvResult (*PLibMCEnvScatterPlotDataColumnIterator_GetCurrentScatterPlotDataColumnPtr) (LibMCEnv_ScatterPlotDataColumnIterator pScatterPlotDataColumnIterator, LibMCEnv_ScatterPlotDataColumn * pScatterPlotDataColumnInstance); + +/************************************************************************************************************************* + Class definition for ScatterPlotDataChannel +**************************************************************************************************************************/ + +/** +* Returns the Scatter Plot Data Channel Identifier. +* +* @param[in] pScatterPlotDataChannel - ScatterPlotDataChannel instance. +* @param[in] nChannelIdentifierBufferSize - size of the buffer (including trailing 0) +* @param[out] pChannelIdentifierNeededChars - will be filled with the count of the written bytes, or needed buffer size. +* @param[out] pChannelIdentifierBuffer - buffer of Identifier of the channel. Must be alphanumeric and not empty., may be NULL +* @return error code or 0 (success) +*/ +typedef LibMCEnvResult (*PLibMCEnvScatterPlotDataChannel_GetChannelIdentifierPtr) (LibMCEnv_ScatterPlotDataChannel pScatterPlotDataChannel, const LibMCEnv_uint32 nChannelIdentifierBufferSize, LibMCEnv_uint32* pChannelIdentifierNeededChars, char * pChannelIdentifierBuffer); + +/** +* Adds a new Columns to the Data Channel. +* +* @param[in] pScatterPlotDataChannel - ScatterPlotDataChannel instance. +* @param[in] pColumnInstance - Column Instance +* @return error code or 0 (success) +*/ +typedef LibMCEnvResult (*PLibMCEnvScatterPlotDataChannel_AddScatterPlotDataColumnPtr) (LibMCEnv_ScatterPlotDataChannel pScatterPlotDataChannel, LibMCEnv_ScatterPlotDataColumn pColumnInstance); + +/** +* Lists all Columns of the Data Channel. +* +* @param[in] pScatterPlotDataChannel - ScatterPlotDataChannel instance. +* @param[out] pIteratorInstance - Iterator instance. +* @return error code or 0 (success) +*/ +typedef LibMCEnvResult (*PLibMCEnvScatterPlotDataChannel_ListScatterPlotDataColumnsPtr) (LibMCEnv_ScatterPlotDataChannel pScatterPlotDataChannel, LibMCEnv_ScatterPlotDataColumnIterator * pIteratorInstance); + +/************************************************************************************************************************* + Class definition for ScatterPlotDataChannelIterator +**************************************************************************************************************************/ + +/** +* Returns the Current Scatter Plot Data Channel the iterator points at. +* +* @param[in] pScatterPlotDataChannelIterator - ScatterPlotDataChannelIterator instance. +* @param[out] pScatterPlotDataChannelInstance - returns the ScatterPlotDataChannel instance. +* @return error code or 0 (success) +*/ +typedef LibMCEnvResult (*PLibMCEnvScatterPlotDataChannelIterator_GetCurrentScatterPlotDataChannelPtr) (LibMCEnv_ScatterPlotDataChannelIterator pScatterPlotDataChannelIterator, LibMCEnv_ScatterPlotDataChannel * pScatterPlotDataChannelInstance); + /************************************************************************************************************************* Class definition for DataTableScatterPlotOptions **************************************************************************************************************************/ @@ -1061,6 +1153,15 @@ typedef LibMCEnvResult (*PLibMCEnvDataTableScatterPlotOptions_GetYAxisOffsetPtr) */ typedef LibMCEnvResult (*PLibMCEnvDataTableScatterPlotOptions_AddDataChannelPtr) (LibMCEnv_DataTableScatterPlotOptions pDataTableScatterPlotOptions, const char * pChannelIdentifier, const char * pColumnIdentifier, LibMCEnv_double dScaleFactor, LibMCEnv_double dOffsetFactor, LibMCEnv_uint32 nColor); +/** +* Lists all DataChannels of the ScatterPlot. +* +* @param[in] pDataTableScatterPlotOptions - DataTableScatterPlotOptions instance. +* @param[out] pIteratorInstance - Iterator instance. +* @return error code or 0 (success) +*/ +typedef LibMCEnvResult (*PLibMCEnvDataTableScatterPlotOptions_ListDataChannelsPtr) (LibMCEnv_DataTableScatterPlotOptions pDataTableScatterPlotOptions, LibMCEnv_ScatterPlotDataChannelIterator * pIteratorInstance); + /************************************************************************************************************************* Class definition for DataTable **************************************************************************************************************************/ @@ -10182,6 +10283,14 @@ typedef struct { PLibMCEnvDiscreteFieldData2D_DuplicatePtr m_DiscreteFieldData2D_Duplicate; PLibMCEnvDataTableCSVWriteOptions_GetSeparatorPtr m_DataTableCSVWriteOptions_GetSeparator; PLibMCEnvDataTableCSVWriteOptions_SetSeparatorPtr m_DataTableCSVWriteOptions_SetSeparator; + PLibMCEnvScatterPlotDataColumn_GetColumnIdentifierPtr m_ScatterPlotDataColumn_GetColumnIdentifier; + PLibMCEnvScatterPlotDataColumn_GetScaleFactorPtr m_ScatterPlotDataColumn_GetScaleFactor; + PLibMCEnvScatterPlotDataColumn_GetOffsetFactorPtr m_ScatterPlotDataColumn_GetOffsetFactor; + PLibMCEnvScatterPlotDataColumnIterator_GetCurrentScatterPlotDataColumnPtr m_ScatterPlotDataColumnIterator_GetCurrentScatterPlotDataColumn; + PLibMCEnvScatterPlotDataChannel_GetChannelIdentifierPtr m_ScatterPlotDataChannel_GetChannelIdentifier; + PLibMCEnvScatterPlotDataChannel_AddScatterPlotDataColumnPtr m_ScatterPlotDataChannel_AddScatterPlotDataColumn; + PLibMCEnvScatterPlotDataChannel_ListScatterPlotDataColumnsPtr m_ScatterPlotDataChannel_ListScatterPlotDataColumns; + PLibMCEnvScatterPlotDataChannelIterator_GetCurrentScatterPlotDataChannelPtr m_ScatterPlotDataChannelIterator_GetCurrentScatterPlotDataChannel; PLibMCEnvDataTableScatterPlotOptions_SetXAxisColumnPtr m_DataTableScatterPlotOptions_SetXAxisColumn; PLibMCEnvDataTableScatterPlotOptions_GetXAxisColumnPtr m_DataTableScatterPlotOptions_GetXAxisColumn; PLibMCEnvDataTableScatterPlotOptions_GetXAxisScalingPtr m_DataTableScatterPlotOptions_GetXAxisScaling; @@ -10191,6 +10300,7 @@ typedef struct { PLibMCEnvDataTableScatterPlotOptions_GetYAxisScalingPtr m_DataTableScatterPlotOptions_GetYAxisScaling; PLibMCEnvDataTableScatterPlotOptions_GetYAxisOffsetPtr m_DataTableScatterPlotOptions_GetYAxisOffset; PLibMCEnvDataTableScatterPlotOptions_AddDataChannelPtr m_DataTableScatterPlotOptions_AddDataChannel; + PLibMCEnvDataTableScatterPlotOptions_ListDataChannelsPtr m_DataTableScatterPlotOptions_ListDataChannels; PLibMCEnvDataTable_AddColumnPtr m_DataTable_AddColumn; PLibMCEnvDataTable_RemoveColumnPtr m_DataTable_RemoveColumn; PLibMCEnvDataTable_ClearPtr m_DataTable_Clear; diff --git a/Framework/HeadersDev/CppDynamic/libmcenv_dynamic.hpp b/Framework/HeadersDev/CppDynamic/libmcenv_dynamic.hpp index b997b39f..b5f9b7d3 100644 --- a/Framework/HeadersDev/CppDynamic/libmcenv_dynamic.hpp +++ b/Framework/HeadersDev/CppDynamic/libmcenv_dynamic.hpp @@ -75,6 +75,10 @@ class CDiscreteFieldData2DStoreOptions; class CDiscreteFieldData2D; class CDataTableWriteOptions; class CDataTableCSVWriteOptions; +class CScatterPlotDataColumn; +class CScatterPlotDataColumnIterator; +class CScatterPlotDataChannel; +class CScatterPlotDataChannelIterator; class CDataTableScatterPlotOptions; class CDataTable; class CDataSeries; @@ -150,6 +154,10 @@ typedef CDiscreteFieldData2DStoreOptions CLibMCEnvDiscreteFieldData2DStoreOption typedef CDiscreteFieldData2D CLibMCEnvDiscreteFieldData2D; typedef CDataTableWriteOptions CLibMCEnvDataTableWriteOptions; typedef CDataTableCSVWriteOptions CLibMCEnvDataTableCSVWriteOptions; +typedef CScatterPlotDataColumn CLibMCEnvScatterPlotDataColumn; +typedef CScatterPlotDataColumnIterator CLibMCEnvScatterPlotDataColumnIterator; +typedef CScatterPlotDataChannel CLibMCEnvScatterPlotDataChannel; +typedef CScatterPlotDataChannelIterator CLibMCEnvScatterPlotDataChannelIterator; typedef CDataTableScatterPlotOptions CLibMCEnvDataTableScatterPlotOptions; typedef CDataTable CLibMCEnvDataTable; typedef CDataSeries CLibMCEnvDataSeries; @@ -225,6 +233,10 @@ typedef std::shared_ptr PDiscreteFieldData2DSt typedef std::shared_ptr PDiscreteFieldData2D; typedef std::shared_ptr PDataTableWriteOptions; typedef std::shared_ptr PDataTableCSVWriteOptions; +typedef std::shared_ptr PScatterPlotDataColumn; +typedef std::shared_ptr PScatterPlotDataColumnIterator; +typedef std::shared_ptr PScatterPlotDataChannel; +typedef std::shared_ptr PScatterPlotDataChannelIterator; typedef std::shared_ptr PDataTableScatterPlotOptions; typedef std::shared_ptr PDataTable; typedef std::shared_ptr PDataSeries; @@ -300,6 +312,10 @@ typedef PDiscreteFieldData2DStoreOptions PLibMCEnvDiscreteFieldData2DStoreOption typedef PDiscreteFieldData2D PLibMCEnvDiscreteFieldData2D; typedef PDataTableWriteOptions PLibMCEnvDataTableWriteOptions; typedef PDataTableCSVWriteOptions PLibMCEnvDataTableCSVWriteOptions; +typedef PScatterPlotDataColumn PLibMCEnvScatterPlotDataColumn; +typedef PScatterPlotDataColumnIterator PLibMCEnvScatterPlotDataColumnIterator; +typedef PScatterPlotDataChannel PLibMCEnvScatterPlotDataChannel; +typedef PScatterPlotDataChannelIterator PLibMCEnvScatterPlotDataChannelIterator; typedef PDataTableScatterPlotOptions PLibMCEnvDataTableScatterPlotOptions; typedef PDataTable PLibMCEnvDataTable; typedef PDataSeries PLibMCEnvDataSeries; @@ -1063,6 +1079,10 @@ class CWrapper { friend class CDiscreteFieldData2D; friend class CDataTableWriteOptions; friend class CDataTableCSVWriteOptions; + friend class CScatterPlotDataColumn; + friend class CScatterPlotDataColumnIterator; + friend class CScatterPlotDataChannel; + friend class CScatterPlotDataChannelIterator; friend class CDataTableScatterPlotOptions; friend class CDataTable; friend class CDataSeries; @@ -1495,6 +1515,78 @@ class CDataTableCSVWriteOptions : public CBase { inline void SetSeparator(const std::string & sSeparator); }; +/************************************************************************************************************************* + Class CScatterPlotDataColumn +**************************************************************************************************************************/ +class CScatterPlotDataColumn : public CBase { +public: + + /** + * CScatterPlotDataColumn::CScatterPlotDataColumn - Constructor for ScatterPlotDataColumn class. + */ + CScatterPlotDataColumn(CWrapper* pWrapper, LibMCEnvHandle pHandle) + : CBase(pWrapper, pHandle) + { + } + + inline std::string GetColumnIdentifier(); + inline LibMCEnv_double GetScaleFactor(); + inline LibMCEnv_double GetOffsetFactor(); +}; + +/************************************************************************************************************************* + Class CScatterPlotDataColumnIterator +**************************************************************************************************************************/ +class CScatterPlotDataColumnIterator : public CIterator { +public: + + /** + * CScatterPlotDataColumnIterator::CScatterPlotDataColumnIterator - Constructor for ScatterPlotDataColumnIterator class. + */ + CScatterPlotDataColumnIterator(CWrapper* pWrapper, LibMCEnvHandle pHandle) + : CIterator(pWrapper, pHandle) + { + } + + inline PScatterPlotDataColumn GetCurrentScatterPlotDataColumn(); +}; + +/************************************************************************************************************************* + Class CScatterPlotDataChannel +**************************************************************************************************************************/ +class CScatterPlotDataChannel : public CBase { +public: + + /** + * CScatterPlotDataChannel::CScatterPlotDataChannel - Constructor for ScatterPlotDataChannel class. + */ + CScatterPlotDataChannel(CWrapper* pWrapper, LibMCEnvHandle pHandle) + : CBase(pWrapper, pHandle) + { + } + + inline std::string GetChannelIdentifier(); + inline void AddScatterPlotDataColumn(classParam pColumnInstance); + inline PScatterPlotDataColumnIterator ListScatterPlotDataColumns(); +}; + +/************************************************************************************************************************* + Class CScatterPlotDataChannelIterator +**************************************************************************************************************************/ +class CScatterPlotDataChannelIterator : public CIterator { +public: + + /** + * CScatterPlotDataChannelIterator::CScatterPlotDataChannelIterator - Constructor for ScatterPlotDataChannelIterator class. + */ + CScatterPlotDataChannelIterator(CWrapper* pWrapper, LibMCEnvHandle pHandle) + : CIterator(pWrapper, pHandle) + { + } + + inline PScatterPlotDataChannel GetCurrentScatterPlotDataChannel(); +}; + /************************************************************************************************************************* Class CDataTableScatterPlotOptions **************************************************************************************************************************/ @@ -1518,6 +1610,7 @@ class CDataTableScatterPlotOptions : public CBase { inline LibMCEnv_double GetYAxisScaling(); inline LibMCEnv_double GetYAxisOffset(); inline void AddDataChannel(const std::string & sChannelIdentifier, const std::string & sColumnIdentifier, const LibMCEnv_double dScaleFactor, const LibMCEnv_double dOffsetFactor, const LibMCEnv_uint32 nColor); + inline PScatterPlotDataChannelIterator ListDataChannels(); }; /************************************************************************************************************************* @@ -3372,6 +3465,14 @@ class CUIEnvironment : public CBase { pWrapperTable->m_DiscreteFieldData2D_Duplicate = nullptr; pWrapperTable->m_DataTableCSVWriteOptions_GetSeparator = nullptr; pWrapperTable->m_DataTableCSVWriteOptions_SetSeparator = nullptr; + pWrapperTable->m_ScatterPlotDataColumn_GetColumnIdentifier = nullptr; + pWrapperTable->m_ScatterPlotDataColumn_GetScaleFactor = nullptr; + pWrapperTable->m_ScatterPlotDataColumn_GetOffsetFactor = nullptr; + pWrapperTable->m_ScatterPlotDataColumnIterator_GetCurrentScatterPlotDataColumn = nullptr; + pWrapperTable->m_ScatterPlotDataChannel_GetChannelIdentifier = nullptr; + pWrapperTable->m_ScatterPlotDataChannel_AddScatterPlotDataColumn = nullptr; + pWrapperTable->m_ScatterPlotDataChannel_ListScatterPlotDataColumns = nullptr; + pWrapperTable->m_ScatterPlotDataChannelIterator_GetCurrentScatterPlotDataChannel = nullptr; pWrapperTable->m_DataTableScatterPlotOptions_SetXAxisColumn = nullptr; pWrapperTable->m_DataTableScatterPlotOptions_GetXAxisColumn = nullptr; pWrapperTable->m_DataTableScatterPlotOptions_GetXAxisScaling = nullptr; @@ -3381,6 +3482,7 @@ class CUIEnvironment : public CBase { pWrapperTable->m_DataTableScatterPlotOptions_GetYAxisScaling = nullptr; pWrapperTable->m_DataTableScatterPlotOptions_GetYAxisOffset = nullptr; pWrapperTable->m_DataTableScatterPlotOptions_AddDataChannel = nullptr; + pWrapperTable->m_DataTableScatterPlotOptions_ListDataChannels = nullptr; pWrapperTable->m_DataTable_AddColumn = nullptr; pWrapperTable->m_DataTable_RemoveColumn = nullptr; pWrapperTable->m_DataTable_Clear = nullptr; @@ -4983,6 +5085,78 @@ class CUIEnvironment : public CBase { if (pWrapperTable->m_DataTableCSVWriteOptions_SetSeparator == nullptr) return LIBMCENV_ERROR_COULDNOTFINDLIBRARYEXPORT; + #ifdef _WIN32 + pWrapperTable->m_ScatterPlotDataColumn_GetColumnIdentifier = (PLibMCEnvScatterPlotDataColumn_GetColumnIdentifierPtr) GetProcAddress(hLibrary, "libmcenv_scatterplotdatacolumn_getcolumnidentifier"); + #else // _WIN32 + pWrapperTable->m_ScatterPlotDataColumn_GetColumnIdentifier = (PLibMCEnvScatterPlotDataColumn_GetColumnIdentifierPtr) dlsym(hLibrary, "libmcenv_scatterplotdatacolumn_getcolumnidentifier"); + dlerror(); + #endif // _WIN32 + if (pWrapperTable->m_ScatterPlotDataColumn_GetColumnIdentifier == nullptr) + return LIBMCENV_ERROR_COULDNOTFINDLIBRARYEXPORT; + + #ifdef _WIN32 + pWrapperTable->m_ScatterPlotDataColumn_GetScaleFactor = (PLibMCEnvScatterPlotDataColumn_GetScaleFactorPtr) GetProcAddress(hLibrary, "libmcenv_scatterplotdatacolumn_getscalefactor"); + #else // _WIN32 + pWrapperTable->m_ScatterPlotDataColumn_GetScaleFactor = (PLibMCEnvScatterPlotDataColumn_GetScaleFactorPtr) dlsym(hLibrary, "libmcenv_scatterplotdatacolumn_getscalefactor"); + dlerror(); + #endif // _WIN32 + if (pWrapperTable->m_ScatterPlotDataColumn_GetScaleFactor == nullptr) + return LIBMCENV_ERROR_COULDNOTFINDLIBRARYEXPORT; + + #ifdef _WIN32 + pWrapperTable->m_ScatterPlotDataColumn_GetOffsetFactor = (PLibMCEnvScatterPlotDataColumn_GetOffsetFactorPtr) GetProcAddress(hLibrary, "libmcenv_scatterplotdatacolumn_getoffsetfactor"); + #else // _WIN32 + pWrapperTable->m_ScatterPlotDataColumn_GetOffsetFactor = (PLibMCEnvScatterPlotDataColumn_GetOffsetFactorPtr) dlsym(hLibrary, "libmcenv_scatterplotdatacolumn_getoffsetfactor"); + dlerror(); + #endif // _WIN32 + if (pWrapperTable->m_ScatterPlotDataColumn_GetOffsetFactor == nullptr) + return LIBMCENV_ERROR_COULDNOTFINDLIBRARYEXPORT; + + #ifdef _WIN32 + pWrapperTable->m_ScatterPlotDataColumnIterator_GetCurrentScatterPlotDataColumn = (PLibMCEnvScatterPlotDataColumnIterator_GetCurrentScatterPlotDataColumnPtr) GetProcAddress(hLibrary, "libmcenv_scatterplotdatacolumniterator_getcurrentscatterplotdatacolumn"); + #else // _WIN32 + pWrapperTable->m_ScatterPlotDataColumnIterator_GetCurrentScatterPlotDataColumn = (PLibMCEnvScatterPlotDataColumnIterator_GetCurrentScatterPlotDataColumnPtr) dlsym(hLibrary, "libmcenv_scatterplotdatacolumniterator_getcurrentscatterplotdatacolumn"); + dlerror(); + #endif // _WIN32 + if (pWrapperTable->m_ScatterPlotDataColumnIterator_GetCurrentScatterPlotDataColumn == nullptr) + return LIBMCENV_ERROR_COULDNOTFINDLIBRARYEXPORT; + + #ifdef _WIN32 + pWrapperTable->m_ScatterPlotDataChannel_GetChannelIdentifier = (PLibMCEnvScatterPlotDataChannel_GetChannelIdentifierPtr) GetProcAddress(hLibrary, "libmcenv_scatterplotdatachannel_getchannelidentifier"); + #else // _WIN32 + pWrapperTable->m_ScatterPlotDataChannel_GetChannelIdentifier = (PLibMCEnvScatterPlotDataChannel_GetChannelIdentifierPtr) dlsym(hLibrary, "libmcenv_scatterplotdatachannel_getchannelidentifier"); + dlerror(); + #endif // _WIN32 + if (pWrapperTable->m_ScatterPlotDataChannel_GetChannelIdentifier == nullptr) + return LIBMCENV_ERROR_COULDNOTFINDLIBRARYEXPORT; + + #ifdef _WIN32 + pWrapperTable->m_ScatterPlotDataChannel_AddScatterPlotDataColumn = (PLibMCEnvScatterPlotDataChannel_AddScatterPlotDataColumnPtr) GetProcAddress(hLibrary, "libmcenv_scatterplotdatachannel_addscatterplotdatacolumn"); + #else // _WIN32 + pWrapperTable->m_ScatterPlotDataChannel_AddScatterPlotDataColumn = (PLibMCEnvScatterPlotDataChannel_AddScatterPlotDataColumnPtr) dlsym(hLibrary, "libmcenv_scatterplotdatachannel_addscatterplotdatacolumn"); + dlerror(); + #endif // _WIN32 + if (pWrapperTable->m_ScatterPlotDataChannel_AddScatterPlotDataColumn == nullptr) + return LIBMCENV_ERROR_COULDNOTFINDLIBRARYEXPORT; + + #ifdef _WIN32 + pWrapperTable->m_ScatterPlotDataChannel_ListScatterPlotDataColumns = (PLibMCEnvScatterPlotDataChannel_ListScatterPlotDataColumnsPtr) GetProcAddress(hLibrary, "libmcenv_scatterplotdatachannel_listscatterplotdatacolumns"); + #else // _WIN32 + pWrapperTable->m_ScatterPlotDataChannel_ListScatterPlotDataColumns = (PLibMCEnvScatterPlotDataChannel_ListScatterPlotDataColumnsPtr) dlsym(hLibrary, "libmcenv_scatterplotdatachannel_listscatterplotdatacolumns"); + dlerror(); + #endif // _WIN32 + if (pWrapperTable->m_ScatterPlotDataChannel_ListScatterPlotDataColumns == nullptr) + return LIBMCENV_ERROR_COULDNOTFINDLIBRARYEXPORT; + + #ifdef _WIN32 + pWrapperTable->m_ScatterPlotDataChannelIterator_GetCurrentScatterPlotDataChannel = (PLibMCEnvScatterPlotDataChannelIterator_GetCurrentScatterPlotDataChannelPtr) GetProcAddress(hLibrary, "libmcenv_scatterplotdatachanneliterator_getcurrentscatterplotdatachannel"); + #else // _WIN32 + pWrapperTable->m_ScatterPlotDataChannelIterator_GetCurrentScatterPlotDataChannel = (PLibMCEnvScatterPlotDataChannelIterator_GetCurrentScatterPlotDataChannelPtr) dlsym(hLibrary, "libmcenv_scatterplotdatachanneliterator_getcurrentscatterplotdatachannel"); + dlerror(); + #endif // _WIN32 + if (pWrapperTable->m_ScatterPlotDataChannelIterator_GetCurrentScatterPlotDataChannel == nullptr) + return LIBMCENV_ERROR_COULDNOTFINDLIBRARYEXPORT; + #ifdef _WIN32 pWrapperTable->m_DataTableScatterPlotOptions_SetXAxisColumn = (PLibMCEnvDataTableScatterPlotOptions_SetXAxisColumnPtr) GetProcAddress(hLibrary, "libmcenv_datatablescatterplotoptions_setxaxiscolumn"); #else // _WIN32 @@ -5064,6 +5238,15 @@ class CUIEnvironment : public CBase { if (pWrapperTable->m_DataTableScatterPlotOptions_AddDataChannel == nullptr) return LIBMCENV_ERROR_COULDNOTFINDLIBRARYEXPORT; + #ifdef _WIN32 + pWrapperTable->m_DataTableScatterPlotOptions_ListDataChannels = (PLibMCEnvDataTableScatterPlotOptions_ListDataChannelsPtr) GetProcAddress(hLibrary, "libmcenv_datatablescatterplotoptions_listdatachannels"); + #else // _WIN32 + pWrapperTable->m_DataTableScatterPlotOptions_ListDataChannels = (PLibMCEnvDataTableScatterPlotOptions_ListDataChannelsPtr) dlsym(hLibrary, "libmcenv_datatablescatterplotoptions_listdatachannels"); + dlerror(); + #endif // _WIN32 + if (pWrapperTable->m_DataTableScatterPlotOptions_ListDataChannels == nullptr) + return LIBMCENV_ERROR_COULDNOTFINDLIBRARYEXPORT; + #ifdef _WIN32 pWrapperTable->m_DataTable_AddColumn = (PLibMCEnvDataTable_AddColumnPtr) GetProcAddress(hLibrary, "libmcenv_datatable_addcolumn"); #else // _WIN32 @@ -13042,6 +13225,38 @@ class CUIEnvironment : public CBase { if ( (eLookupError != 0) || (pWrapperTable->m_DataTableCSVWriteOptions_SetSeparator == nullptr) ) return LIBMCENV_ERROR_COULDNOTFINDLIBRARYEXPORT; + eLookupError = (*pLookup)("libmcenv_scatterplotdatacolumn_getcolumnidentifier", (void**)&(pWrapperTable->m_ScatterPlotDataColumn_GetColumnIdentifier)); + if ( (eLookupError != 0) || (pWrapperTable->m_ScatterPlotDataColumn_GetColumnIdentifier == nullptr) ) + return LIBMCENV_ERROR_COULDNOTFINDLIBRARYEXPORT; + + eLookupError = (*pLookup)("libmcenv_scatterplotdatacolumn_getscalefactor", (void**)&(pWrapperTable->m_ScatterPlotDataColumn_GetScaleFactor)); + if ( (eLookupError != 0) || (pWrapperTable->m_ScatterPlotDataColumn_GetScaleFactor == nullptr) ) + return LIBMCENV_ERROR_COULDNOTFINDLIBRARYEXPORT; + + eLookupError = (*pLookup)("libmcenv_scatterplotdatacolumn_getoffsetfactor", (void**)&(pWrapperTable->m_ScatterPlotDataColumn_GetOffsetFactor)); + if ( (eLookupError != 0) || (pWrapperTable->m_ScatterPlotDataColumn_GetOffsetFactor == nullptr) ) + return LIBMCENV_ERROR_COULDNOTFINDLIBRARYEXPORT; + + eLookupError = (*pLookup)("libmcenv_scatterplotdatacolumniterator_getcurrentscatterplotdatacolumn", (void**)&(pWrapperTable->m_ScatterPlotDataColumnIterator_GetCurrentScatterPlotDataColumn)); + if ( (eLookupError != 0) || (pWrapperTable->m_ScatterPlotDataColumnIterator_GetCurrentScatterPlotDataColumn == nullptr) ) + return LIBMCENV_ERROR_COULDNOTFINDLIBRARYEXPORT; + + eLookupError = (*pLookup)("libmcenv_scatterplotdatachannel_getchannelidentifier", (void**)&(pWrapperTable->m_ScatterPlotDataChannel_GetChannelIdentifier)); + if ( (eLookupError != 0) || (pWrapperTable->m_ScatterPlotDataChannel_GetChannelIdentifier == nullptr) ) + return LIBMCENV_ERROR_COULDNOTFINDLIBRARYEXPORT; + + eLookupError = (*pLookup)("libmcenv_scatterplotdatachannel_addscatterplotdatacolumn", (void**)&(pWrapperTable->m_ScatterPlotDataChannel_AddScatterPlotDataColumn)); + if ( (eLookupError != 0) || (pWrapperTable->m_ScatterPlotDataChannel_AddScatterPlotDataColumn == nullptr) ) + return LIBMCENV_ERROR_COULDNOTFINDLIBRARYEXPORT; + + eLookupError = (*pLookup)("libmcenv_scatterplotdatachannel_listscatterplotdatacolumns", (void**)&(pWrapperTable->m_ScatterPlotDataChannel_ListScatterPlotDataColumns)); + if ( (eLookupError != 0) || (pWrapperTable->m_ScatterPlotDataChannel_ListScatterPlotDataColumns == nullptr) ) + return LIBMCENV_ERROR_COULDNOTFINDLIBRARYEXPORT; + + eLookupError = (*pLookup)("libmcenv_scatterplotdatachanneliterator_getcurrentscatterplotdatachannel", (void**)&(pWrapperTable->m_ScatterPlotDataChannelIterator_GetCurrentScatterPlotDataChannel)); + if ( (eLookupError != 0) || (pWrapperTable->m_ScatterPlotDataChannelIterator_GetCurrentScatterPlotDataChannel == nullptr) ) + return LIBMCENV_ERROR_COULDNOTFINDLIBRARYEXPORT; + eLookupError = (*pLookup)("libmcenv_datatablescatterplotoptions_setxaxiscolumn", (void**)&(pWrapperTable->m_DataTableScatterPlotOptions_SetXAxisColumn)); if ( (eLookupError != 0) || (pWrapperTable->m_DataTableScatterPlotOptions_SetXAxisColumn == nullptr) ) return LIBMCENV_ERROR_COULDNOTFINDLIBRARYEXPORT; @@ -13078,6 +13293,10 @@ class CUIEnvironment : public CBase { if ( (eLookupError != 0) || (pWrapperTable->m_DataTableScatterPlotOptions_AddDataChannel == nullptr) ) return LIBMCENV_ERROR_COULDNOTFINDLIBRARYEXPORT; + eLookupError = (*pLookup)("libmcenv_datatablescatterplotoptions_listdatachannels", (void**)&(pWrapperTable->m_DataTableScatterPlotOptions_ListDataChannels)); + if ( (eLookupError != 0) || (pWrapperTable->m_DataTableScatterPlotOptions_ListDataChannels == nullptr) ) + return LIBMCENV_ERROR_COULDNOTFINDLIBRARYEXPORT; + eLookupError = (*pLookup)("libmcenv_datatable_addcolumn", (void**)&(pWrapperTable->m_DataTable_AddColumn)); if ( (eLookupError != 0) || (pWrapperTable->m_DataTable_AddColumn == nullptr) ) return LIBMCENV_ERROR_COULDNOTFINDLIBRARYEXPORT; @@ -17550,6 +17769,131 @@ class CUIEnvironment : public CBase { CheckError(m_pWrapper->m_WrapperTable.m_DataTableCSVWriteOptions_SetSeparator(m_pHandle, sSeparator.c_str())); } + /** + * Method definitions for class CScatterPlotDataColumn + */ + + /** + * CScatterPlotDataColumn::GetColumnIdentifier - Returns the Column Identifier. + * @return Identifier of the column to use. Must be alphanumeric and not empty. + */ + std::string CScatterPlotDataColumn::GetColumnIdentifier() + { + LibMCEnv_uint32 bytesNeededColumnIdentifier = 0; + LibMCEnv_uint32 bytesWrittenColumnIdentifier = 0; + CheckError(m_pWrapper->m_WrapperTable.m_ScatterPlotDataColumn_GetColumnIdentifier(m_pHandle, 0, &bytesNeededColumnIdentifier, nullptr)); + std::vector bufferColumnIdentifier(bytesNeededColumnIdentifier); + CheckError(m_pWrapper->m_WrapperTable.m_ScatterPlotDataColumn_GetColumnIdentifier(m_pHandle, bytesNeededColumnIdentifier, &bytesWrittenColumnIdentifier, &bufferColumnIdentifier[0])); + + return std::string(&bufferColumnIdentifier[0]); + } + + /** + * CScatterPlotDataColumn::GetScaleFactor - Returns Scale Factor to use. + * @return Scale factor to use. The channel value will be computed as raw value times scale factor plus offset factor. + */ + LibMCEnv_double CScatterPlotDataColumn::GetScaleFactor() + { + LibMCEnv_double resultScaleFactor = 0; + CheckError(m_pWrapper->m_WrapperTable.m_ScatterPlotDataColumn_GetScaleFactor(m_pHandle, &resultScaleFactor)); + + return resultScaleFactor; + } + + /** + * CScatterPlotDataColumn::GetOffsetFactor - Returns Offset Factor to use. + * @return Offset factor to use. The channel value will be computed as raw value times scale factor plus offset factor. + */ + LibMCEnv_double CScatterPlotDataColumn::GetOffsetFactor() + { + LibMCEnv_double resultOffsetFactor = 0; + CheckError(m_pWrapper->m_WrapperTable.m_ScatterPlotDataColumn_GetOffsetFactor(m_pHandle, &resultOffsetFactor)); + + return resultOffsetFactor; + } + + /** + * Method definitions for class CScatterPlotDataColumnIterator + */ + + /** + * CScatterPlotDataColumnIterator::GetCurrentScatterPlotDataColumn - Returns the Current Channel Column the iterator points at. + * @return returns the DataChannel instance. + */ + PScatterPlotDataColumn CScatterPlotDataColumnIterator::GetCurrentScatterPlotDataColumn() + { + LibMCEnvHandle hScatterPlotDataColumnInstance = nullptr; + CheckError(m_pWrapper->m_WrapperTable.m_ScatterPlotDataColumnIterator_GetCurrentScatterPlotDataColumn(m_pHandle, &hScatterPlotDataColumnInstance)); + + if (!hScatterPlotDataColumnInstance) { + CheckError(LIBMCENV_ERROR_INVALIDPARAM); + } + return std::make_shared(m_pWrapper, hScatterPlotDataColumnInstance); + } + + /** + * Method definitions for class CScatterPlotDataChannel + */ + + /** + * CScatterPlotDataChannel::GetChannelIdentifier - Returns the Scatter Plot Data Channel Identifier. + * @return Identifier of the channel. Must be alphanumeric and not empty. + */ + std::string CScatterPlotDataChannel::GetChannelIdentifier() + { + LibMCEnv_uint32 bytesNeededChannelIdentifier = 0; + LibMCEnv_uint32 bytesWrittenChannelIdentifier = 0; + CheckError(m_pWrapper->m_WrapperTable.m_ScatterPlotDataChannel_GetChannelIdentifier(m_pHandle, 0, &bytesNeededChannelIdentifier, nullptr)); + std::vector bufferChannelIdentifier(bytesNeededChannelIdentifier); + CheckError(m_pWrapper->m_WrapperTable.m_ScatterPlotDataChannel_GetChannelIdentifier(m_pHandle, bytesNeededChannelIdentifier, &bytesWrittenChannelIdentifier, &bufferChannelIdentifier[0])); + + return std::string(&bufferChannelIdentifier[0]); + } + + /** + * CScatterPlotDataChannel::AddScatterPlotDataColumn - Adds a new Columns to the Data Channel. + * @param[in] pColumnInstance - Column Instance + */ + void CScatterPlotDataChannel::AddScatterPlotDataColumn(classParam pColumnInstance) + { + LibMCEnvHandle hColumnInstance = pColumnInstance.GetHandle(); + CheckError(m_pWrapper->m_WrapperTable.m_ScatterPlotDataChannel_AddScatterPlotDataColumn(m_pHandle, hColumnInstance)); + } + + /** + * CScatterPlotDataChannel::ListScatterPlotDataColumns - Lists all Columns of the Data Channel. + * @return Iterator instance. + */ + PScatterPlotDataColumnIterator CScatterPlotDataChannel::ListScatterPlotDataColumns() + { + LibMCEnvHandle hIteratorInstance = nullptr; + CheckError(m_pWrapper->m_WrapperTable.m_ScatterPlotDataChannel_ListScatterPlotDataColumns(m_pHandle, &hIteratorInstance)); + + if (!hIteratorInstance) { + CheckError(LIBMCENV_ERROR_INVALIDPARAM); + } + return std::make_shared(m_pWrapper, hIteratorInstance); + } + + /** + * Method definitions for class CScatterPlotDataChannelIterator + */ + + /** + * CScatterPlotDataChannelIterator::GetCurrentScatterPlotDataChannel - Returns the Current Scatter Plot Data Channel the iterator points at. + * @return returns the ScatterPlotDataChannel instance. + */ + PScatterPlotDataChannel CScatterPlotDataChannelIterator::GetCurrentScatterPlotDataChannel() + { + LibMCEnvHandle hScatterPlotDataChannelInstance = nullptr; + CheckError(m_pWrapper->m_WrapperTable.m_ScatterPlotDataChannelIterator_GetCurrentScatterPlotDataChannel(m_pHandle, &hScatterPlotDataChannelInstance)); + + if (!hScatterPlotDataChannelInstance) { + CheckError(LIBMCENV_ERROR_INVALIDPARAM); + } + return std::make_shared(m_pWrapper, hScatterPlotDataChannelInstance); + } + /** * Method definitions for class CDataTableScatterPlotOptions */ @@ -17667,6 +18011,21 @@ class CUIEnvironment : public CBase { CheckError(m_pWrapper->m_WrapperTable.m_DataTableScatterPlotOptions_AddDataChannel(m_pHandle, sChannelIdentifier.c_str(), sColumnIdentifier.c_str(), dScaleFactor, dOffsetFactor, nColor)); } + /** + * CDataTableScatterPlotOptions::ListDataChannels - Lists all DataChannels of the ScatterPlot. + * @return Iterator instance. + */ + PScatterPlotDataChannelIterator CDataTableScatterPlotOptions::ListDataChannels() + { + LibMCEnvHandle hIteratorInstance = nullptr; + CheckError(m_pWrapper->m_WrapperTable.m_DataTableScatterPlotOptions_ListDataChannels(m_pHandle, &hIteratorInstance)); + + if (!hIteratorInstance) { + CheckError(LIBMCENV_ERROR_INVALIDPARAM); + } + return std::make_shared(m_pWrapper, hIteratorInstance); + } + /** * Method definitions for class CDataTable */ diff --git a/Framework/HeadersDev/CppDynamic/libmcenv_types.hpp b/Framework/HeadersDev/CppDynamic/libmcenv_types.hpp index c1765408..8ee9a94b 100644 --- a/Framework/HeadersDev/CppDynamic/libmcenv_types.hpp +++ b/Framework/HeadersDev/CppDynamic/libmcenv_types.hpp @@ -618,6 +618,10 @@ typedef LibMCEnvHandle LibMCEnv_DiscreteFieldData2DStoreOptions; typedef LibMCEnvHandle LibMCEnv_DiscreteFieldData2D; typedef LibMCEnvHandle LibMCEnv_DataTableWriteOptions; typedef LibMCEnvHandle LibMCEnv_DataTableCSVWriteOptions; +typedef LibMCEnvHandle LibMCEnv_ScatterPlotDataColumn; +typedef LibMCEnvHandle LibMCEnv_ScatterPlotDataColumnIterator; +typedef LibMCEnvHandle LibMCEnv_ScatterPlotDataChannel; +typedef LibMCEnvHandle LibMCEnv_ScatterPlotDataChannelIterator; typedef LibMCEnvHandle LibMCEnv_DataTableScatterPlotOptions; typedef LibMCEnvHandle LibMCEnv_DataTable; typedef LibMCEnvHandle LibMCEnv_DataSeries; diff --git a/Framework/InterfacesCore/libmcenv_abi.hpp b/Framework/InterfacesCore/libmcenv_abi.hpp index c8a56302..d4b511fa 100644 --- a/Framework/InterfacesCore/libmcenv_abi.hpp +++ b/Framework/InterfacesCore/libmcenv_abi.hpp @@ -977,6 +977,98 @@ LIBMCENV_DECLSPEC LibMCEnvResult libmcenv_datatablecsvwriteoptions_getseparator( */ LIBMCENV_DECLSPEC LibMCEnvResult libmcenv_datatablecsvwriteoptions_setseparator(LibMCEnv_DataTableCSVWriteOptions pDataTableCSVWriteOptions, const char * pSeparator); +/************************************************************************************************************************* + Class definition for ScatterPlotDataColumn +**************************************************************************************************************************/ + +/** +* Returns the Column Identifier. +* +* @param[in] pScatterPlotDataColumn - ScatterPlotDataColumn instance. +* @param[in] nColumnIdentifierBufferSize - size of the buffer (including trailing 0) +* @param[out] pColumnIdentifierNeededChars - will be filled with the count of the written bytes, or needed buffer size. +* @param[out] pColumnIdentifierBuffer - buffer of Identifier of the column to use. Must be alphanumeric and not empty., may be NULL +* @return error code or 0 (success) +*/ +LIBMCENV_DECLSPEC LibMCEnvResult libmcenv_scatterplotdatacolumn_getcolumnidentifier(LibMCEnv_ScatterPlotDataColumn pScatterPlotDataColumn, const LibMCEnv_uint32 nColumnIdentifierBufferSize, LibMCEnv_uint32* pColumnIdentifierNeededChars, char * pColumnIdentifierBuffer); + +/** +* Returns Scale Factor to use. +* +* @param[in] pScatterPlotDataColumn - ScatterPlotDataColumn instance. +* @param[out] pScaleFactor - Scale factor to use. The channel value will be computed as raw value times scale factor plus offset factor. +* @return error code or 0 (success) +*/ +LIBMCENV_DECLSPEC LibMCEnvResult libmcenv_scatterplotdatacolumn_getscalefactor(LibMCEnv_ScatterPlotDataColumn pScatterPlotDataColumn, LibMCEnv_double * pScaleFactor); + +/** +* Returns Offset Factor to use. +* +* @param[in] pScatterPlotDataColumn - ScatterPlotDataColumn instance. +* @param[out] pOffsetFactor - Offset factor to use. The channel value will be computed as raw value times scale factor plus offset factor. +* @return error code or 0 (success) +*/ +LIBMCENV_DECLSPEC LibMCEnvResult libmcenv_scatterplotdatacolumn_getoffsetfactor(LibMCEnv_ScatterPlotDataColumn pScatterPlotDataColumn, LibMCEnv_double * pOffsetFactor); + +/************************************************************************************************************************* + Class definition for ScatterPlotDataColumnIterator +**************************************************************************************************************************/ + +/** +* Returns the Current Channel Column the iterator points at. +* +* @param[in] pScatterPlotDataColumnIterator - ScatterPlotDataColumnIterator instance. +* @param[out] pScatterPlotDataColumnInstance - returns the DataChannel instance. +* @return error code or 0 (success) +*/ +LIBMCENV_DECLSPEC LibMCEnvResult libmcenv_scatterplotdatacolumniterator_getcurrentscatterplotdatacolumn(LibMCEnv_ScatterPlotDataColumnIterator pScatterPlotDataColumnIterator, LibMCEnv_ScatterPlotDataColumn * pScatterPlotDataColumnInstance); + +/************************************************************************************************************************* + Class definition for ScatterPlotDataChannel +**************************************************************************************************************************/ + +/** +* Returns the Scatter Plot Data Channel Identifier. +* +* @param[in] pScatterPlotDataChannel - ScatterPlotDataChannel instance. +* @param[in] nChannelIdentifierBufferSize - size of the buffer (including trailing 0) +* @param[out] pChannelIdentifierNeededChars - will be filled with the count of the written bytes, or needed buffer size. +* @param[out] pChannelIdentifierBuffer - buffer of Identifier of the channel. Must be alphanumeric and not empty., may be NULL +* @return error code or 0 (success) +*/ +LIBMCENV_DECLSPEC LibMCEnvResult libmcenv_scatterplotdatachannel_getchannelidentifier(LibMCEnv_ScatterPlotDataChannel pScatterPlotDataChannel, const LibMCEnv_uint32 nChannelIdentifierBufferSize, LibMCEnv_uint32* pChannelIdentifierNeededChars, char * pChannelIdentifierBuffer); + +/** +* Adds a new Columns to the Data Channel. +* +* @param[in] pScatterPlotDataChannel - ScatterPlotDataChannel instance. +* @param[in] pColumnInstance - Column Instance +* @return error code or 0 (success) +*/ +LIBMCENV_DECLSPEC LibMCEnvResult libmcenv_scatterplotdatachannel_addscatterplotdatacolumn(LibMCEnv_ScatterPlotDataChannel pScatterPlotDataChannel, LibMCEnv_ScatterPlotDataColumn pColumnInstance); + +/** +* Lists all Columns of the Data Channel. +* +* @param[in] pScatterPlotDataChannel - ScatterPlotDataChannel instance. +* @param[out] pIteratorInstance - Iterator instance. +* @return error code or 0 (success) +*/ +LIBMCENV_DECLSPEC LibMCEnvResult libmcenv_scatterplotdatachannel_listscatterplotdatacolumns(LibMCEnv_ScatterPlotDataChannel pScatterPlotDataChannel, LibMCEnv_ScatterPlotDataColumnIterator * pIteratorInstance); + +/************************************************************************************************************************* + Class definition for ScatterPlotDataChannelIterator +**************************************************************************************************************************/ + +/** +* Returns the Current Scatter Plot Data Channel the iterator points at. +* +* @param[in] pScatterPlotDataChannelIterator - ScatterPlotDataChannelIterator instance. +* @param[out] pScatterPlotDataChannelInstance - returns the ScatterPlotDataChannel instance. +* @return error code or 0 (success) +*/ +LIBMCENV_DECLSPEC LibMCEnvResult libmcenv_scatterplotdatachanneliterator_getcurrentscatterplotdatachannel(LibMCEnv_ScatterPlotDataChannelIterator pScatterPlotDataChannelIterator, LibMCEnv_ScatterPlotDataChannel * pScatterPlotDataChannelInstance); + /************************************************************************************************************************* Class definition for DataTableScatterPlotOptions **************************************************************************************************************************/ @@ -1074,6 +1166,15 @@ LIBMCENV_DECLSPEC LibMCEnvResult libmcenv_datatablescatterplotoptions_getyaxisof */ LIBMCENV_DECLSPEC LibMCEnvResult libmcenv_datatablescatterplotoptions_adddatachannel(LibMCEnv_DataTableScatterPlotOptions pDataTableScatterPlotOptions, const char * pChannelIdentifier, const char * pColumnIdentifier, LibMCEnv_double dScaleFactor, LibMCEnv_double dOffsetFactor, LibMCEnv_uint32 nColor); +/** +* Lists all DataChannels of the ScatterPlot. +* +* @param[in] pDataTableScatterPlotOptions - DataTableScatterPlotOptions instance. +* @param[out] pIteratorInstance - Iterator instance. +* @return error code or 0 (success) +*/ +LIBMCENV_DECLSPEC LibMCEnvResult libmcenv_datatablescatterplotoptions_listdatachannels(LibMCEnv_DataTableScatterPlotOptions pDataTableScatterPlotOptions, LibMCEnv_ScatterPlotDataChannelIterator * pIteratorInstance); + /************************************************************************************************************************* Class definition for DataTable **************************************************************************************************************************/ diff --git a/Framework/InterfacesCore/libmcenv_interfaces.hpp b/Framework/InterfacesCore/libmcenv_interfaces.hpp index f1a6f774..b4cbbe32 100644 --- a/Framework/InterfacesCore/libmcenv_interfaces.hpp +++ b/Framework/InterfacesCore/libmcenv_interfaces.hpp @@ -70,6 +70,10 @@ class IDiscreteFieldData2DStoreOptions; class IDiscreteFieldData2D; class IDataTableWriteOptions; class IDataTableCSVWriteOptions; +class IScatterPlotDataColumn; +class IScatterPlotDataColumnIterator; +class IScatterPlotDataChannel; +class IScatterPlotDataChannelIterator; class IDataTableScatterPlotOptions; class IDataTable; class IDataSeries; @@ -1120,6 +1124,98 @@ class IDataTableCSVWriteOptions : public virtual IBase { typedef IBaseSharedPtr PIDataTableCSVWriteOptions; +/************************************************************************************************************************* + Class interface for ScatterPlotDataColumn +**************************************************************************************************************************/ + +class IScatterPlotDataColumn : public virtual IBase { +public: + /** + * IScatterPlotDataColumn::GetColumnIdentifier - Returns the Column Identifier. + * @return Identifier of the column to use. Must be alphanumeric and not empty. + */ + virtual std::string GetColumnIdentifier() = 0; + + /** + * IScatterPlotDataColumn::GetScaleFactor - Returns Scale Factor to use. + * @return Scale factor to use. The channel value will be computed as raw value times scale factor plus offset factor. + */ + virtual LibMCEnv_double GetScaleFactor() = 0; + + /** + * IScatterPlotDataColumn::GetOffsetFactor - Returns Offset Factor to use. + * @return Offset factor to use. The channel value will be computed as raw value times scale factor plus offset factor. + */ + virtual LibMCEnv_double GetOffsetFactor() = 0; + +}; + +typedef IBaseSharedPtr PIScatterPlotDataColumn; + + +/************************************************************************************************************************* + Class interface for ScatterPlotDataColumnIterator +**************************************************************************************************************************/ + +class IScatterPlotDataColumnIterator : public virtual IIterator { +public: + /** + * IScatterPlotDataColumnIterator::GetCurrentScatterPlotDataColumn - Returns the Current Channel Column the iterator points at. + * @return returns the DataChannel instance. + */ + virtual IScatterPlotDataColumn * GetCurrentScatterPlotDataColumn() = 0; + +}; + +typedef IBaseSharedPtr PIScatterPlotDataColumnIterator; + + +/************************************************************************************************************************* + Class interface for ScatterPlotDataChannel +**************************************************************************************************************************/ + +class IScatterPlotDataChannel : public virtual IBase { +public: + /** + * IScatterPlotDataChannel::GetChannelIdentifier - Returns the Scatter Plot Data Channel Identifier. + * @return Identifier of the channel. Must be alphanumeric and not empty. + */ + virtual std::string GetChannelIdentifier() = 0; + + /** + * IScatterPlotDataChannel::AddScatterPlotDataColumn - Adds a new Columns to the Data Channel. + * @param[in] pColumnInstance - Column Instance + */ + virtual void AddScatterPlotDataColumn(IScatterPlotDataColumn* pColumnInstance) = 0; + + /** + * IScatterPlotDataChannel::ListScatterPlotDataColumns - Lists all Columns of the Data Channel. + * @return Iterator instance. + */ + virtual IScatterPlotDataColumnIterator * ListScatterPlotDataColumns() = 0; + +}; + +typedef IBaseSharedPtr PIScatterPlotDataChannel; + + +/************************************************************************************************************************* + Class interface for ScatterPlotDataChannelIterator +**************************************************************************************************************************/ + +class IScatterPlotDataChannelIterator : public virtual IIterator { +public: + /** + * IScatterPlotDataChannelIterator::GetCurrentScatterPlotDataChannel - Returns the Current Scatter Plot Data Channel the iterator points at. + * @return returns the ScatterPlotDataChannel instance. + */ + virtual IScatterPlotDataChannel * GetCurrentScatterPlotDataChannel() = 0; + +}; + +typedef IBaseSharedPtr PIScatterPlotDataChannelIterator; + + /************************************************************************************************************************* Class interface for DataTableScatterPlotOptions **************************************************************************************************************************/ @@ -1188,6 +1284,12 @@ class IDataTableScatterPlotOptions : public virtual IBase { */ virtual void AddDataChannel(const std::string & sChannelIdentifier, const std::string & sColumnIdentifier, const LibMCEnv_double dScaleFactor, const LibMCEnv_double dOffsetFactor, const LibMCEnv_uint32 nColor) = 0; + /** + * IDataTableScatterPlotOptions::ListDataChannels - Lists all DataChannels of the ScatterPlot. + * @return Iterator instance. + */ + virtual IScatterPlotDataChannelIterator * ListDataChannels() = 0; + }; typedef IBaseSharedPtr PIDataTableScatterPlotOptions; diff --git a/Framework/InterfacesCore/libmcenv_interfacewrapper.cpp b/Framework/InterfacesCore/libmcenv_interfacewrapper.cpp index 1279fdbb..d91d36c9 100644 --- a/Framework/InterfacesCore/libmcenv_interfacewrapper.cpp +++ b/Framework/InterfacesCore/libmcenv_interfacewrapper.cpp @@ -2406,6 +2406,283 @@ LibMCEnvResult libmcenv_datatablecsvwriteoptions_setseparator(LibMCEnv_DataTable } +/************************************************************************************************************************* + Class implementation for ScatterPlotDataColumn +**************************************************************************************************************************/ +LibMCEnvResult libmcenv_scatterplotdatacolumn_getcolumnidentifier(LibMCEnv_ScatterPlotDataColumn pScatterPlotDataColumn, const LibMCEnv_uint32 nColumnIdentifierBufferSize, LibMCEnv_uint32* pColumnIdentifierNeededChars, char * pColumnIdentifierBuffer) +{ + IBase* pIBaseClass = (IBase *)pScatterPlotDataColumn; + + try { + if ( (!pColumnIdentifierBuffer) && !(pColumnIdentifierNeededChars) ) + throw ELibMCEnvInterfaceException (LIBMCENV_ERROR_INVALIDPARAM); + std::string sColumnIdentifier(""); + IScatterPlotDataColumn* pIScatterPlotDataColumn = dynamic_cast(pIBaseClass); + if (!pIScatterPlotDataColumn) + throw ELibMCEnvInterfaceException(LIBMCENV_ERROR_INVALIDCAST); + + bool isCacheCall = (pColumnIdentifierBuffer == nullptr); + if (isCacheCall) { + sColumnIdentifier = pIScatterPlotDataColumn->GetColumnIdentifier(); + + pIScatterPlotDataColumn->_setCache (new ParameterCache_1 (sColumnIdentifier)); + } + else { + auto cache = dynamic_cast*> (pIScatterPlotDataColumn->_getCache ()); + if (cache == nullptr) + throw ELibMCEnvInterfaceException(LIBMCENV_ERROR_INVALIDCAST); + cache->retrieveData (sColumnIdentifier); + pIScatterPlotDataColumn->_setCache (nullptr); + } + + if (pColumnIdentifierNeededChars) + *pColumnIdentifierNeededChars = (LibMCEnv_uint32) (sColumnIdentifier.size()+1); + if (pColumnIdentifierBuffer) { + if (sColumnIdentifier.size() >= nColumnIdentifierBufferSize) + throw ELibMCEnvInterfaceException (LIBMCENV_ERROR_BUFFERTOOSMALL); + for (size_t iColumnIdentifier = 0; iColumnIdentifier < sColumnIdentifier.size(); iColumnIdentifier++) + pColumnIdentifierBuffer[iColumnIdentifier] = sColumnIdentifier[iColumnIdentifier]; + pColumnIdentifierBuffer[sColumnIdentifier.size()] = 0; + } + return LIBMCENV_SUCCESS; + } + catch (ELibMCEnvInterfaceException & Exception) { + return handleLibMCEnvException(pIBaseClass, Exception); + } + catch (std::exception & StdException) { + return handleStdException(pIBaseClass, StdException); + } + catch (...) { + return handleUnhandledException(pIBaseClass); + } +} + +LibMCEnvResult libmcenv_scatterplotdatacolumn_getscalefactor(LibMCEnv_ScatterPlotDataColumn pScatterPlotDataColumn, LibMCEnv_double * pScaleFactor) +{ + IBase* pIBaseClass = (IBase *)pScatterPlotDataColumn; + + try { + if (pScaleFactor == nullptr) + throw ELibMCEnvInterfaceException (LIBMCENV_ERROR_INVALIDPARAM); + IScatterPlotDataColumn* pIScatterPlotDataColumn = dynamic_cast(pIBaseClass); + if (!pIScatterPlotDataColumn) + throw ELibMCEnvInterfaceException(LIBMCENV_ERROR_INVALIDCAST); + + *pScaleFactor = pIScatterPlotDataColumn->GetScaleFactor(); + + return LIBMCENV_SUCCESS; + } + catch (ELibMCEnvInterfaceException & Exception) { + return handleLibMCEnvException(pIBaseClass, Exception); + } + catch (std::exception & StdException) { + return handleStdException(pIBaseClass, StdException); + } + catch (...) { + return handleUnhandledException(pIBaseClass); + } +} + +LibMCEnvResult libmcenv_scatterplotdatacolumn_getoffsetfactor(LibMCEnv_ScatterPlotDataColumn pScatterPlotDataColumn, LibMCEnv_double * pOffsetFactor) +{ + IBase* pIBaseClass = (IBase *)pScatterPlotDataColumn; + + try { + if (pOffsetFactor == nullptr) + throw ELibMCEnvInterfaceException (LIBMCENV_ERROR_INVALIDPARAM); + IScatterPlotDataColumn* pIScatterPlotDataColumn = dynamic_cast(pIBaseClass); + if (!pIScatterPlotDataColumn) + throw ELibMCEnvInterfaceException(LIBMCENV_ERROR_INVALIDCAST); + + *pOffsetFactor = pIScatterPlotDataColumn->GetOffsetFactor(); + + return LIBMCENV_SUCCESS; + } + catch (ELibMCEnvInterfaceException & Exception) { + return handleLibMCEnvException(pIBaseClass, Exception); + } + catch (std::exception & StdException) { + return handleStdException(pIBaseClass, StdException); + } + catch (...) { + return handleUnhandledException(pIBaseClass); + } +} + + +/************************************************************************************************************************* + Class implementation for ScatterPlotDataColumnIterator +**************************************************************************************************************************/ +LibMCEnvResult libmcenv_scatterplotdatacolumniterator_getcurrentscatterplotdatacolumn(LibMCEnv_ScatterPlotDataColumnIterator pScatterPlotDataColumnIterator, LibMCEnv_ScatterPlotDataColumn * pScatterPlotDataColumnInstance) +{ + IBase* pIBaseClass = (IBase *)pScatterPlotDataColumnIterator; + + try { + if (pScatterPlotDataColumnInstance == nullptr) + throw ELibMCEnvInterfaceException (LIBMCENV_ERROR_INVALIDPARAM); + IBase* pBaseScatterPlotDataColumnInstance(nullptr); + IScatterPlotDataColumnIterator* pIScatterPlotDataColumnIterator = dynamic_cast(pIBaseClass); + if (!pIScatterPlotDataColumnIterator) + throw ELibMCEnvInterfaceException(LIBMCENV_ERROR_INVALIDCAST); + + pBaseScatterPlotDataColumnInstance = pIScatterPlotDataColumnIterator->GetCurrentScatterPlotDataColumn(); + + *pScatterPlotDataColumnInstance = (IBase*)(pBaseScatterPlotDataColumnInstance); + return LIBMCENV_SUCCESS; + } + catch (ELibMCEnvInterfaceException & Exception) { + return handleLibMCEnvException(pIBaseClass, Exception); + } + catch (std::exception & StdException) { + return handleStdException(pIBaseClass, StdException); + } + catch (...) { + return handleUnhandledException(pIBaseClass); + } +} + + +/************************************************************************************************************************* + Class implementation for ScatterPlotDataChannel +**************************************************************************************************************************/ +LibMCEnvResult libmcenv_scatterplotdatachannel_getchannelidentifier(LibMCEnv_ScatterPlotDataChannel pScatterPlotDataChannel, const LibMCEnv_uint32 nChannelIdentifierBufferSize, LibMCEnv_uint32* pChannelIdentifierNeededChars, char * pChannelIdentifierBuffer) +{ + IBase* pIBaseClass = (IBase *)pScatterPlotDataChannel; + + try { + if ( (!pChannelIdentifierBuffer) && !(pChannelIdentifierNeededChars) ) + throw ELibMCEnvInterfaceException (LIBMCENV_ERROR_INVALIDPARAM); + std::string sChannelIdentifier(""); + IScatterPlotDataChannel* pIScatterPlotDataChannel = dynamic_cast(pIBaseClass); + if (!pIScatterPlotDataChannel) + throw ELibMCEnvInterfaceException(LIBMCENV_ERROR_INVALIDCAST); + + bool isCacheCall = (pChannelIdentifierBuffer == nullptr); + if (isCacheCall) { + sChannelIdentifier = pIScatterPlotDataChannel->GetChannelIdentifier(); + + pIScatterPlotDataChannel->_setCache (new ParameterCache_1 (sChannelIdentifier)); + } + else { + auto cache = dynamic_cast*> (pIScatterPlotDataChannel->_getCache ()); + if (cache == nullptr) + throw ELibMCEnvInterfaceException(LIBMCENV_ERROR_INVALIDCAST); + cache->retrieveData (sChannelIdentifier); + pIScatterPlotDataChannel->_setCache (nullptr); + } + + if (pChannelIdentifierNeededChars) + *pChannelIdentifierNeededChars = (LibMCEnv_uint32) (sChannelIdentifier.size()+1); + if (pChannelIdentifierBuffer) { + if (sChannelIdentifier.size() >= nChannelIdentifierBufferSize) + throw ELibMCEnvInterfaceException (LIBMCENV_ERROR_BUFFERTOOSMALL); + for (size_t iChannelIdentifier = 0; iChannelIdentifier < sChannelIdentifier.size(); iChannelIdentifier++) + pChannelIdentifierBuffer[iChannelIdentifier] = sChannelIdentifier[iChannelIdentifier]; + pChannelIdentifierBuffer[sChannelIdentifier.size()] = 0; + } + return LIBMCENV_SUCCESS; + } + catch (ELibMCEnvInterfaceException & Exception) { + return handleLibMCEnvException(pIBaseClass, Exception); + } + catch (std::exception & StdException) { + return handleStdException(pIBaseClass, StdException); + } + catch (...) { + return handleUnhandledException(pIBaseClass); + } +} + +LibMCEnvResult libmcenv_scatterplotdatachannel_addscatterplotdatacolumn(LibMCEnv_ScatterPlotDataChannel pScatterPlotDataChannel, LibMCEnv_ScatterPlotDataColumn pColumnInstance) +{ + IBase* pIBaseClass = (IBase *)pScatterPlotDataChannel; + + try { + IBase* pIBaseClassColumnInstance = (IBase *)pColumnInstance; + IScatterPlotDataColumn* pIColumnInstance = dynamic_cast(pIBaseClassColumnInstance); + if (!pIColumnInstance) + throw ELibMCEnvInterfaceException (LIBMCENV_ERROR_INVALIDCAST); + + IScatterPlotDataChannel* pIScatterPlotDataChannel = dynamic_cast(pIBaseClass); + if (!pIScatterPlotDataChannel) + throw ELibMCEnvInterfaceException(LIBMCENV_ERROR_INVALIDCAST); + + pIScatterPlotDataChannel->AddScatterPlotDataColumn(pIColumnInstance); + + return LIBMCENV_SUCCESS; + } + catch (ELibMCEnvInterfaceException & Exception) { + return handleLibMCEnvException(pIBaseClass, Exception); + } + catch (std::exception & StdException) { + return handleStdException(pIBaseClass, StdException); + } + catch (...) { + return handleUnhandledException(pIBaseClass); + } +} + +LibMCEnvResult libmcenv_scatterplotdatachannel_listscatterplotdatacolumns(LibMCEnv_ScatterPlotDataChannel pScatterPlotDataChannel, LibMCEnv_ScatterPlotDataColumnIterator * pIteratorInstance) +{ + IBase* pIBaseClass = (IBase *)pScatterPlotDataChannel; + + try { + if (pIteratorInstance == nullptr) + throw ELibMCEnvInterfaceException (LIBMCENV_ERROR_INVALIDPARAM); + IBase* pBaseIteratorInstance(nullptr); + IScatterPlotDataChannel* pIScatterPlotDataChannel = dynamic_cast(pIBaseClass); + if (!pIScatterPlotDataChannel) + throw ELibMCEnvInterfaceException(LIBMCENV_ERROR_INVALIDCAST); + + pBaseIteratorInstance = pIScatterPlotDataChannel->ListScatterPlotDataColumns(); + + *pIteratorInstance = (IBase*)(pBaseIteratorInstance); + return LIBMCENV_SUCCESS; + } + catch (ELibMCEnvInterfaceException & Exception) { + return handleLibMCEnvException(pIBaseClass, Exception); + } + catch (std::exception & StdException) { + return handleStdException(pIBaseClass, StdException); + } + catch (...) { + return handleUnhandledException(pIBaseClass); + } +} + + +/************************************************************************************************************************* + Class implementation for ScatterPlotDataChannelIterator +**************************************************************************************************************************/ +LibMCEnvResult libmcenv_scatterplotdatachanneliterator_getcurrentscatterplotdatachannel(LibMCEnv_ScatterPlotDataChannelIterator pScatterPlotDataChannelIterator, LibMCEnv_ScatterPlotDataChannel * pScatterPlotDataChannelInstance) +{ + IBase* pIBaseClass = (IBase *)pScatterPlotDataChannelIterator; + + try { + if (pScatterPlotDataChannelInstance == nullptr) + throw ELibMCEnvInterfaceException (LIBMCENV_ERROR_INVALIDPARAM); + IBase* pBaseScatterPlotDataChannelInstance(nullptr); + IScatterPlotDataChannelIterator* pIScatterPlotDataChannelIterator = dynamic_cast(pIBaseClass); + if (!pIScatterPlotDataChannelIterator) + throw ELibMCEnvInterfaceException(LIBMCENV_ERROR_INVALIDCAST); + + pBaseScatterPlotDataChannelInstance = pIScatterPlotDataChannelIterator->GetCurrentScatterPlotDataChannel(); + + *pScatterPlotDataChannelInstance = (IBase*)(pBaseScatterPlotDataChannelInstance); + return LIBMCENV_SUCCESS; + } + catch (ELibMCEnvInterfaceException & Exception) { + return handleLibMCEnvException(pIBaseClass, Exception); + } + catch (std::exception & StdException) { + return handleStdException(pIBaseClass, StdException); + } + catch (...) { + return handleUnhandledException(pIBaseClass); + } +} + + /************************************************************************************************************************* Class implementation for DataTableScatterPlotOptions **************************************************************************************************************************/ @@ -2693,6 +2970,34 @@ LibMCEnvResult libmcenv_datatablescatterplotoptions_adddatachannel(LibMCEnv_Data } } +LibMCEnvResult libmcenv_datatablescatterplotoptions_listdatachannels(LibMCEnv_DataTableScatterPlotOptions pDataTableScatterPlotOptions, LibMCEnv_ScatterPlotDataChannelIterator * pIteratorInstance) +{ + IBase* pIBaseClass = (IBase *)pDataTableScatterPlotOptions; + + try { + if (pIteratorInstance == nullptr) + throw ELibMCEnvInterfaceException (LIBMCENV_ERROR_INVALIDPARAM); + IBase* pBaseIteratorInstance(nullptr); + IDataTableScatterPlotOptions* pIDataTableScatterPlotOptions = dynamic_cast(pIBaseClass); + if (!pIDataTableScatterPlotOptions) + throw ELibMCEnvInterfaceException(LIBMCENV_ERROR_INVALIDCAST); + + pBaseIteratorInstance = pIDataTableScatterPlotOptions->ListDataChannels(); + + *pIteratorInstance = (IBase*)(pBaseIteratorInstance); + return LIBMCENV_SUCCESS; + } + catch (ELibMCEnvInterfaceException & Exception) { + return handleLibMCEnvException(pIBaseClass, Exception); + } + catch (std::exception & StdException) { + return handleStdException(pIBaseClass, StdException); + } + catch (...) { + return handleUnhandledException(pIBaseClass); + } +} + /************************************************************************************************************************* Class implementation for DataTable @@ -30378,6 +30683,22 @@ LibMCEnvResult LibMCEnv::Impl::LibMCEnv_GetProcAddress (const char * pProcName, *ppProcAddress = (void*) &libmcenv_datatablecsvwriteoptions_getseparator; if (sProcName == "libmcenv_datatablecsvwriteoptions_setseparator") *ppProcAddress = (void*) &libmcenv_datatablecsvwriteoptions_setseparator; + if (sProcName == "libmcenv_scatterplotdatacolumn_getcolumnidentifier") + *ppProcAddress = (void*) &libmcenv_scatterplotdatacolumn_getcolumnidentifier; + if (sProcName == "libmcenv_scatterplotdatacolumn_getscalefactor") + *ppProcAddress = (void*) &libmcenv_scatterplotdatacolumn_getscalefactor; + if (sProcName == "libmcenv_scatterplotdatacolumn_getoffsetfactor") + *ppProcAddress = (void*) &libmcenv_scatterplotdatacolumn_getoffsetfactor; + if (sProcName == "libmcenv_scatterplotdatacolumniterator_getcurrentscatterplotdatacolumn") + *ppProcAddress = (void*) &libmcenv_scatterplotdatacolumniterator_getcurrentscatterplotdatacolumn; + if (sProcName == "libmcenv_scatterplotdatachannel_getchannelidentifier") + *ppProcAddress = (void*) &libmcenv_scatterplotdatachannel_getchannelidentifier; + if (sProcName == "libmcenv_scatterplotdatachannel_addscatterplotdatacolumn") + *ppProcAddress = (void*) &libmcenv_scatterplotdatachannel_addscatterplotdatacolumn; + if (sProcName == "libmcenv_scatterplotdatachannel_listscatterplotdatacolumns") + *ppProcAddress = (void*) &libmcenv_scatterplotdatachannel_listscatterplotdatacolumns; + if (sProcName == "libmcenv_scatterplotdatachanneliterator_getcurrentscatterplotdatachannel") + *ppProcAddress = (void*) &libmcenv_scatterplotdatachanneliterator_getcurrentscatterplotdatachannel; if (sProcName == "libmcenv_datatablescatterplotoptions_setxaxiscolumn") *ppProcAddress = (void*) &libmcenv_datatablescatterplotoptions_setxaxiscolumn; if (sProcName == "libmcenv_datatablescatterplotoptions_getxaxiscolumn") @@ -30396,6 +30717,8 @@ LibMCEnvResult LibMCEnv::Impl::LibMCEnv_GetProcAddress (const char * pProcName, *ppProcAddress = (void*) &libmcenv_datatablescatterplotoptions_getyaxisoffset; if (sProcName == "libmcenv_datatablescatterplotoptions_adddatachannel") *ppProcAddress = (void*) &libmcenv_datatablescatterplotoptions_adddatachannel; + if (sProcName == "libmcenv_datatablescatterplotoptions_listdatachannels") + *ppProcAddress = (void*) &libmcenv_datatablescatterplotoptions_listdatachannels; if (sProcName == "libmcenv_datatable_addcolumn") *ppProcAddress = (void*) &libmcenv_datatable_addcolumn; if (sProcName == "libmcenv_datatable_removecolumn") diff --git a/Framework/InterfacesCore/libmcenv_types.hpp b/Framework/InterfacesCore/libmcenv_types.hpp index c1765408..8ee9a94b 100644 --- a/Framework/InterfacesCore/libmcenv_types.hpp +++ b/Framework/InterfacesCore/libmcenv_types.hpp @@ -618,6 +618,10 @@ typedef LibMCEnvHandle LibMCEnv_DiscreteFieldData2DStoreOptions; typedef LibMCEnvHandle LibMCEnv_DiscreteFieldData2D; typedef LibMCEnvHandle LibMCEnv_DataTableWriteOptions; typedef LibMCEnvHandle LibMCEnv_DataTableCSVWriteOptions; +typedef LibMCEnvHandle LibMCEnv_ScatterPlotDataColumn; +typedef LibMCEnvHandle LibMCEnv_ScatterPlotDataColumnIterator; +typedef LibMCEnvHandle LibMCEnv_ScatterPlotDataChannel; +typedef LibMCEnvHandle LibMCEnv_ScatterPlotDataChannelIterator; typedef LibMCEnvHandle LibMCEnv_DataTableScatterPlotOptions; typedef LibMCEnvHandle LibMCEnv_DataTable; typedef LibMCEnvHandle LibMCEnv_DataSeries; diff --git a/Implementation/API/amc_api_handler_ui.cpp b/Implementation/API/amc_api_handler_ui.cpp index 724a25c9..7f6cdef0 100644 --- a/Implementation/API/amc_api_handler_ui.cpp +++ b/Implementation/API/amc_api_handler_ui.cpp @@ -255,6 +255,14 @@ APIHandler_UIType CAPIHandler_UI::parseRequest(const std::string& sURI, const eA } } + if (sParameterString.length() == 60) { + if (sParameterString.substr(0, 18) == "/pointchanneldata/") { + sParameterUUID = AMCCommon::CUtils::normalizeUUIDString(sParameterString.substr(18, 36)); + sAdditionalParameter = sParameterString.substr(55); + return APIHandler_UIType::utPointChannel; + } + } + } @@ -522,6 +530,32 @@ void CAPIHandler_UI::handleWidgetRequest(CJSONWriter& writer, const std::string& } +void CAPIHandler_UI::handlePointChannelDataRequest(CJSONWriter& writer, const std::string& sParameterUUID, const std::string& sAdditionalParameter, PAPIAuth pAuth) +{ + auto pToolpathHandler = m_pSystemState->getToolpathHandlerInstance(); + auto pScatterplot = pToolpathHandler->restoreScatterplot(sParameterUUID, false); + + auto & channelEntries = pScatterplot->getChannelEntries(); + + auto channelIt = channelEntries.find(sAdditionalParameter); + if (channelIt != channelEntries.end()) { + + auto& columnEntries = channelIt->second; + for (const auto& pair : columnEntries) { + + auto sColumnName = pair.first; + auto& vecData = pair.second; + + CJSONWriterArray dataArray(writer); + + for (auto value : vecData) + dataArray.addDouble("", value); + + writer.addArray(sColumnName, dataArray); + } + } +} + PAPIResponse CAPIHandler_UI::handleRequest(const std::string& sURI, const eAPIRequestType requestType, CAPIFormFields & pFormFields, const uint8_t* pBodyData, const size_t nBodyDataSize, PAPIAuth pAuth) { std::string sParameterUUID; @@ -587,6 +621,11 @@ PAPIResponse CAPIHandler_UI::handleRequest(const std::string& sURI, const eAPIRe handleWidgetRequest (writer, sParameterUUID, sAdditionalParameter, pBodyData, nBodyDataSize, pAuth); break; + case APIHandler_UIType::utPointChannel: { + handlePointChannelDataRequest(writer, sParameterUUID, sAdditionalParameter, pAuth); + break; + } + default: throw ELibMCInterfaceException(LIBMC_ERROR_INVALIDPARAM); diff --git a/Implementation/API/amc_api_handler_ui.hpp b/Implementation/API/amc_api_handler_ui.hpp index c294846f..4ecaf679 100644 --- a/Implementation/API/amc_api_handler_ui.hpp +++ b/Implementation/API/amc_api_handler_ui.hpp @@ -52,7 +52,8 @@ namespace AMC { utMeshEdges = 8, utDownload = 9, utPointCloud = 10, - utWidgetRequest = 11 + utWidgetRequest = 11, + utPointChannel = 12 }; class CAPIHandler_UI : public CAPIHandler { @@ -71,6 +72,7 @@ namespace AMC { void handleEventRequest(CJSONWriter& writer, const uint8_t* pBodyData, const size_t nBodyDataSize, PAPIAuth pAuth); void handleWidgetRequest(CJSONWriter& writer, const std::string & sWidgetUUID, const std::string& sRequestType, const uint8_t* pBodyData, const size_t nBodyDataSize, PAPIAuth pAuth); + void handlePointChannelDataRequest(CJSONWriter& writer, const std::string& sParameterUUID, const std::string& sAdditionalParameter, PAPIAuth pAuth); public: diff --git a/Implementation/Core/amc_scatterplot.cpp b/Implementation/Core/amc_scatterplot.cpp index 20666310..6b772615 100644 --- a/Implementation/Core/amc_scatterplot.cpp +++ b/Implementation/Core/amc_scatterplot.cpp @@ -71,6 +71,11 @@ namespace AMC { return m_PointEntries; } + ChannelEntries& CScatterplot::getChannelEntries() + { + return m_ChannelEntries; + } + void CScatterplot::getBoundaries(double& dMinX, double& dMinY, double& dMaxX, double& dMaxY) { dMinX = m_dMinX; diff --git a/Implementation/Core/amc_scatterplot.hpp b/Implementation/Core/amc_scatterplot.hpp index 980e4fbc..69e2634c 100644 --- a/Implementation/Core/amc_scatterplot.hpp +++ b/Implementation/Core/amc_scatterplot.hpp @@ -49,6 +49,9 @@ namespace AMC { class CScatterplot; typedef std::shared_ptr PScatterplot; + typedef std::map> ColumnEntries; + typedef std::map ChannelEntries; + class CScatterplot { private: @@ -56,6 +59,8 @@ namespace AMC { std::vector m_PointEntries; + ChannelEntries m_ChannelEntries; + double m_dMinX; double m_dMinY; double m_dMaxX; @@ -77,6 +82,8 @@ namespace AMC { std::vector & getEntries (); + ChannelEntries& getChannelEntries (); + void getBoundaries(double& dMinX, double& dMinY, double& dMaxX, double& dMaxY); void computeBoundaries(); diff --git a/Implementation/LibMCEnv/libmcenv_datatable.cpp b/Implementation/LibMCEnv/libmcenv_datatable.cpp index 6dcdd606..1e3e79e6 100644 --- a/Implementation/LibMCEnv/libmcenv_datatable.cpp +++ b/Implementation/LibMCEnv/libmcenv_datatable.cpp @@ -291,6 +291,11 @@ class CDataTableColumn_Double : public CDataTableColumn } + void fillScatterplotChannel(AMC::CScatterplot* pScatterplot, const std::string& sChannel, const std::string& sColumn, double dScaleFactor, double dOffset) override + { + throw ELibMCEnvInterfaceException(LIBMCENV_ERROR_NOTIMPLEMENTED); + } + }; @@ -455,6 +460,37 @@ class CDataTableColumn_Uint32 : public CDataTableColumn } + void fillScatterplotChannel(AMC::CScatterplot* pScatterplot, const std::string& sChannel, const std::string& sColumn, double dScaleFactor, double dOffset) override + { + if (pScatterplot == nullptr) + throw ELibMCEnvInterfaceException(LIBMCENV_ERROR_INVALIDPARAM); + + auto & channelEntries = pScatterplot->getChannelEntries(); + auto channelIter = channelEntries.find(sChannel); + + if (channelIter == channelEntries.end()) { + channelEntries[sChannel][sColumn] = std::vector(); + } + else { + auto & columnEntries = channelIter->second; + + if (columnEntries.find(sColumn) == columnEntries.end()) + columnEntries[sColumn] = std::vector(); + else { + std::string sException = "The channel = " + sChannel + " with the column = " + sColumn + " already exists"; + throw std::exception(sException.c_str()); + } + } + + auto & vecColumn = channelEntries[sChannel][sColumn]; + + vecColumn.resize(m_Rows.size()); + + for (size_t nIndex = 0; nIndex < m_Rows.size(); nIndex++) { + vecColumn[nIndex] = (double)m_Rows.at(nIndex) * dScaleFactor + dOffset; + } + } + }; @@ -610,6 +646,10 @@ class CDataTableColumn_Uint64 : public CDataTableColumn } + void fillScatterplotChannel(AMC::CScatterplot* pScatterplot, const std::string& sChannel, const std::string& sColumn, double dScaleFactor, double dOffset) override + { + throw ELibMCEnvInterfaceException(LIBMCENV_ERROR_NOTIMPLEMENTED); + } }; @@ -771,8 +811,13 @@ class CDataTableColumn_Int32 : public CDataTableColumn entry.m_dY = 0.0; } } + } + void fillScatterplotChannel(AMC::CScatterplot* pScatterplot, const std::string& sChannel, const std::string& sColumn, double dScaleFactor, double dOffset) override + { + throw ELibMCEnvInterfaceException(LIBMCENV_ERROR_NOTIMPLEMENTED); } + }; @@ -936,6 +981,12 @@ class CDataTableColumn_Int64 : public CDataTableColumn } } + + void fillScatterplotChannel(AMC::CScatterplot* pScatterplot, const std::string& sChannel, const std::string& sColumn, double dScaleFactor, double dOffset) override + { + throw ELibMCEnvInterfaceException(LIBMCENV_ERROR_NOTIMPLEMENTED); + } + }; CDataTableColumn::CDataTableColumn(const std::string& sIdentifier, const std::string& sDescription) @@ -1549,6 +1600,22 @@ IScatterPlot* CDataTable::CalculateScatterPlot(IDataTableScatterPlotOptions* pSc pScatterPlotInstance->computeBoundaries(); + auto pDataChannelsIterator = pScatterPlotInput->ListDataChannels(); + while (pDataChannelsIterator->MoveNext()) { + auto pDataChannel = dynamic_cast(pDataChannelsIterator->GetCurrent()); + auto sChannelIdentifier = pDataChannel->GetChannelIdentifier(); + + auto pDataColumnsIterator = pDataChannel->ListScatterPlotDataColumns(); + while (pDataColumnsIterator->MoveNext()){ + auto pDataColumn = dynamic_cast(pDataColumnsIterator->GetCurrent()); + auto sColumnIdentifier = pDataColumn->GetColumnIdentifier(); + + auto pColumn = findColumn(sColumnIdentifier, false); + if (pColumn) + pColumn->fillScatterplotChannel(pScatterPlotInstance.get(), sChannelIdentifier, sColumnIdentifier, pDataColumn->GetScaleFactor(), pDataColumn->GetOffsetFactor()); + } + } + m_pToolpathHandler->storeScatterplot(pScatterPlotInstance); return new CScatterPlot (pScatterPlotInstance); diff --git a/Implementation/LibMCEnv/libmcenv_datatable.hpp b/Implementation/LibMCEnv/libmcenv_datatable.hpp index 06dad8b4..15b89077 100644 --- a/Implementation/LibMCEnv/libmcenv_datatable.hpp +++ b/Implementation/LibMCEnv/libmcenv_datatable.hpp @@ -96,6 +96,8 @@ class CDataTableColumn virtual void fillScatterplotXCoordinates (AMC::CScatterplot* pScatterplot, double dScaleFactor, double dOffset) = 0; virtual void fillScatterplotYCoordinates(AMC::CScatterplot* pScatterplot, double dScaleFactor, double dOffset) = 0; + + virtual void fillScatterplotChannel(AMC::CScatterplot* pScatterplot, const std::string& sChannel, const std::string& sColumn, double dScaleFactor, double dOffset) = 0; }; typedef std::shared_ptr PDataTableColumn; diff --git a/Implementation/LibMCEnv/libmcenv_datatablescatterplotoptions.cpp b/Implementation/LibMCEnv/libmcenv_datatablescatterplotoptions.cpp index 4a659a87..81fb52d5 100644 --- a/Implementation/LibMCEnv/libmcenv_datatablescatterplotoptions.cpp +++ b/Implementation/LibMCEnv/libmcenv_datatablescatterplotoptions.cpp @@ -33,6 +33,7 @@ Abstract: This is a stub class definition of CDataTableScatterPlotOptions #include "libmcenv_datatablescatterplotoptions.hpp" #include "libmcenv_interfaceexception.hpp" +#include "libmcenv_scatterplotdatachanneliterator.hpp" using namespace LibMCEnv::Impl; @@ -98,6 +99,29 @@ LibMCEnv_double CDataTableScatterPlotOptions::GetYAxisOffset() void CDataTableScatterPlotOptions::AddDataChannel(const std::string & sChannelIdentifier, const std::string & sColumnIdentifier, const LibMCEnv_double dScaleFactor, const LibMCEnv_double dOffsetFactor, const LibMCEnv_uint32 nColor) { - + auto dataColumn = new CScatterPlotDataColumn(sColumnIdentifier, dScaleFactor, dOffsetFactor); + + auto channelIt = m_DataChannelsMap.find(sChannelIdentifier); + + if (channelIt != m_DataChannelsMap.end()) { + auto& dataChannel = channelIt->second; + dataChannel->AddScatterPlotDataColumn(dataColumn); + } + else { + auto dataChannel = std::make_unique(sChannelIdentifier); + dataChannel->AddScatterPlotDataColumn(dataColumn); + m_DataChannelsMap[sChannelIdentifier] = std::move(dataChannel); + } } +IScatterPlotDataChannelIterator* CDataTableScatterPlotOptions::ListDataChannels() +{ + std::unique_ptr pResult(new CScatterPlotDataChannelIterator()); + + for (const auto& it : m_DataChannelsMap) { + auto dataChannel = std::shared_ptr(CScatterPlotDataChannel::makeFrom(it.second.get())); + pResult->AddScatterPlotDataChannel(dataChannel); + } + + return pResult.release(); +} \ No newline at end of file diff --git a/Implementation/LibMCEnv/libmcenv_datatablescatterplotoptions.hpp b/Implementation/LibMCEnv/libmcenv_datatablescatterplotoptions.hpp index 09a569a7..941d1536 100644 --- a/Implementation/LibMCEnv/libmcenv_datatablescatterplotoptions.hpp +++ b/Implementation/LibMCEnv/libmcenv_datatablescatterplotoptions.hpp @@ -45,7 +45,8 @@ Abstract: This is the class declaration of CDataTableScatterPlotOptions #endif // Include custom headers here. - +#include "libmcenv_scatterplotdatachannel.hpp" +#include namespace LibMCEnv { namespace Impl { @@ -66,6 +67,8 @@ class CDataTableScatterPlotOptions : public virtual IDataTableScatterPlotOptions double m_dYAxisScaleFactor; double m_dYAxisOffset; + std::map> m_DataChannelsMap; + public: CDataTableScatterPlotOptions(); @@ -90,6 +93,7 @@ class CDataTableScatterPlotOptions : public virtual IDataTableScatterPlotOptions void AddDataChannel(const std::string & sChannelIdentifier, const std::string & sColumnIdentifier, const LibMCEnv_double dScaleFactor, const LibMCEnv_double dOffsetFactor, const LibMCEnv_uint32 nColor) override; + IScatterPlotDataChannelIterator* ListDataChannels(); }; } // namespace Impl diff --git a/Implementation/LibMCEnv/libmcenv_scatterplotdatachannel.cpp b/Implementation/LibMCEnv/libmcenv_scatterplotdatachannel.cpp new file mode 100644 index 00000000..4ea5a787 --- /dev/null +++ b/Implementation/LibMCEnv/libmcenv_scatterplotdatachannel.cpp @@ -0,0 +1,99 @@ +/*++ + +Copyright (C) 2020 Autodesk Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Autodesk Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +Abstract: This is a stub class definition of CScatterPlotDataChannel + +*/ + +#include "libmcenv_scatterplotdatachannel.hpp" +#include "libmcenv_interfaceexception.hpp" + +// Include custom headers here. +#include "libmcenv_scatterplotdatacolumniterator.hpp" + + +using namespace LibMCEnv::Impl; + +/************************************************************************************************************************* + Class definition of CScatterPlotDataChannel +**************************************************************************************************************************/ + +CScatterPlotDataChannel::CScatterPlotDataChannel(const std::string& sChannelIdentifier) + : m_sChannelIdentifier(sChannelIdentifier) +{ +} + +CScatterPlotDataChannel* CScatterPlotDataChannel::makeFrom(IScatterPlotDataChannel* pDataChannel) +{ + if (pDataChannel == nullptr) + throw ELibMCEnvInterfaceException(LIBMCENV_ERROR_INVALIDPARAM); + + auto pReturnDataChannel = new CScatterPlotDataChannel(pDataChannel->GetChannelIdentifier()); + + auto pDataColumns = pDataChannel->ListScatterPlotDataColumns(); + + while (pDataColumns->MoveNext()) + { + auto pDataColumn = dynamic_cast(pDataColumns->GetCurrent()); + pReturnDataChannel->AddScatterPlotDataColumn(pDataColumn); + } + + return pReturnDataChannel; +} + +std::string CScatterPlotDataChannel::GetChannelIdentifier() +{ + return m_sChannelIdentifier; +} + +void CScatterPlotDataChannel::AddScatterPlotDataColumn(IScatterPlotDataColumn* pColumnInstance) +{ + if (pColumnInstance == nullptr) + throw ELibMCEnvInterfaceException(LIBMCENV_ERROR_INVALIDPARAM); + + auto sColumnIdentifier = pColumnInstance->GetColumnIdentifier(); + + if (m_DataColumnsMap.find(sColumnIdentifier) == m_DataColumnsMap.end()) + m_DataColumnsMap[sColumnIdentifier] = std::unique_ptr(pColumnInstance); + else + throw ELibMCEnvInterfaceException(LIBMCENV_ERROR_INVALIDPARAM); // Todo : Exception +} + +IScatterPlotDataColumnIterator * CScatterPlotDataChannel::ListScatterPlotDataColumns() +{ + std::unique_ptr pResult(new CScatterPlotDataColumnIterator()); + + for (const auto& it : m_DataColumnsMap) { + auto dataColumn = std::shared_ptr(CScatterPlotDataColumn::makeFrom(it.second.get())); + pResult->AddScatterPlotDataColumn(dataColumn); + } + + return pResult.release(); +} + diff --git a/Implementation/LibMCEnv/libmcenv_scatterplotdatachannel.hpp b/Implementation/LibMCEnv/libmcenv_scatterplotdatachannel.hpp new file mode 100644 index 00000000..c9f813ac --- /dev/null +++ b/Implementation/LibMCEnv/libmcenv_scatterplotdatachannel.hpp @@ -0,0 +1,107 @@ +/*++ + +Copyright (C) 2020 Autodesk Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Autodesk Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +Abstract: This is the class declaration of CScatterPlotDataChannel + +*/ + + +#ifndef __LIBMCENV_SCATTERPLOTDATACHANNEL +#define __LIBMCENV_SCATTERPLOTDATACHANNEL + +#include "libmcenv_interfaces.hpp" + +// Parent classes +#include "libmcenv_base.hpp" +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4250) +#endif + +// Include custom headers here. +#include "libmcenv_scatterplotdatacolumn.hpp" + +#include + +namespace LibMCEnv { +namespace Impl { + + +/************************************************************************************************************************* + Class declaration of CScatterPlotDataChannel +**************************************************************************************************************************/ + +class CScatterPlotDataChannel : public virtual IScatterPlotDataChannel, public virtual CBase { +private: + + /** + * Put private members here. + */ + + std::string m_sChannelIdentifier; + + std::map> m_DataColumnsMap; + +protected: + + /** + * Put protected members here. + */ + +public: + + CScatterPlotDataChannel(const std::string& sChannelIdentifier); + + static CScatterPlotDataChannel* makeFrom(IScatterPlotDataChannel* pDataChannel); + + + /** + * Put additional public members here. They will not be visible in the external API. + */ + + + /** + * Public member functions to implement. + */ + + void AddScatterPlotDataColumn(IScatterPlotDataColumn* pColumnInstance); + + std::string GetChannelIdentifier() override; + + IScatterPlotDataColumnIterator * ListScatterPlotDataColumns() override; + +}; + +} // namespace Impl +} // namespace LibMCEnv + +#ifdef _MSC_VER +#pragma warning(pop) +#endif +#endif // __LIBMCENV_SCATTERPLOTDATACHANNEL diff --git a/Implementation/LibMCEnv/libmcenv_scatterplotdatachanneliterator.cpp b/Implementation/LibMCEnv/libmcenv_scatterplotdatachanneliterator.cpp new file mode 100644 index 00000000..c296e333 --- /dev/null +++ b/Implementation/LibMCEnv/libmcenv_scatterplotdatachanneliterator.cpp @@ -0,0 +1,77 @@ +/*++ + +Copyright (C) 2020 Autodesk Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Autodesk Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +Abstract: This is a stub class definition of CScatterPlotDataChannelIterator + +*/ + +#include "libmcenv_scatterplotdatachanneliterator.hpp" +#include "libmcenv_interfaceexception.hpp" + +// Include custom headers here. +#include "libmcenv_scatterplotdatachannel.hpp" + +using namespace LibMCEnv::Impl; + +/************************************************************************************************************************* + Class definition of CScatterPlotDataChannelIterator +**************************************************************************************************************************/ + +IBase* CScatterPlotDataChannelIterator::GetCurrent() +{ + return GetCurrentScatterPlotDataChannel(); +} + +IIterator* CScatterPlotDataChannelIterator::Clone() +{ + throw ELibMCEnvInterfaceException(LIBMCENV_ERROR_NOTIMPLEMENTED); + + return nullptr; +} + +void CScatterPlotDataChannelIterator::AddScatterPlotDataChannel(std::shared_ptr pDataChannel) +{ + if (pDataChannel.get() == nullptr) + throw ELibMCEnvInterfaceException(LIBMCENV_ERROR_INVALIDPARAM); + + m_List.push_back(pDataChannel); +} + +IScatterPlotDataChannel* CScatterPlotDataChannelIterator::GetCurrentScatterPlotDataChannel() +{ + if ((m_nCurrentIndex < 0) || (m_nCurrentIndex >= m_List.size())) + throw ELibMCEnvInterfaceException(LIBMCENV_ERROR_INVALIDITERATOR); + + auto pDataChannel = std::dynamic_pointer_cast (m_List[m_nCurrentIndex]); + if (pDataChannel.get() == nullptr) + throw ELibMCEnvInterfaceException(LIBMCENV_ERROR_INVALIDCAST); + + return CScatterPlotDataChannel::makeFrom(pDataChannel.get()); + +} diff --git a/Implementation/LibMCEnv/libmcenv_scatterplotdatachanneliterator.hpp b/Implementation/LibMCEnv/libmcenv_scatterplotdatachanneliterator.hpp new file mode 100644 index 00000000..40bec968 --- /dev/null +++ b/Implementation/LibMCEnv/libmcenv_scatterplotdatachanneliterator.hpp @@ -0,0 +1,104 @@ +/*++ + +Copyright (C) 2020 Autodesk Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Autodesk Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +Abstract: This is the class declaration of CScatterPlotDataChannelIterator + +*/ + + +#ifndef __LIBMCENV_SCATTERPLOTDATACHANNELITERATOR +#define __LIBMCENV_SCATTERPLOTDATACHANNELITERATOR + +#include "libmcenv_interfaces.hpp" + +// Parent classes +#include "libmcenv_iterator.hpp" +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4250) +#endif + +// Include custom headers here. +#include "libmcenv_scatterplotdatachannel.hpp" + +namespace LibMCEnv { +namespace Impl { + + +/************************************************************************************************************************* + Class declaration of CScatterPlotDataChannelIterator +**************************************************************************************************************************/ + +class CScatterPlotDataChannelIterator : public virtual IScatterPlotDataChannelIterator, public virtual CIterator { +private: + + /** + * Put private members here. + */ + +protected: + + /** + * Put protected members here. + */ + +public: + + /** + * CBuildExecutionIterator::CBuildExecutionIterator - Constructor for BuildExecutionIterator class. + */ + CScatterPlotDataChannelIterator() + { + } + + /** + * Put additional public members here. They will not be visible in the external API. + */ + + IIterator* Clone() override; + + IBase* GetCurrent() override; + + /** + * Public member functions to implement. + */ + + void AddScatterPlotDataChannel(std::shared_ptr pDataChannel); + + IScatterPlotDataChannel * GetCurrentScatterPlotDataChannel() override; + +}; + +} // namespace Impl +} // namespace LibMCEnv + +#ifdef _MSC_VER +#pragma warning(pop) +#endif +#endif // __LIBMCENV_SCATTERPLOTDATACHANNELITERATOR diff --git a/Implementation/LibMCEnv/libmcenv_scatterplotdatacolumn.cpp b/Implementation/LibMCEnv/libmcenv_scatterplotdatacolumn.cpp new file mode 100644 index 00000000..4ec946b1 --- /dev/null +++ b/Implementation/LibMCEnv/libmcenv_scatterplotdatacolumn.cpp @@ -0,0 +1,71 @@ +/*++ + +Copyright (C) 2020 Autodesk Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Autodesk Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +Abstract: This is a stub class definition of CScatterPlotDataChannelColumn + +*/ + +#include "libmcenv_scatterplotdatacolumn.hpp" +#include "libmcenv_interfaceexception.hpp" + +// Include custom headers here. + + +using namespace LibMCEnv::Impl; + +/************************************************************************************************************************* + Class definition of CScatterPlotDataColumn +**************************************************************************************************************************/ + +CScatterPlotDataColumn::CScatterPlotDataColumn(const std::string& sColumnIdentifier, const LibMCEnv_double dScaleFactor, const LibMCEnv_double dOffsetFactor) + : m_sColumnIdentifier(sColumnIdentifier) + , m_dScaleFactor(dScaleFactor) + , m_dOffsetFactor(dOffsetFactor) +{ +} + +CScatterPlotDataColumn* CScatterPlotDataColumn::makeFrom(IScatterPlotDataColumn* pDataColumn) +{ + return new CScatterPlotDataColumn(pDataColumn->GetColumnIdentifier(), pDataColumn->GetScaleFactor(), pDataColumn->GetOffsetFactor()); +} + +std::string CScatterPlotDataColumn::GetColumnIdentifier() +{ + return m_sColumnIdentifier; +} + +LibMCEnv_double CScatterPlotDataColumn::GetScaleFactor() +{ + return m_dScaleFactor; +} + +LibMCEnv_double CScatterPlotDataColumn::GetOffsetFactor() +{ + return m_dOffsetFactor; +} \ No newline at end of file diff --git a/Implementation/LibMCEnv/libmcenv_scatterplotdatacolumn.hpp b/Implementation/LibMCEnv/libmcenv_scatterplotdatacolumn.hpp new file mode 100644 index 00000000..581675d8 --- /dev/null +++ b/Implementation/LibMCEnv/libmcenv_scatterplotdatacolumn.hpp @@ -0,0 +1,104 @@ +/*++ + +Copyright (C) 2020 Autodesk Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Autodesk Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +Abstract: This is the class declaration of CScatterPlotDataChannelColumn + +*/ + + +#ifndef __LIBMCENV_SCATTERPLOTDATACOLUMN +#define __LIBMCENV_SCATTERPLOTDATACOLUMN + +#include "libmcenv_interfaces.hpp" + +// Parent classes +#include "libmcenv_base.hpp" +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4250) +#endif + +// Include custom headers here. + + +namespace LibMCEnv { +namespace Impl { + + +/************************************************************************************************************************* + Class declaration of CScatterPlotDataColumn +**************************************************************************************************************************/ + +class CScatterPlotDataColumn : public virtual IScatterPlotDataColumn, public virtual CBase { +private: + + /** + * Put private members here. + */ + + std::string m_sColumnIdentifier; + + double m_dScaleFactor; + double m_dOffsetFactor; + +protected: + + /** + * Put protected members here. + */ + +public: + + /** + * Put additional public members here. They will not be visible in the external API. + */ + + + /** + * Public member functions to implement. + */ + + CScatterPlotDataColumn(const std::string& sColumnIdentifier, const LibMCEnv_double dScaleFactor, const LibMCEnv_double dOffsetFactor); + + static CScatterPlotDataColumn* makeFrom(IScatterPlotDataColumn* pDataColumn); + + std::string GetColumnIdentifier() override; + + LibMCEnv_double GetScaleFactor() override; + + LibMCEnv_double GetOffsetFactor() override; +}; + +} // namespace Impl +} // namespace LibMCEnv + +#ifdef _MSC_VER +#pragma warning(pop) +#endif +#endif // __LIBMCENV_SCATTERPLOTDATACOLUMN diff --git a/Implementation/LibMCEnv/libmcenv_scatterplotdatacolumniterator.cpp b/Implementation/LibMCEnv/libmcenv_scatterplotdatacolumniterator.cpp new file mode 100644 index 00000000..24743e27 --- /dev/null +++ b/Implementation/LibMCEnv/libmcenv_scatterplotdatacolumniterator.cpp @@ -0,0 +1,80 @@ +/*++ + +Copyright (C) 2020 Autodesk Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Autodesk Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +Abstract: This is a stub class definition of CScatterPlotDataChannelColumnIterator + +*/ + +#include "libmcenv_scatterplotdatacolumniterator.hpp" +#include "libmcenv_interfaceexception.hpp" + +// Include custom headers here. + + +using namespace LibMCEnv::Impl; + +/************************************************************************************************************************* + Class definition of CScatterPlotDataChannelColumnIterator +**************************************************************************************************************************/ + +CScatterPlotDataColumnIterator::CScatterPlotDataColumnIterator() +{ +} + +IBase* CScatterPlotDataColumnIterator::GetCurrent() +{ + return GetCurrentScatterPlotDataColumn(); +} + +IIterator* CScatterPlotDataColumnIterator::Clone() +{ + throw ELibMCEnvInterfaceException(LIBMCENV_ERROR_NOTIMPLEMENTED); + + return nullptr; +} + +IScatterPlotDataColumn * CScatterPlotDataColumnIterator::GetCurrentScatterPlotDataColumn() +{ + if ((m_nCurrentIndex < 0) || (m_nCurrentIndex >= m_List.size())) + throw ELibMCEnvInterfaceException(LIBMCENV_ERROR_INVALIDITERATOR); + + auto pDataColumn = std::dynamic_pointer_cast (m_List[m_nCurrentIndex]); + if (pDataColumn.get() == nullptr) + throw ELibMCEnvInterfaceException(LIBMCENV_ERROR_INVALIDCAST); + + return CScatterPlotDataColumn::makeFrom(pDataColumn.get()); +} + +void CScatterPlotDataColumnIterator::AddScatterPlotDataColumn(std::shared_ptr pDataColumn) +{ + if (pDataColumn.get() == nullptr) + throw ELibMCEnvInterfaceException(LIBMCENV_ERROR_INVALIDPARAM); + + m_List.push_back(pDataColumn); +} \ No newline at end of file diff --git a/Implementation/LibMCEnv/libmcenv_scatterplotdatacolumniterator.hpp b/Implementation/LibMCEnv/libmcenv_scatterplotdatacolumniterator.hpp new file mode 100644 index 00000000..01ebac53 --- /dev/null +++ b/Implementation/LibMCEnv/libmcenv_scatterplotdatacolumniterator.hpp @@ -0,0 +1,100 @@ +/*++ + +Copyright (C) 2020 Autodesk Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Autodesk Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +Abstract: This is the class declaration of CScatterPlotDataColumnIterator + +*/ + + +#ifndef __LIBMCENV_SCATTERPLOTDATACOLUMNITERATOR +#define __LIBMCENV_SCATTERPLOTDATACOLUMNITERATOR + +#include "libmcenv_interfaces.hpp" + +// Parent classes +#include "libmcenv_iterator.hpp" +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4250) +#endif + +// Include custom headers here. +#include "libmcenv_scatterplotdatacolumn.hpp" + +namespace LibMCEnv { +namespace Impl { + + +/************************************************************************************************************************* + Class declaration of CScatterPlotDataColumnIterator +**************************************************************************************************************************/ + +class CScatterPlotDataColumnIterator : public virtual IScatterPlotDataColumnIterator, public virtual CIterator { +private: + + /** + * Put private members here. + */ + +protected: + + /** + * Put protected members here. + */ + +public: + + /** + * Put additional public members here. They will not be visible in the external API. + */ + + + /** + * Public member functions to implement. + */ + + CScatterPlotDataColumnIterator(); + + IIterator* Clone() override; + + IBase* GetCurrent() override; + + IScatterPlotDataColumn * GetCurrentScatterPlotDataColumn() override; + + void AddScatterPlotDataColumn(std::shared_ptr pDataColumn); + +}; + +} // namespace Impl +} // namespace LibMCEnv + +#ifdef _MSC_VER +#pragma warning(pop) +#endif +#endif // __LIBMCENV_SCATTERPLOTDATACOLUMNITERATOR From 544c5d51a9570433ce94e752dc4634fe0fa03e73 Mon Sep 17 00:00:00 2001 From: Yury Rodzikau Date: Wed, 25 Jun 2025 11:57:54 +0200 Subject: [PATCH 2/3] AMCF WebClient: Fix incorrect async method invocation in Vue and JS layers * queryPoints: added `return` to ensure caller can await result of async call * queryPointsChannelData: added `return` to propagate async result to calling context * onLayerChanged: added async handling to prevent race conditions during updates Signed-off-by: Yury Rodzikau --- .../src/common/AMCImplementation_LayerView.js | 7 +--- Client/src/modules/AMCModule_LayerView.vue | 36 ++++++++----------- 2 files changed, 16 insertions(+), 27 deletions(-) diff --git a/Client/src/common/AMCImplementation_LayerView.js b/Client/src/common/AMCImplementation_LayerView.js index b985b012..8653ef5e 100644 --- a/Client/src/common/AMCImplementation_LayerView.js +++ b/Client/src/common/AMCImplementation_LayerView.js @@ -418,8 +418,6 @@ class LayerViewImpl { this.layerPointsMinVelocity = LAYERVIEW_MINVELOCITYRANGE; this.computeVelocities (); - this.updateColors (); - this.updateLayerPoints (); } loadPointsChannelData(pointsChannelName, pointsColumnName, pointsChannelDataArray) { @@ -431,8 +429,6 @@ class LayerViewImpl { // Assign the data array to the corresponding column this[pointsChannelName][pointsColumnName] = pointsChannelDataArray; - - this.makeLaserOnColors (); } clearPoints () @@ -472,8 +468,7 @@ class LayerViewImpl { if (this.layerPointsMode == "laseron") { this.makeLaserOnColors (); - } - + } } setColorMode (newColorMode) { diff --git a/Client/src/modules/AMCModule_LayerView.vue b/Client/src/modules/AMCModule_LayerView.vue index 4a490747..7ebdc34f 100644 --- a/Client/src/modules/AMCModule_LayerView.vue +++ b/Client/src/modules/AMCModule_LayerView.vue @@ -306,20 +306,15 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. queryPoints: function (scatterplotuuid) { - this.loadingScatterplot = true; - this.LayerViewerInstance.glInstance.removeElement("layerdata_points"); this.LayerViewerInstance.clearPoints (); - this.Application.axiosGetArrayBufferRequest("/ui/pointcloud/" + scatterplotuuid) + return this.Application.axiosGetArrayBufferRequest("/ui/pointcloud/" + scatterplotuuid) .then(responseData => { let pointcoordinates = new Float32Array(responseData.data); if (this.LayerViewerInstance) { this.LayerViewerInstance.loadPoints (pointcoordinates); } - - this.loadingScatterplot = false; - }) .catch(err => { if (err.response) { @@ -330,19 +325,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. if (this.LayerViewerInstance) { this.LayerViewerInstance.RenderScene (true); } - - this.loadingScatterplot = false; }); - }, queryPointsChannelData: function (scatterplotuuid, pointsChannelName) { - this.loadingScatterplot = true; - this.LayerViewerInstance.clearPointsChannelData (pointsChannelName); - this.Application.axiosGetArrayBufferRequest("/ui/pointchanneldata/" + scatterplotuuid + "/" + pointsChannelName) + return this.Application.axiosGetArrayBufferRequest("/ui/pointchanneldata/" + scatterplotuuid + "/" + pointsChannelName) .then(responseData => { const contentType = responseData.headers['content-type']; @@ -381,9 +371,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. } else { console.error("Error while parsing response: not a JSON"); } - - this.loadingScatterplot = false; - }) .catch(err => { if (err.response) { @@ -394,11 +381,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. if (this.LayerViewerInstance) { this.LayerViewerInstance.RenderScene (true); } - - this.loadingScatterplot = false; }); }, - onLayerChanged: function (sender) { @@ -437,9 +421,20 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. if (platform.scatterplotuuid != "00000000-0000-0000-0000-000000000000") { - this.queryPoints (platform.scatterplotuuid); + this.loadingScatterplot = true; + this.LayerViewerInstance.glInstance.removeElement("layerdata_points"); + + Promise.all([ + this.queryPoints(platform.scatterplotuuid), + this.queryPointsChannelData(platform.scatterplotuuid, "laser") + ]).then(() => { + if (this.LayerViewerInstance && this.LayerViewerInstance.updateLayerPoints) { + this.LayerViewerInstance.updateColors (); + this.LayerViewerInstance.updateLayerPoints(); + } + }); - this.queryPointsChannelData (platform.scatterplotuuid, "laser"); + this.loadingScatterplot = false; } else { @@ -447,7 +442,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. this.LayerViewerInstance.glInstance.removeElement("layerdata_points"); this.LayerViewerInstance.clearPoints (); - this.LayerViewerInstance.clearPointsChannelData ("laser") } From 0dfe8d48548166b208232417552333f5c16b0143 Mon Sep 17 00:00:00 2001 From: Yury Rodzikau Date: Wed, 25 Jun 2025 12:09:48 +0200 Subject: [PATCH 3/3] AMCF WebClient/Artifacts: Contains updated client packages with updated githash * Contains updated client packages with updated githash Signed-off-by: Yury Rodzikau --- Artifacts/clientdist/_githash_client.txt | 2 +- Artifacts/clientdist/clientpackage.zip | Bin 4542715 -> 4542756 bytes Artifacts/clientdist/clientsourcepackage.zip | Bin 207016 -> 207062 bytes 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Artifacts/clientdist/_githash_client.txt b/Artifacts/clientdist/_githash_client.txt index b121001f..c6172930 100644 --- a/Artifacts/clientdist/_githash_client.txt +++ b/Artifacts/clientdist/_githash_client.txt @@ -1 +1 @@ -3de30d7f59cc739433600475d8cef345fb174622 +544c5d51a9570433ce94e752dc4634fe0fa03e73 diff --git a/Artifacts/clientdist/clientpackage.zip b/Artifacts/clientdist/clientpackage.zip index 712cb68d3326589b136e36ace4ee3260ba254fc8..28e589af04277fddfcd294cf936d2162dda745f4 100644 GIT binary patch delta 43222 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 TE)-MBypkjd+@6%=`;GqxkAU5( delta 43226 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 z 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 GasMBrff@Y( diff --git a/Artifacts/clientdist/clientsourcepackage.zip b/Artifacts/clientdist/clientsourcepackage.zip index 0320a7ab8985ae0ea73aa41eb107f302d1150d53..b9d2a160ce38d0917ca796b698276860e18d8c53 100644 GIT binary patch delta 11674 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 delta 11661 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