From 787e441d4825b0f6ed70710fa5c18d056f2844eb Mon Sep 17 00:00:00 2001 From: Yury Rodzikau Date: Fri, 10 Oct 2025 11:28:59 +0200 Subject: [PATCH 1/3] LibMCCore: Refine hatch interpolation handling and improve nonlinear factor processing - Core toolpath logic (amc_toolpathlayerdata.cpp): - Introduced compile-time switch `USEALLMODIFICATIONFACTORS` to control whether all modification factors (F/G/H) or only factor F are processed. - Added safeguard when assigning nonlinear interpolation data to avoid out-of-range vector access when `nSubInterpolationCount` is zero. - ScanLabSMC driver (CSMCJobInstance): - Added parsing and output of new active channel data (`active0`, `active1`) in SMC v1.0 simulation files. - Updated CSV field mapping to include new channels, replacing placeholder unused entries. - Extended data table schema to add `active0` and `active1` columns. - Populated active channel values in the output table and reset corresponding vectors after use. - LibMCEnv layer evaluation (libmcenv_toolpathlayer.cpp): - Commented out exception throw for incomplete hatch profile evaluation to allow partial evaluation without interrupting execution. Signed-off-by: Yury Rodzikau --- .../libmcdriver_scanlabsmc_smcjobinstance.cpp | 14 +++++++++++--- Implementation/Core/amc_toolpathlayerdata.cpp | 9 ++++++--- Implementation/LibMCEnv/libmcenv_toolpathlayer.cpp | 2 +- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/Drivers/ScanLabSMC/Implementation/libmcdriver_scanlabsmc_smcjobinstance.cpp b/Drivers/ScanLabSMC/Implementation/libmcdriver_scanlabsmc_smcjobinstance.cpp index 7e00b8e4..f8f2572b 100644 --- a/Drivers/ScanLabSMC/Implementation/libmcdriver_scanlabsmc_smcjobinstance.cpp +++ b/Drivers/ScanLabSMC/Implementation/libmcdriver_scanlabsmc_smcjobinstance.cpp @@ -795,8 +795,10 @@ void CSMCJobInstance::ReadSimulationFile_SMC_v1_0(LibMCEnv::PDataTable pDataTabl {{CSMCCSVParser::FieldParserType::Double, CSMCCSVParser::FieldProcessingStep::Extend | CSMCCSVParser::FieldProcessingStep::Interpolate }, &scanheadY}, {{CSMCCSVParser::FieldParserType::LaserSignal,CSMCCSVParser::FieldProcessingStep::Nop}, &laserSignal}, {{CSMCCSVParser::FieldParserType::UInt32,CSMCCSVParser::FieldProcessingStep::Nop}, &laserToggle}, - {{CSMCCSVParser::FieldParserType::None,CSMCCSVParser::FieldProcessingStep::Nop}, nullptr}, - {{CSMCCSVParser::FieldParserType::None,CSMCCSVParser::FieldProcessingStep::Nop}, nullptr}, + //{{CSMCCSVParser::FieldParserType::None,CSMCCSVParser::FieldProcessingStep::Nop}, nullptr}, + //{{CSMCCSVParser::FieldParserType::None,CSMCCSVParser::FieldProcessingStep::Nop}, nullptr}, + {{CSMCCSVParser::FieldParserType::Double,CSMCCSVParser::FieldProcessingStep::Nop}, &activeChannel0}, + {{CSMCCSVParser::FieldParserType::Double,CSMCCSVParser::FieldProcessingStep::Nop}, &activeChannel1}, {{CSMCCSVParser::FieldParserType::Int,CSMCCSVParser::FieldProcessingStep::Nop}, &cmdCount}, {{CSMCCSVParser::FieldParserType::None,CSMCCSVParser::FieldProcessingStep::Nop}, nullptr}, {{CSMCCSVParser::FieldParserType::None,CSMCCSVParser::FieldProcessingStep::Nop}, nullptr}, @@ -815,8 +817,8 @@ void CSMCJobInstance::ReadSimulationFile_SMC_v1_0(LibMCEnv::PDataTable pDataTabl pDataTable->AddColumn("x", "X", LibMCEnv::eDataTableColumnType::DoubleColumn); pDataTable->AddColumn("y", "Y", LibMCEnv::eDataTableColumnType::DoubleColumn); pDataTable->AddColumn("laseron", "LaserOn", LibMCEnv::eDataTableColumnType::Uint32Column); + pDataTable->AddColumn("active0", "Active Channel 0", LibMCEnv::eDataTableColumnType::DoubleColumn); pDataTable->AddColumn("active1", "Active Channel 1", LibMCEnv::eDataTableColumnType::DoubleColumn); - pDataTable->AddColumn("active2", "Active Channel 2", LibMCEnv::eDataTableColumnType::DoubleColumn); pDataTable->AddColumn("cmdindex", "Command Index", LibMCEnv::eDataTableColumnType::Int32Column); m_dJobDuration = (double)timestampValues.size() / (double)SCANLABSMC_MICROSTEPSPERSECOND; @@ -833,6 +835,12 @@ void CSMCJobInstance::ReadSimulationFile_SMC_v1_0(LibMCEnv::PDataTable pDataTabl pDataTable->SetUint32ColumnValues("laseron", laserSignal); laserSignal.resize(0); + + pDataTable->SetDoubleColumnValues("active0", activeChannel0); + activeChannel0.resize(0); + + pDataTable->SetDoubleColumnValues("active1", activeChannel1); + activeChannel1.resize(0); } void CSMCJobInstance::ReadLogRecordFile(LibMCEnv::PDataTable pDataTable) diff --git a/Implementation/Core/amc_toolpathlayerdata.cpp b/Implementation/Core/amc_toolpathlayerdata.cpp index 754a6523..cf5b7c81 100644 --- a/Implementation/Core/amc_toolpathlayerdata.cpp +++ b/Implementation/Core/amc_toolpathlayerdata.cpp @@ -429,9 +429,11 @@ namespace AMC { } - +#if USEALLMODIFICATIONFACTORS for (uint32_t nFactorIndex = 0; nFactorIndex < 3; nFactorIndex++) { - +#else // USE ONLY FACTOR_F MODIFICATOR + for (uint32_t nFactorIndex = 0; nFactorIndex < 1; nFactorIndex++) { +#endif Lib3MF::eToolpathProfileModificationFactor factorType = Lib3MF::eToolpathProfileModificationFactor::Unknown; uint32_t factorFlag = 0; switch (nFactorIndex) { @@ -478,7 +480,8 @@ namespace AMC { Lib3MF::sHatchModificationInterpolationData* pSubInterpolationData = nullptr; if (nonLinearCounts.size() > 0) { nSubInterpolationCount = nonLinearCounts.at(nHatchIndex); - pSubInterpolationData = &m_InterpolationData.at(nInterpolationDataStartIndex + nTotalSubInterpolationCount); + if (nSubInterpolationCount > 0) + pSubInterpolationData = &m_InterpolationData.at(nInterpolationDataStartIndex + nTotalSubInterpolationCount); } pDstOverride->m_dFactors[nFactorIndex] = pSrcOverride->m_Point1Factor; diff --git a/Implementation/LibMCEnv/libmcenv_toolpathlayer.cpp b/Implementation/LibMCEnv/libmcenv_toolpathlayer.cpp index fd6b095d..13a038df 100644 --- a/Implementation/LibMCEnv/libmcenv_toolpathlayer.cpp +++ b/Implementation/LibMCEnv/libmcenv_toolpathlayer.cpp @@ -559,7 +559,7 @@ void CToolpathLayer::EvaluateTypedHatchProfileInterpolation(const LibMCEnv_uint3 } else { if ((pCountArrayBuffer != nullptr) || (pEvaluationDataBuffer != nullptr)) { - throw ELibMCEnvInterfaceException(LIBMCENV_ERROR_COULDNOTEVALUATEHATCHPROFILES); + //throw ELibMCEnvInterfaceException(LIBMCENV_ERROR_COULDNOTEVALUATEHATCHPROFILES); } } From 0872bcf229dd2bbde9fc4edcdd20ce3209fe37bb Mon Sep 17 00:00:00 2001 From: Yury Rodzikau Date: Mon, 20 Oct 2025 11:01:59 +0200 Subject: [PATCH 2/3] LibMCCore: add laser power channel to scatter plot and implement datatable channel filling - Renamed simulation column `active0` to `power` to reflect actual laser power semantics in SMC v1.1 job data output. - Updated simulation data export to write laser power values into the new `power` column. - Implemented `fillScatterplotChannel` in `libmcenv_datatable.cpp`: --- .../libmcdriver_scanlabsmc_smcjobinstance.cpp | 4 +-- .../LibMCEnv/libmcenv_datatable.cpp | 28 ++++++++++++++++++- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/Drivers/ScanLabSMC/Implementation/libmcdriver_scanlabsmc_smcjobinstance.cpp b/Drivers/ScanLabSMC/Implementation/libmcdriver_scanlabsmc_smcjobinstance.cpp index f8f2572b..4a950a37 100644 --- a/Drivers/ScanLabSMC/Implementation/libmcdriver_scanlabsmc_smcjobinstance.cpp +++ b/Drivers/ScanLabSMC/Implementation/libmcdriver_scanlabsmc_smcjobinstance.cpp @@ -817,7 +817,7 @@ void CSMCJobInstance::ReadSimulationFile_SMC_v1_0(LibMCEnv::PDataTable pDataTabl pDataTable->AddColumn("x", "X", LibMCEnv::eDataTableColumnType::DoubleColumn); pDataTable->AddColumn("y", "Y", LibMCEnv::eDataTableColumnType::DoubleColumn); pDataTable->AddColumn("laseron", "LaserOn", LibMCEnv::eDataTableColumnType::Uint32Column); - pDataTable->AddColumn("active0", "Active Channel 0", LibMCEnv::eDataTableColumnType::DoubleColumn); + pDataTable->AddColumn("power", "Laser Power", LibMCEnv::eDataTableColumnType::DoubleColumn); pDataTable->AddColumn("active1", "Active Channel 1", LibMCEnv::eDataTableColumnType::DoubleColumn); pDataTable->AddColumn("cmdindex", "Command Index", LibMCEnv::eDataTableColumnType::Int32Column); @@ -836,7 +836,7 @@ void CSMCJobInstance::ReadSimulationFile_SMC_v1_0(LibMCEnv::PDataTable pDataTabl pDataTable->SetUint32ColumnValues("laseron", laserSignal); laserSignal.resize(0); - pDataTable->SetDoubleColumnValues("active0", activeChannel0); + pDataTable->SetDoubleColumnValues("power", activeChannel0); activeChannel0.resize(0); pDataTable->SetDoubleColumnValues("active1", activeChannel1); diff --git a/Implementation/LibMCEnv/libmcenv_datatable.cpp b/Implementation/LibMCEnv/libmcenv_datatable.cpp index 8cb181b7..f3a1ecae 100644 --- a/Implementation/LibMCEnv/libmcenv_datatable.cpp +++ b/Implementation/LibMCEnv/libmcenv_datatable.cpp @@ -293,7 +293,33 @@ 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); + 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::runtime_error(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; + } } }; From b553625cbedb37a0d039e96cb96a42f6d5b0b3cf Mon Sep 17 00:00:00 2001 From: Yury Rodzikau Date: Mon, 20 Oct 2025 12:45:04 +0200 Subject: [PATCH 3/3] LibMCCore/WebClient: add laser power visualization mode and power data display in point inspector MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Added a new "powerramp" color mode in LayerView for visualizing laser power distribution across the toolpath. - Implemented computeChannelColumnRange(...) to detect the min/max of a data column and normalize power values for coloring. - Added makeLaserPowerColors() to convert normalized power values to HSL-based RGB gradient for visual representation. - Extended point inspector to display per-point laser power. - Updated data loading logic to correctly populate the "power" channel from backend stream data. - Updated Vue integration to cycle `laseron → powerramp → uniform → time` when toggling color modes. Signed-off-by: Yury Rodzikau --- Artifacts/clientdist/clientpackage.zip | Bin 4544061 -> 4544320 bytes Artifacts/clientdist/clientsourcepackage.zip | Bin 211856 -> 224317 bytes .../src/common/AMCImplementation_LayerView.js | 69 ++++++++++++++++++ Client/src/modules/AMCModule_LayerView.vue | 22 +++++- 4 files changed, 89 insertions(+), 2 deletions(-) diff --git a/Artifacts/clientdist/clientpackage.zip b/Artifacts/clientdist/clientpackage.zip index 287203dd4b5214ca7884d7d1d4e5ecfde6067508..2e84b006da03165f6f94a0b81be72492ac4c29f2 100644 GIT binary patch delta 28979 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

OWr^WZ@2JG5vOOAa;d32|S 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%0DJRWkF{Q9D;u!lpL*L0r;cn^6w!cFonT&UQj-l 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 Pfr|kFfuRTZJEZ>uo#jw5 delta 782 zcmYk3TSydP6vt=2<4BOs*_TVA3YQeH;dYS5pIzl=#zSD$>dMg@BE9lS*R5 z1}ucA*M|+=xLJCO!*vjim<`jPp83ViW|)FZ{pQdXfun5aj}8(}M`&l#Uv9P{(85w> z=!!vACcR=p5?1VuQpv8dXz^#1;=PE{e5X}69c;2fgLCXgt@f_Ofo4&{2QkX=*r6LE zuE(g=#zAgYPf^y!IJL?*>BfYEaXK~b;U?WJ?!{M{*=*O10m~B9=fG)h))RDVoigRh zCBSTR2>(CVy7VFoK1$HaS(0|Egt&Gm!Nt@Bhv!oi$PlBN`&v!5pX-m)lwm1J8NOZR y#+ag;9#XL_1)cC_Si~>0Vhuh_Q3>3}r4*cGLwC^B2TrR;@Cbc2L9jLg#rg-hJL|Ck diff --git a/Client/src/common/AMCImplementation_LayerView.js b/Client/src/common/AMCImplementation_LayerView.js index 8653ef5e..b0a392bf 100644 --- a/Client/src/common/AMCImplementation_LayerView.js +++ b/Client/src/common/AMCImplementation_LayerView.js @@ -326,6 +326,28 @@ class LayerViewImpl { } + computeChannelColumnRange (pointsChannelName, pointsColumnName) + { + if (this[pointsChannelName] && this[pointsChannelName][pointsColumnName]) { + let dataArray = this[pointsChannelName][pointsColumnName]; + + let maxValue = Number.NEGATIVE_INFINITY; + let minValue = Number.POSITIVE_INFINITY; + + for (let i = 0; i < dataArray.length; i++) { + let value = dataArray[i]; + if (value > maxValue) { + maxValue = value; + } + if (value < minValue) { + minValue = value; + } + } + this[pointsChannelName][pointsColumnName].max = maxValue; + this[pointsChannelName][pointsColumnName].min = minValue; + } + } + makeLaserOnColors () { this.laserOnPointsColorArray = null; @@ -351,6 +373,37 @@ class LayerViewImpl { } + makeLaserPowerColors () + { + this.layerPointsColorArray = null; + + if (this.laser && this.laser.power && this.layerPointsArray) { + const powerRange = (this.laser.power.max - this.laser.power.min); + if (powerRange > 0) { + + let pointCount = this.laser.power.length; + let colors = []; + + for (let pointIndex = 0; pointIndex < pointCount; pointIndex++) { + let power = this.laser.power[pointIndex]; + let fraction = (power - this.laser.power.min) / powerRange; + if (fraction >= 0.0) { + if (fraction > 1.0) + fraction = 1.0; + } else { + fraction = 0.0; + } + + const hue = (fraction) * 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] h = h % 1; // Wrap around if h is greater than 1 @@ -429,6 +482,8 @@ class LayerViewImpl { // Assign the data array to the corresponding column this[pointsChannelName][pointsColumnName] = pointsChannelDataArray; + + this.computeChannelColumnRange (pointsChannelName, pointsColumnName); } clearPoints () @@ -469,6 +524,10 @@ class LayerViewImpl { if (this.layerPointsMode == "laseron") { this.makeLaserOnColors (); } + + if (this.layerPointsMode == "powerramp") { + this.makeLaserPowerColors (); + } } setColorMode (newColorMode) { @@ -587,6 +646,16 @@ class LayerViewImpl { } + getPointPower (pointIndex) + { + if (this.laser && this.laser.power) { + if (pointIndex >= 0 && pointIndex < this.laser.power.length) { + return this.laser.power[pointIndex]; + } + } + return null; + } + updateLoadedLayer () { if (!this.glInstance) return; diff --git a/Client/src/modules/AMCModule_LayerView.vue b/Client/src/modules/AMCModule_LayerView.vue index 7ebdc34f..8fafcae3 100644 --- a/Client/src/modules/AMCModule_LayerView.vue +++ b/Client/src/modules/AMCModule_LayerView.vue @@ -157,8 +157,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. this.LayerViewerInstance.setColorMode ("laseron"); } else if (this.LayerViewerInstance.layerPointsMode == "laseron") { + this.LayerViewerInstance.setColorMode ("powerramp"); + } + else if (this.LayerViewerInstance.layerPointsMode == "powerramp") { this.LayerViewerInstance.setColorMode ("uniform"); - } else { + } + else { this.LayerViewerInstance.setColorMode ("time"); } }, @@ -240,6 +244,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. return "Color: LaserOn"; } + if (this.LayerViewerInstance.layerPointsMode == "powerramp") { + return "Color: Power"; + } + return "Color: Uniform"; }, @@ -357,6 +365,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. } else { console.log(`${key}: ${floatArray.length}`); } + } else if (key.toLowerCase() === 'power') { + 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.`); @@ -588,6 +602,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. let pointVelocity = this.LayerViewerInstance.getPointVelocity (pointIndex); let pointAcceleration = this.LayerViewerInstance.getPointAcceleration (pointIndex); let pointJerk = this.LayerViewerInstance.getPointJerk (pointIndex); + let pointPower = this.LayerViewerInstance.getPointPower (pointIndex); let infoCaption = `Point ID = ${pointIndex.toFixed(0)}\n`; if (pointPosition) { @@ -605,7 +620,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. let jerkinmeterspersecondsquared = pointJerk.j / 1000000.0; infoCaption += `Jerk: ${jerkinmeterspersecondsquared.toFixed(4)} km/s³\n`; } - + if (pointPower) { + let powerinwatts = pointPower; // * 1000.0; + infoCaption += `Power: ${powerinwatts.toFixed(4)} W\n`; + } this.lastMouseX = mouseX; this.lastMouseY = mouseY;