diff --git a/.vscode/launch.json b/.vscode/launch.json index 9a57d11f..68c94526 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -5,7 +5,6 @@ "version": "0.2.0", "configurations": [ { -CreateDmxChannelSet "preLaunchTask": "build" }, { diff --git a/src/GDTFManager.cpp b/src/GDTFManager.cpp index 44369f46..f1728817 100644 --- a/src/GDTFManager.cpp +++ b/src/GDTFManager.cpp @@ -5589,16 +5589,12 @@ const TGdtfDmxLogicalChannelArray GdtfDmxChannel::GetLogicalChannelArray() EGdtfChannelBitResolution SceneData::GdtfDmxChannel::GetChannelBitResolution() { - // 0 is false, everything else is true - if ((!fCoarse) && !fFine && !fUltra && !fUber) { return EGdtfChannelBitResolution::eGdtfChannelBitResolution_32; } - else if (( fCoarse) && !fFine && !fUltra && !fUber) { return EGdtfChannelBitResolution::eGdtfChannelBitResolution_8; } - else if (( fCoarse) &&( fFine) && !fUltra && !fUber ) { return EGdtfChannelBitResolution::eGdtfChannelBitResolution_16; } - else if (( fCoarse) &&( fFine) && ( fUltra) && !fUber ) { return EGdtfChannelBitResolution::eGdtfChannelBitResolution_24; } - else if (( fCoarse) &&( fFine) && ( fUltra) && ( fUber)) { return EGdtfChannelBitResolution::eGdtfChannelBitResolution_32; } - - // Other states are invalid. This line should never be reached. - DSTOP((kEveryone, "Invalid state in GetChannelBitResolution()")); - return EGdtfChannelBitResolution::eGdtfChannelBitResolution_8; + if (!fCoarse) { return EGdtfChannelBitResolution::eGdtfChannelBitResolution_16; } + else if (!fFine) { return EGdtfChannelBitResolution::eGdtfChannelBitResolution_8; } + else if (!fUltra) { return EGdtfChannelBitResolution::eGdtfChannelBitResolution_16; } + else if (!fUber ) { return EGdtfChannelBitResolution::eGdtfChannelBitResolution_24; } + + return EGdtfChannelBitResolution::eGdtfChannelBitResolution_32; } DmxValue SceneData::GdtfDmxChannel::GetChannelMaxDmx() diff --git a/src/XmlFileHelper.cpp b/src/XmlFileHelper.cpp index 5a15315e..fb01ce2f 100644 --- a/src/XmlFileHelper.cpp +++ b/src/XmlFileHelper.cpp @@ -3,6 +3,7 @@ //----------------------------------------------------------------------------- #include "Prefix/StdAfx.h" +#include using namespace VectorworksMVR::VWFC; #include "SceneDataExchange.h" @@ -745,7 +746,23 @@ bool SceneData::GdtfConverter::ConvertDMXValue(const TXString& strValue, const I double percentage = (dmxValueRaw / maxResolution); - intValue = percentage * maxChannelUnit; + double result = percentage * maxChannelUnit; + + // Clamp to avoid floating-point precision errors when converting from higher to lower resolution + if (result > maxChannelUnit) { + intValue = maxChannelUnit; + } else { + // Preserve ordering: ensure non-zero inputs stay non-zero + if (dmxValueRaw > 0 && result < 1.0) { + intValue = 1; + } else { + intValue = static_cast(result + 0.5); + } + + if (intValue > maxChannelUnit) { + intValue = maxChannelUnit; + } + } } else @@ -757,7 +774,7 @@ bool SceneData::GdtfConverter::ConvertDMXValue(const TXString& strValue, const I - if ( GetChannelMaxDmx(chanlReso) < intValue) + if ( intValue > GetChannelMaxDmx(chanlReso)) { GdtfParsingError error (GdtfDefines::EGdtfParsingError::eValueError_DmxValueHasWrongValue, node); SceneData::GdtfFixture::AddError(error); diff --git a/unittest/GdtfDmxUnittest.cpp b/unittest/GdtfDmxUnittest.cpp index d0c34bd2..e44de408 100644 --- a/unittest/GdtfDmxUnittest.cpp +++ b/unittest/GdtfDmxUnittest.cpp @@ -303,13 +303,14 @@ void GdtfDmxUnittest::WriteFile() virtualFunction->SetAttribute(attribute5); __checkVCOM(virtualFunction->SetDefaultValue(50000)); - IGdtfDmxChannelSetPtr virtualChannelSet1; - virtualFunction->CreateDmxChannelSet("My Name1", 0, 0, &virtualChannelSet1); - - IGdtfDmxChannelSetPtr virtualChannelSet3; - virtualFunction->CreateDmxChannelSet("My Name3", 4294967295, 4294967295, &virtualChannelSet3); + IGdtfDmxChannelSetPtr virtualChannelSet1; + virtualFunction->CreateDmxChannelSet("My Name1", 0, 0, &virtualChannelSet1); + IGdtfDmxChannelSetPtr virtualChannelSet2; + virtualFunction->CreateDmxChannelSet("", 1, 65534, &virtualChannelSet2); + IGdtfDmxChannelSetPtr virtualChannelSet3; + virtualFunction->CreateDmxChannelSet("My Name3", 65535, 65535, &virtualChannelSet3); __checkVCOM(gdtfWrite->Close()); } } @@ -581,13 +582,13 @@ void GdtfDmxUnittest::ReadFile() this->CheckChannelSet(virtualChannelSet1, "My Name1", 0, 0); - IGdtfDmxChannelSetPtr virtualChannelSet2; - __checkVCOM(virtualFunction->GetDmxChannelSetAt(1, &virtualChannelSet2)); - this->CheckChannelSet(virtualChannelSet2, "", 1, 4294967294); + IGdtfDmxChannelSetPtr virtualChannelSet2; + __checkVCOM(virtualFunction->GetDmxChannelSetAt(1, &virtualChannelSet2)); + this->CheckChannelSet(virtualChannelSet2, "", 1, 65534); - IGdtfDmxChannelSetPtr virtualChannelSet3; - __checkVCOM(virtualFunction->GetDmxChannelSetAt(2, &virtualChannelSet3)); - this->CheckChannelSet(virtualChannelSet3, "My Name3", 4294967295, 4294967295); + IGdtfDmxChannelSetPtr virtualChannelSet3; + __checkVCOM(virtualFunction->GetDmxChannelSetAt(2, &virtualChannelSet3)); + this->CheckChannelSet(virtualChannelSet3, "My Name3", 65535, 65535); } PrintParsingErrorList(gdtfRead);