From 905859d0d9af2fd5c24e2889ddefe4909d4c2bc0 Mon Sep 17 00:00:00 2001 From: Dmitry Rogozhin Date: Fri, 12 Jul 2024 15:43:01 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE=20=D1=87=D1=82=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=BA=D0=B8-=D1=84=D0=BE=D1=80=D0=BC=D0=B0?= =?UTF-8?q?=D1=82=D0=B0=20=D1=81=D0=B2=D0=BE=D0=B9=D1=81=D1=82=D0=B2=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=20=D1=87=D1=82=D0=B5=D0=BD=D0=B8=D0=B8=20?= =?UTF-8?q?=D1=81=D0=BE=D1=81=D1=82=D0=B0=D0=B2=D0=B0=20=D0=BA=D0=BE=D0=BD?= =?UTF-8?q?=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Исправлено #97 Добавлена возможность замены разделителя дробной части при выводе числа в строку --- Sources/AddOn/Helpers.cpp | 24 +++++++++++++++++++++--- Sources/AddOn/Helpers.hpp | 7 ++----- Sources/AddOn/ReNum.cpp | 2 -- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/Sources/AddOn/Helpers.cpp b/Sources/AddOn/Helpers.cpp index ed5935b..64a1da2 100644 --- a/Sources/AddOn/Helpers.cpp +++ b/Sources/AddOn/Helpers.cpp @@ -24,6 +24,7 @@ #include "ProfileVectorImageOperations.hpp" #include "ProfileAdditionalInfo.hpp" + Int32 isEng () { GSErrCode err = NoError; @@ -375,6 +376,9 @@ bool ReserveElement (const API_Guid& objectId, GSErrCode& err) return false; // Не получилось зарезервировать } +// ----------------------------------------------------------------------------- +// Вывод сообщения в отчёт +// ----------------------------------------------------------------------------- void msg_rep (const GS::UniString & modulename, const GS::UniString & reportString, const GSErrCode & err, const API_Guid & elemGuid) { GS::UniString error_type = ""; @@ -2484,12 +2488,17 @@ bool MenuInvertItemMark (short menuResID, short itemIndex) // } //} +// ----------------------------------------------------------------------------- +// Извлекает из строки информацио о единицах измерении и откруглении +// ----------------------------------------------------------------------------- FormatString PropertyHelpers::ParseFormatString (const GS::UniString & stringformat) { int n_zero = 3; Int32 krat = 0; // Крутность округления double koeff = 1; //Коэфф. увеличения bool trim_zero = true; //Требуется образать нули после запятой + bool needround = false; //Требуется округлить численное значение для вычислений + GS::UniString delimetr = ","; // Разделитель дробной части FormatString format; format.stringformat = stringformat; GS::UniString outstringformat = stringformat; @@ -2522,6 +2531,14 @@ FormatString PropertyHelpers::ParseFormatString (const GS::UniString & stringfor n_zero = 3; outstringformat.ReplaceAll ("m", ""); } + if (outstringformat.Contains ("p")) { + delimetr = "."; + outstringformat.ReplaceAll ("p", ""); + } + if (outstringformat.Contains ("r")) { + needround = true; + outstringformat.ReplaceAll ("r", ""); + } // Принудительный вывод заданного кол-ва нулей после запятой if (outstringformat.Contains ("0")) { @@ -2530,7 +2547,6 @@ FormatString PropertyHelpers::ParseFormatString (const GS::UniString & stringfor if (!outstringformat.IsEmpty ()) trim_zero = false; } if (!outstringformat.IsEmpty ()) { - // Кратность округления if (outstringformat.Contains ("/")) { GS::Array params; @@ -2544,6 +2560,8 @@ FormatString PropertyHelpers::ParseFormatString (const GS::UniString & stringfor format.isEmpty = false; format.isRead = true; } + format.needRound = needround; + format.delimetr = delimetr; format.n_zero = n_zero; format.krat = krat; format.koeff = koeff; @@ -4884,7 +4902,7 @@ bool ParamHelpers::ConvertToParamValue (ParamValue & pvalue, const API_Property pvalue.val.doubleValue = round (ang * 100000.0) / 100000.0; } else { pvalue.val.doubleValue = round (property.value.singleVariant.variant.doubleValue * 100000.0) / 100000.0; - if (property.value.singleVariant.variant.doubleValue - pvalue.val.rawDoubleValue > 0.001) pvalue.val.rawDoubleValue += 0.001; + if (property.value.singleVariant.variant.doubleValue - pvalue.val.doubleValue > 0.001) pvalue.val.doubleValue += 0.001; } pvalue.val.intValue = (GS::Int32) pvalue.val.doubleValue; if (pvalue.val.intValue / 1 < pvalue.val.doubleValue) pvalue.val.intValue += 1; @@ -5183,12 +5201,12 @@ void ParamHelpers::ConvertByFormatString (ParamValue & pvalue) Int32 krat = pvalue.val.formatstring.krat; double koeff = pvalue.val.formatstring.koeff; bool trim_zero = pvalue.val.formatstring.koeff; + pvalue.val.rawDoubleValue = pvalue.val.doubleValue; // До округлений pvalue.val.uniStringValue = ParamHelpers::ToString (pvalue); if (koeff != 1) n_zero = n_zero + (GS::Int32) log10 (koeff); pvalue.val.doubleValue = round (pvalue.val.doubleValue * pow (10, n_zero)) / pow (10, n_zero); pvalue.val.intValue = (GS::Int32) pvalue.val.doubleValue; if (fabs (pvalue.val.doubleValue) > std::numeric_limits::epsilon ()) pvalue.val.boolValue = true; - pvalue.val.rawDoubleValue = pvalue.val.doubleValue; } } diff --git a/Sources/AddOn/Helpers.hpp b/Sources/AddOn/Helpers.hpp index 639bdbf..0e85294 100644 --- a/Sources/AddOn/Helpers.hpp +++ b/Sources/AddOn/Helpers.hpp @@ -100,7 +100,7 @@ typedef struct { int n_zero = 2; //Количество нулей после запятой GS::UniString stringformat = ""; // Формат строки (задаётся с помощью .mm или .0) - bool needRound = false; + bool needRound = false; //Использовать в расчётах округлённые значения Int32 krat = 0; // Крутность округления double koeff = 1; //Коэфф. увеличения bool trim_zero = true; //Требуется образать нули после запятой @@ -123,7 +123,7 @@ typedef struct GS::Int32 intValue = 0; bool boolValue = false; double doubleValue = 0.0; //дробное значение, округлённое - double rawDoubleValue = 0.0; + double rawDoubleValue = 0.0; //прочитанное значение bool canCalculate = false; // Может ли быть использован в формулах? FormatString formatstring; // Формат строки (задаётся с помощью .mm или .0) int array_row_start = 0; // Начальная строка массива @@ -296,9 +296,6 @@ bool IsElementEditable (const API_Guid& objectId, const SyncSettings& syncSettin // ----------------------------------------------------------------------------- bool ReserveElement (const API_Guid& objectId, GSErrCode& err); -// ----------------------------------------------------------------------------- -// Вывод сообщения в отчёт -// ----------------------------------------------------------------------------- void msg_rep (const GS::UniString& modulename, const GS::UniString& reportString, const GSErrCode& err, const API_Guid& elemGuid); // ----------------------------------------------------------------------------- diff --git a/Sources/AddOn/ReNum.cpp b/Sources/AddOn/ReNum.cpp index b121aaf..734ed63 100644 --- a/Sources/AddOn/ReNum.cpp +++ b/Sources/AddOn/ReNum.cpp @@ -24,7 +24,6 @@ // 3. Откидываем все с вфключенным флагом // 4. По количеству уникальных имён свойств-правил, взятых из Renum_flag{*имя свойства с правилом*}, разбиваем элементы // ----------------------------------------------------------------------------------------------------------------------- - GSErrCode ReNumSelected (SyncSettings& syncSettings) { GS::UniString funcname ("Numbering"); @@ -77,7 +76,6 @@ GSErrCode ReNumSelected (SyncSettings& syncSettings) bool GetRenumElements (GS::Array guidArray, ParamDictElement& paramToWriteelem) { - // Получаем список правил суммирования Rules rules; ParamDictElement paramToReadelem;