Региональные настройки AutoCAD Civil 3D версии 2019

Автор Тема: Региональные настройки AutoCAD Civil 3D версии 2019  (Прочитано 9430 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Сегодня обнаружил странность в работе своего приложения. Если запускать в AutoCAD Civil 3D 2017 - в диалогах настроек в окнах для ввода числовых значений в качестве разделителя используется точка, а в AutoCAD Civil 3D 2019 в тех же самых местах - запятая! Конечно же, хочется однообразия. Но для этого, сперва хочется понять причину такого поведения. В AutoCAD версии 2019 что-то изменили связанное с региональными настройками?
« Последнее редактирование: 05-03-2019, 23:16:13 от Дмитрий Загорулькин »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Официальных заявлений по этому поводу я не видел. Насколько мне известно в AutoCAD всех версий и локализаций в качестве разделителя целой и дробной части использовалась точка. Это происходит и в чистом AutoCAD Civil 3D 2019 без дополнений и со всеми обновлениями?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Это происходит и в чистом AutoCAD Civil 3D 2019 без дополнений и со всеми обновлениями?
Ну он у меня вроде такой и есть. Или Вы что-то другое имели в виду?
Я пока просто поинтересовался - мало ли я что-то пропустил. Сейчас попробую сделать небольшую тестовую команду и прогнать её в разных версиях. Я правильно понимаю, что надо исследовать Thread.CurrentThread.CurrentUICulture?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Попробовал проверить вот таким кодом:
Код - C# [Выбрать]
  1. public class TestNumberDecimalSeparator
  2. {
  3.     [CommandMethod("ShowNumDecimalSeparator")]
  4.     public void Run()
  5.     {
  6.         string
  7.             curCultDecSep = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator,
  8.             curUICultDecSep = CultureInfo.CurrentUICulture.NumberFormat.NumberDecimalSeparator;
  9.  
  10.         Application.ShowAlertDialog
  11.             ($"CurrentCulture разделитель: {curCultDecSep}{GetDescription(curCultDecSep)}\n"
  12.             + $"CurrentUICulture разделитель: {curUICultDecSep}{GetDescription(curUICultDecSep)}");
  13.     }
  14.  
  15.     static string GetDescription(string separator)
  16.     {
  17.         switch (separator)
  18.         {
  19.             case ".":
  20.                 return "(Точка)";
  21.  
  22.             case ",":
  23.                 return "(Запятая)";
  24.  
  25.             default:
  26.                 return "(Другой)";
  27.         }
  28.     }
  29. }
  30.  
Результат во всех AutoCAD и Civil на моём ПК одинаковый - первый разделитель точка, второй - запятая. Что-то я тогда совсем не понимаю, почему тогда в диалогах есть разница?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Дмитрий Загорулькин,
Не исключаю, что эти команды в AutoCAD Civil 3D 2019 зачем-то переключают разделитель целой и дробной части, а затем его восстанавливают.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Не исключаю, что эти команды в AutoCAD Civil 3D 2019 зачем-то переключают разделитель целой и дробной части, а затем его восстанавливают.
Так ведь это мои команды. В них нет никакого переключения разделителя. Код один и тот же для разных версий - вообще нет никаких различий. Но в 2017 точки, а в 2019 - запятые... Пока что-то даже сообразить не могу куда копать.
Есть только идея везде принудительно задавать отображение чисел с точкой с помощью конвертера, наподобие такого, как в этом обсуждении: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/aa6e7507-8a42-48fc-a5de-3c6a49f7e15f/problem-with-binding-double-value-to-textbox?forum=wpf
Но это работы немало :(

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Так ведь это мои команды.
Т.е. это твои диалоговые окна? А как ты туда выводишь числа?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Используется контрол TextBox у которого свойство Text с помощью Binding привязывается к соответствующему численному свойству класса, который является ViewModel'ю.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Используется контрол TextBox у которого свойство Text с помощью Binding привязывается к соответствующему численному свойству класса, который является ViewModel'ю.
Т.е. WPF? Ну там могут быть свои особенности и какой CultureInfo и какой используется разделитель - черт его знает...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Создал самое простейшее WPF окошко по тому же самому принципу привязки данных - у меня проблема воспроизводится. Проект прикладываю. Можете проверить у себя на чистом AutoCAD? Собранная DLL под .NETFramework 4.0 лежит в папке bin/Debug. Нужно загрузить и запустить команду RUNSIMPLEWPFWINDOW.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
У меня чистый AutoCAD 2019 English - в нём точка. Позднее проверю в русской локализации.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Вильдар

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
У меня
Civil 2017 - точка
Civil 2019 - запятая
Кстати, в моих плагинах оказывается тоже самое  ???
А на что это может повлиять?

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
А на что это может повлиять?
В моём приложении пользователи вводят значения в эти поля. И если ввести значение с неправильным разделителем, то результат может получиться неожиданным. И догадаться в чём дело довольно сложно.
Добавил вывод сообщения в окошко для наглядности.

Оффлайн Вильдар

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Ну если TextBox биньдить к числу, то в него нельзя будет ввести не число же.

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
При неправильном вводе связанное с TextBox значение сбрасывается на 0.0 не изменяется. Хорошо если пользователь внимательный и увидит, что появилась красная рамка у TextBox, задумается в чём проблема и догадается, что надо ввести другой разделитель. Но я, например, совершенно не ожидал, что нужно будет вводить запятую и не обратил внимания на "подсветку". И заметил, что что-то не так уже сильно позже того, как менял настройки...
P.S. Да и несолидно это как-то для серьёзного приложения - заставлять пользователя гадать какой надо разделитель в зависимости от версии Civil 3D. Причём, там где у меня есть конвертеры собственные - там воспринимается точка, а где конвертер по умолчанию - запятая. Получается, что даже в рамках одной версии нет единообразия.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Дмитрий Загорулькин,
В AutoCAD 2019 Russian:


Т.е. то как у вас происходит - это похоже проблема Civil 3D 2019. ;-)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Эх... Спасибо за проверку!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Эх... Спасибо за проверку!
А в диалогах самого Civil 3D 2019 в качестве разделителя запятая или точка?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Вильдар

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Точки похоже:


Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Если учесть, что этим диалогам лет по 10 минимум, я сильно сомневаюсь, что они WPF.

Отмечено как Решение Александр Ривилис 11-03-2019, 17:52:11

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
В общем, как показали опыты, действительно, в версиях 2017 и 2019 различаются региональные параметры, используемые в WPF диалогах. В 2017 используется "en-US", в 2019 - "ru-RU". Исходя из этого, есть, как минимум, два варианта решения проблемы. Оба они позволяют обойти это поведение, даже если его снова изменят в следующей версии.
Первый - в каждом бинде числового значения задавать параметр ConverterCulture (даже если не используется собственный конвертер):
Код - XML [Выбрать]
  1. Text="{Binding DoubleValue, Mode=TwoWay, ConverterCulture=en-US}
Второй - использовать собственный конвертер. Как развитие этой идеи - использовать собственный контрол с блэкджеком и прочими дополнениями. Например, можно сделать так, чтобы ввод поддерживал одновременно и запятую и точку. Пример такого контрола и его использования - в прилагаемом проекте.

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Довольно интересная статья на тему: https://www.codeproject.com/Tips/1004834/Binding-with-Respect-to-CurrentCulture
Там есть ещё пара вариантов решения.

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
В версии 2020 - аналогично с 2019. Причём, не имеет разницы - английский Civil 3D или русский. Провёл несколько опытов и выяснил, что поведение зависит от настройки "Язык интерфейса Windows". В принципе, для WPF в целом - это выглядит довольно логично. Но с учётом того, что Civil запускается с флагом /Language "en-US" и весь свой интерфейс переводит на английский, а для внутренних диалогов всё равно используются русская культура - то скорее всего, это баг.