Сообщество программистов Autodesk в СНГ

ADN Club => Civil 3D API => Тема начата: Дмитрий Загорулькин от 05-03-2019, 15:21:15

Название: Региональные настройки AutoCAD Civil 3D версии 2019
Отправлено: Дмитрий Загорулькин от 05-03-2019, 15:21:15
Сегодня обнаружил странность в работе своего приложения. Если запускать в AutoCAD Civil 3D 2017 - в диалогах настроек в окнах для ввода числовых значений в качестве разделителя используется точка, а в AutoCAD Civil 3D 2019 в тех же самых местах - запятая! Конечно же, хочется однообразия. Но для этого, сперва хочется понять причину такого поведения. В AutoCAD версии 2019 что-то изменили связанное с региональными настройками?
Название: Re: Региональные настройки процесса AutoCAD версии 2019
Отправлено: Александр Ривилис от 05-03-2019, 15:25:28
Официальных заявлений по этому поводу я не видел. Насколько мне известно в AutoCAD всех версий и локализаций в качестве разделителя целой и дробной части использовалась точка. Это происходит и в чистом AutoCAD Civil 3D 2019 без дополнений и со всеми обновлениями?
Название: Re: Региональные настройки процесса AutoCAD версии 2019
Отправлено: Дмитрий Загорулькин от 05-03-2019, 15:30:56
Это происходит и в чистом AutoCAD Civil 3D 2019 без дополнений и со всеми обновлениями?
Ну он у меня вроде такой и есть. Или Вы что-то другое имели в виду?
Я пока просто поинтересовался - мало ли я что-то пропустил. Сейчас попробую сделать небольшую тестовую команду и прогнать её в разных версиях. Я правильно понимаю, что надо исследовать Thread.CurrentThread.CurrentUICulture?
Название: Re: Региональные настройки процесса AutoCAD версии 2019
Отправлено: Александр Ривилис от 05-03-2019, 15:32:35
Глянь вот эту тему: http://adn-cis.org/forum/index.php?topic=7022.0
Название: Re: Региональные настройки процесса AutoCAD версии 2019
Отправлено: Дмитрий Загорулькин от 05-03-2019, 15:58:12
Попробовал проверить вот таким кодом:
Код - 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 на моём ПК одинаковый - первый разделитель точка, второй - запятая. Что-то я тогда совсем не понимаю, почему тогда в диалогах есть разница?
Название: Re: Региональные настройки процесса AutoCAD версии 2019
Отправлено: Александр Ривилис от 05-03-2019, 16:01:18
Дмитрий Загорулькин,
Не исключаю, что эти команды в AutoCAD Civil 3D 2019 зачем-то переключают разделитель целой и дробной части, а затем его восстанавливают.
Название: Re: Региональные настройки процесса AutoCAD версии 2019
Отправлено: Дмитрий Загорулькин от 05-03-2019, 16:25:10
Не исключаю, что эти команды в 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
Но это работы немало :(
Название: Re: Региональные настройки процесса AutoCAD версии 2019
Отправлено: Александр Ривилис от 05-03-2019, 16:27:31
Так ведь это мои команды.
Т.е. это твои диалоговые окна? А как ты туда выводишь числа?
Название: Re: Региональные настройки процесса AutoCAD версии 2019
Отправлено: Дмитрий Загорулькин от 05-03-2019, 16:30:44
Используется контрол TextBox у которого свойство Text с помощью Binding привязывается к соответствующему численному свойству класса, который является ViewModel'ю.
Название: Re: Региональные настройки процесса AutoCAD версии 2019
Отправлено: Александр Ривилис от 05-03-2019, 16:31:59
Используется контрол TextBox у которого свойство Text с помощью Binding привязывается к соответствующему численному свойству класса, который является ViewModel'ю.
Т.е. WPF? Ну там могут быть свои особенности и какой CultureInfo и какой используется разделитель - черт его знает...
Название: Re: Региональные настройки процесса AutoCAD версии 2019
Отправлено: Дмитрий Загорулькин от 05-03-2019, 18:39:23
Создал самое простейшее WPF окошко по тому же самому принципу привязки данных - у меня проблема воспроизводится. Проект прикладываю. Можете проверить у себя на чистом AutoCAD? Собранная DLL под .NETFramework 4.0 лежит в папке bin/Debug. Нужно загрузить и запустить команду RUNSIMPLEWPFWINDOW.
Название: Re: Региональные настройки процесса AutoCAD версии 2019
Отправлено: Александр Ривилис от 05-03-2019, 18:48:02
У меня чистый AutoCAD 2019 English - в нём точка. Позднее проверю в русской локализации.
Название: Re: Региональные настройки процесса AutoCAD версии 2019
Отправлено: Вильдар от 05-03-2019, 19:03:36
У меня
Civil 2017 - точка
Civil 2019 - запятая
Кстати, в моих плагинах оказывается тоже самое  ???
А на что это может повлиять?
Название: Re: Региональные настройки процесса AutoCAD версии 2019
Отправлено: Дмитрий Загорулькин от 05-03-2019, 19:06:32
А на что это может повлиять?
В моём приложении пользователи вводят значения в эти поля. И если ввести значение с неправильным разделителем, то результат может получиться неожиданным. И догадаться в чём дело довольно сложно.
Добавил вывод сообщения в окошко для наглядности.
Название: Re: Региональные настройки процесса AutoCAD версии 2019
Отправлено: Вильдар от 05-03-2019, 19:10:52
Ну если TextBox биньдить к числу, то в него нельзя будет ввести не число же.
Название: Re: Региональные настройки процесса AutoCAD версии 2019
Отправлено: Дмитрий Загорулькин от 05-03-2019, 19:17:07
При неправильном вводе связанное с TextBox значение сбрасывается на 0.0 не изменяется. Хорошо если пользователь внимательный и увидит, что появилась красная рамка у TextBox, задумается в чём проблема и догадается, что надо ввести другой разделитель. Но я, например, совершенно не ожидал, что нужно будет вводить запятую и не обратил внимания на "подсветку". И заметил, что что-то не так уже сильно позже того, как менял настройки...
P.S. Да и несолидно это как-то для серьёзного приложения - заставлять пользователя гадать какой надо разделитель в зависимости от версии Civil 3D. Причём, там где у меня есть конвертеры собственные - там воспринимается точка, а где конвертер по умолчанию - запятая. Получается, что даже в рамках одной версии нет единообразия.
Название: Re: Региональные настройки процесса AutoCAD версии 2019
Отправлено: Александр Ривилис от 05-03-2019, 20:51:47
Дмитрий Загорулькин,
В AutoCAD 2019 Russian:
(https://farm8.staticflickr.com/7895/33415465588_9818ba3eb0_o.png)

Т.е. то как у вас происходит - это похоже проблема Civil 3D 2019. ;-)
Название: Re: Региональные настройки процесса AutoCAD версии 2019
Отправлено: Дмитрий Загорулькин от 05-03-2019, 23:14:21
Эх... Спасибо за проверку!
Название: Re: Региональные настройки AutoCAD Civil 3D версии 2019
Отправлено: Александр Ривилис от 06-03-2019, 00:02:49
Эх... Спасибо за проверку!
А в диалогах самого Civil 3D 2019 в качестве разделителя запятая или точка?
Название: Re: Региональные настройки AutoCAD Civil 3D версии 2019
Отправлено: Вильдар от 06-03-2019, 08:21:47
Точки похоже:
(https://i.postimg.cc/Cz0SC7Ps/civildots.jpg) (https://postimg.cc/Cz0SC7Ps)
Название: Re: Региональные настройки AutoCAD Civil 3D версии 2019
Отправлено: Дмитрий Загорулькин от 06-03-2019, 14:03:53
Если учесть, что этим диалогам лет по 10 минимум, я сильно сомневаюсь, что они WPF.
Название: Re: Региональные настройки AutoCAD Civil 3D версии 2019
Отправлено: Дмитрий Загорулькин от 11-03-2019, 16:50:12
В общем, как показали опыты, действительно, в версиях 2017 и 2019 различаются региональные параметры, используемые в WPF диалогах. В 2017 используется "en-US", в 2019 - "ru-RU". Исходя из этого, есть, как минимум, два варианта решения проблемы. Оба они позволяют обойти это поведение, даже если его снова изменят в следующей версии.
Первый - в каждом бинде числового значения задавать параметр ConverterCulture (даже если не используется собственный конвертер):
Код - XML [Выбрать]
  1. Text="{Binding DoubleValue, Mode=TwoWay, ConverterCulture=en-US}
Второй - использовать собственный конвертер. Как развитие этой идеи - использовать собственный контрол с блэкджеком и прочими дополнениями. Например, можно сделать так, чтобы ввод поддерживал одновременно и запятую и точку. Пример такого контрола и его использования - в прилагаемом проекте.
Название: Re: Региональные настройки AutoCAD Civil 3D версии 2019
Отправлено: Дмитрий Загорулькин от 11-03-2019, 17:10:36
Довольно интересная статья на тему: https://www.codeproject.com/Tips/1004834/Binding-with-Respect-to-CurrentCulture
Там есть ещё пара вариантов решения.
Название: Re: Региональные настройки AutoCAD Civil 3D версии 2019
Отправлено: Дмитрий Загорулькин от 22-04-2019, 18:05:24
В версии 2020 - аналогично с 2019. Причём, не имеет разницы - английский Civil 3D или русский. Провёл несколько опытов и выяснил, что поведение зависит от настройки "Язык интерфейса Windows". В принципе, для WPF в целом - это выглядит довольно логично. Но с учётом того, что Civil запускается с флагом /Language "en-US" и весь свой интерфейс переводит на английский, а для внутренних диалогов всё равно используются русская культура - то скорее всего, это баг.