Странное поведение Palette

Автор Тема: Странное поведение Palette  (Прочитано 17920 раз)

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

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Странное поведение Palette
« : 29-11-2013, 10:40:55 »
- AutoCAD 2009 x86 SP3 Enu
- Windows XP x86 SP3 Rus

Палитра инструментов изначально открывается не в том виде (позиция\размеры\свойства), который мною назначался в коде:

Код - C# [Выбрать]
  1. /// <summary>
  2. /// This command displays the "Sheet Set Viewer" palette.
  3. /// </summary>
  4. [Rtm.CommandMethod(ns, "ss-viewer", Rtm.CommandFlags.Session)]
  5. public void OpenSheetSetViewer() {
  6.         // Create the new palette set
  7.         Win.PaletteSet palette_set = new Win.PaletteSet(
  8.                 "Sheet Set Viewer");
  9.  
  10.         ElementHost host = new ElementHost();
  11.         host.AutoSize = true;
  12.         host.Dock = DockStyle.Fill;
  13.         // Host my WPF control
  14.         SheetSetViewer control = new SheetSetViewer();
  15.  
  16.         // Save the link to the custom control
  17.         control.tree.Tag = control;
  18.         control.props.Tag = control;
  19.  
  20.         host.Child = control;
  21.         // Create the new tab in the palette set
  22.         Win.Palette palette = palette_set.Add("Sheet set's tree", host);
  23.  
  24.         GetOpenedSheetSets(control); // Fill the combo box (sheet sets list)
  25.  
  26.         // Update the info, when other sheet set was selected from the combo box.
  27.         control.cboSheetSets.SelectionChanged += new WPF.SelectionChangedEventHandler(
  28.                 cboSheetSets_SelectionChanged);
  29.  
  30.         // Update the property's info, when other item was selected in the sheet set tree.
  31.         control.tree.SelectedItemChanged += new System.Windows
  32.                 .RoutedPropertyChangedEventHandler<object>(tree_SelectedItemChanged);
  33.  
  34.         palette_set.Style = Win.PaletteSetStyles.ShowCloseButton |
  35.                 Win.PaletteSetStyles.ShowPropertiesMenu |
  36.                 Win.PaletteSetStyles.ShowAutoHideButton;
  37.         palette_set.Size = new Size(400, 600);
  38.         // Position of top left corner of palette
  39.         palette_set.Location = new Point(400, 400);
  40.         // Let the palette set can be docked only to left\right by the user
  41.         palette_set.DockEnabled = Win.DockSides.Left | Win.DockSides.Right;
  42.         // Uncheck the "Allow Docking" (as I expect).
  43.         palette_set.Dock = Win.DockSides.None;
  44.  
  45.         // Display the palette set
  46.         palette_set.KeepFocus = true;
  47.         palette_set.Visible = true;
  48. }

Однако при вызове команды ss-viewer палитра открывается в виде, показанном ниже файлом 0.png. Если я вручную оттаскиваю палитру от края и открываю её свойства, то вижу, что опция прикрепления включена, хотя я её отключал в коде, а так же прописывал координаты левого верхнего угла палитры (см. второе изображение: 1.png).

Если я поменяю местами два фрагмента кода:

Код - C# [Выбрать]
  1. // Display the palette set
  2. palette_set.KeepFocus = true;
  3. palette_set.Visible = true;
  4.  
  5. palette_set.Style = Win.PaletteSetStyles.ShowCloseButton |
  6.         Win.PaletteSetStyles.ShowPropertiesMenu |
  7.         Win.PaletteSetStyles.ShowAutoHideButton;
  8. palette_set.Size = new Size(400, 600);
  9. // Position of top left corner of palette
  10. palette_set.Location = new Point(400, 400);
  11. // Let the palette set can be docked only to left\right by the user
  12. palette_set.DockEnabled = Win.DockSides.Left | Win.DockSides.Right;
  13. // Uncheck the "Allow Docking" (as I expect).
  14. palette_set.Dock = Win.DockSides.None;

т. е. сначала отображаю палитру и только после этого начинаю править её настройки, то она открывается не прикреплённой, а так, как показано на скрине 2.png. Причём изначально палитра открывается прикреплённой к левому краю, но через долю секунды отлипает и занимает ту позицию, которая показана. При этом на самом деле позиция и размеры палитры не те, которые я указывал в коде. Однако и это ещё не всё...

Если сначала изменить свойство Dock, а потом менять остальные:

Код - C# [Выбрать]
  1. // Display the palette set
  2. palette_set.KeepFocus = true;
  3. palette_set.Visible = true;
  4.  
  5. // Uncheck the "Allow Docking" (as I expect).
  6. palette_set.Dock = Win.DockSides.None;
  7. palette_set.Style = Win.PaletteSetStyles.ShowCloseButton |
  8.         Win.PaletteSetStyles.ShowPropertiesMenu |
  9.         Win.PaletteSetStyles.ShowAutoHideButton;
  10. palette_set.Size = new Size(400, 600);
  11. // Position of top left corner of palette
  12. palette_set.Location = new Point(400, 400);
  13. // Let the palette set can be docked only to left\right by the user
  14. palette_set.DockEnabled = Win.DockSides.Left | Win.DockSides.Right;

то в этом случае палитра открывается так, как показано на 4.png. Обратите внимание на позицию и размеры палитры - в этот раз они правильные, как я и задавал в коде.

Но и это ещё не всё!

Код - C# [Выбрать]
  1. // Uncheck the "Allow Docking" (as I expect).
  2. palette_set.Dock = Win.DockSides.None;
  3.  
  4. // Display the palette set
  5. palette_set.KeepFocus = true;
  6. palette_set.Visible = true;
  7.  
  8. palette_set.Style = Win.PaletteSetStyles.ShowCloseButton |
  9.         Win.PaletteSetStyles.ShowPropertiesMenu |
  10.         Win.PaletteSetStyles.ShowAutoHideButton;
  11. palette_set.Size = new Size(400, 600);
  12. // Position of top left corner of palette
  13. palette_set.Location = new Point(400, 400);
  14. // Let the palette set can be docked only to left\right by the user
  15. palette_set.DockEnabled = Win.DockSides.Left | Win.DockSides.Right;

При таком порядке редактирования свойств палитра вообще не появляется! Безобразный результат выглядит так, как показано в файле 5.png.

В моём понимании, поведение палитры не должно отличаться при перестановке местами обозначенных мною строк кода.

Почему так происходит? Предполагаю, что это баг, поскольку конечный результат, в виде состояния объекта, не должен зависеть от порядка изменения его свойств.

Спасибо.
« Последнее редактирование: 29-11-2013, 12:40:03 от Андрей Бушман »

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Странное поведение Palette
« Ответ #1 : 29-11-2013, 14:37:14 »
Проверь повторяется ли такое поведение и в последних версиях AutoCAD.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Странное поведение Palette
« Ответ #2 : 29-11-2013, 16:12:11 »
Проверь повторяется ли такое поведение и в последних версиях AutoCAD.
Я так понял, что с подобным поведением вы не сталкивались, и скорее всего это баг... :(

Только из личного уважения к вам, проверил под AutoCAD 2014 x64 SP1 Enu (который мне абсолютно не сдался) - всё то же самое один в один, так что можете отправлять на эту тему сообщение в ADN (хотя вряд ли они на это обратят внимание в виду того, что даже более серьёзные моменты порой годами лежат в wish list мёртвым грузом). :(

 Странно, что за столько лет этого никто не заметил, хотя... Кеан Волмслей 100% это видел, когда писал примеры, но в своём блоге об этом предпочёл скромно промолчать (или может я всё же плохо искал, а он сообщал об этом?)...

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Странное поведение Palette
« Ответ #3 : 29-11-2013, 16:18:49 »
Только из личного уважения к вам, проверил под AutoCAD 2014 x64 SP1 Enu - всё то же самое один в один, так что можете отправлять на эту тему сообщение в ADN.
Андрей! Из личного уважения ко мне сделай еще одну вещь. Создай три метода создания палитры (дающие разные результаты) в одном проекте VS под AutoCAD 2014, и выложи его на форум, чтобы я мог его отправить в ADN DevHelp. Я сталкивался с аналогичным поведением (когда порядок установки свойств влиял на итоговое поведение) в других вещах  в ObjectARX.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Странное поведение Palette
« Ответ #4 : 29-11-2013, 16:32:04 »
Андрей! Из личного уважения ко мне сделай еще одну вещь.
Пользуетесь моей добротой... :) Смотрите вложенный файл.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Странное поведение Palette
« Ответ #5 : 29-11-2013, 18:58:18 »
Спасибо. Я отправил проект и картинки, сделанные при запуске каждой из команд в ADN DevHelp. Будем ждать ответа.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Странное поведение Palette
« Ответ #6 : 29-11-2013, 19:09:04 »
Спасибо. Я отправил проект и картинки, сделанные при запуске каждой из команд в ADN DevHelp. Будем ждать ответа.
На своей машине запускали код? Наблюдаете то же самое?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Странное поведение Palette
« Ответ #7 : 29-11-2013, 19:13:10 »
Да. Вот что у меня получилось. Особенно интересен второй рисунок, когда палитра появилась за пределами окна AutoCAD.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Странное поведение Palette
« Ответ #8 : 02-12-2013, 11:08:21 »
Дополнительный вопрос по теме (изначально забыл обозначить его)...

Код - C# [Выбрать]
  1. //*****************************************************************************
  2. // WARNING! read this topic: http://adn-cis.org/forum/index.php?topic=364.0
  3. // The sequence of assignment the values for the properties influences behavior
  4. // of Palette!!! It is a bug of API, I checked it for both AutoCAD 2009 and 2014.
  5. // I use the such sequence (it works as I expect):
  6.  
  7. // Display the palette set
  8. palette_set.KeepFocus = true;
  9. palette_set.Visible = true;
  10.  
  11. // Uncheck the "Allow Docking" (as I expect) in the palette's context menu.
  12. palette_set.Dock = Win.DockSides.None;
  13. palette_set.Style = Win.PaletteSetStyles.ShowCloseButton |
  14.         Win.PaletteSetStyles.ShowPropertiesMenu |
  15.         Win.PaletteSetStyles.ShowAutoHideButton;
  16. palette_set.Size = new Size(400, 600);
  17. // Position of top left corner of palette
  18. palette_set.Location = new Point(200, 100);
  19. // Let the palette set can be docked only to left\right by the user
  20. palette_set.DockEnabled = Win.DockSides.Left | Win.DockSides.Right;
  21. //*****************************************************************************
  22.  

В документации ObjectARX SDK 2009\2014 я не нашёл информации по классу PaletteSet и, соответственно, по его свойству Dock. В комментарии (строка 11) я обозначил своё предположение на тему того, на что должно влиять это свойство. Однако, как показывает практика, опция остаётся включенной (см. скрин во вложении). Это очередной баг, или же я не верно понимаю назначение свойства? Если второе, то как программно снять обозначенную галочку?

Спасибо.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Странное поведение Palette
« Ответ #9 : 02-12-2013, 18:26:46 »
Это очередной баг, или же я не верно понимаю назначение свойства?
Думаю, что ты неправильно понимаешь назначение этого свойства, и то свойство которое тебя должно интересовать - DockEnabled

Пришел ответ на твой вопрос. Привожу его целиком:

Цитировать
Дорогие Александр и Андрей,

Это известное поведение (комментарий переводчика - не баг) закрепленных палитр.
Последовательность шагов в команде "palette_1" правильная. Следует учитывать:
1) Палитра должна быть видимой перед тем как устанавливать сторону закрепления / состояние закрепления.
2) Сторона (стороны) закрепления следует указать до изменения состояния закрепления.

С наилучшими пожеланиями,
Balaji
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Странное поведение Palette
« Ответ #10 : 02-12-2013, 19:10:08 »
Думаю, что ты неправильно понимаешь назначение этого свойства, и то свойство которое тебя должно интересовать - DockEnabled
Да, оно... Но если через него отключить Allow Docking, то этот пункт вообще исчезает из контекстного меню. Как сделать так, чтобы галочка была снята, и пункт меню оставался?

Это известное поведение (комментарий переводчика - не баг) закрепленных палитр.
Последовательность шагов в команде "palette_1" правильная. Следует учитывать:
1) Палитра должна быть видимой перед тем как устанавливать сторону закрепления / состояние закрепления.
2) Сторона (стороны) закрепления следует указать до изменения состояния закрепления.
Хорошо... Давайте поиграем по этим правилам...

Код - C# [Выбрать]
  1. //*****************************************************************************
  2. // WARNING! read this topic: http://adn-cis.org/forum/index.php?topic=364.0
  3. // The sequence of assignment the values for the properties influences behavior
  4. // of Palette!!! I checked it for both AutoCAD 2009 and 2014.
  5. // I use the such sequence (it works as I expect):
  6.  
  7. // Display the palette set
  8. palette_set.KeepFocus = true;
  9. palette_set.Visible = true;
  10.  
  11. palette_set.Style = Win.PaletteSetStyles.ShowCloseButton |
  12.         Win.PaletteSetStyles.ShowPropertiesMenu |
  13.         Win.PaletteSetStyles.ShowAutoHideButton;                       
  14. // Let the palette set can be docked only to left\right by the user
  15. palette_set.DockEnabled = Win.DockSides.Left | Win.DockSides.Right;
  16.  
  17. // Dock status at the starting time  of displaying of the palette.
  18. palette_set.Dock = Win.DockSides.None;
  19.  
  20. // Position of top left corner of palette
  21. palette_set.Location = new Point(150, 200);
  22. palette_set.Size = new Size(400, 600);
  23. //*****************************************************************************
Результат смотрим в файле 1.png (там всё пучком).

А теперь в этом коде давайте просто назначим свойству Dock другое значение Вместо None укажем Left:

Код - C# [Выбрать]
  1. // Dock status at the starting time  of displaying of the palette.
  2. palette_set.Dock = Win.DockSides.Left;

Смотрим файл 2.png.

Как видим, в моём коде учтены требования, обозначенные Баладжи. Однако второй скрин вызывает у мене некоторые сомнения на тему того, что
Цитировать
Это известное поведение (комментарий переводчика - не баг) закрепленных палитр.

Или это так же входит в число "известных поведений" и багом не считается? :)

Спасибо.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Странное поведение Palette
« Ответ #11 : 02-12-2013, 20:43:33 »
Мне кажется, что в твоём коде (в самом конце) не хватает строки:
Код - C# [Выбрать]
  1. palette_set.RecalculateDockSiteLayout();
Попробуй.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Странное поведение Palette
« Ответ #12 : 03-12-2013, 11:52:21 »
Мне кажется, что в твоём коде (в самом конце) не хватает строки:
Код - C#: [Выделить]
palette_set.RecalculateDockSiteLayout();
Попробуй.

Спасибо. Да, это помогло. Выкладываю итоговый вариант правильной последовательности (поправьте, если ошибаюсь) изменения свойств палитры, на тот случай, если кому-то будет интересно:

Код - C# [Выбрать]
  1. //*****************************************************************************
  2. // WARNING! The sequence of the values assignment for the properties influences
  3. // behavior of Palette! It is necessary to set up properties in the order provided
  4. // below.
  5.  
  6. // 1. Set the icon
  7. palette_set.Icon = Icon.FromHandle(Resource1.SheetSet.GetHicon());
  8.  
  9. // Display the palette set.
  10. // 2. The palette shall be visible before setting the side of the Docking or Docking status.
  11. palette_set.KeepFocus = true;
  12. palette_set.Visible = true;
  13.  
  14. palette_set.Style = Win.PaletteSetStyles.ShowCloseButton |
  15.         Win.PaletteSetStyles.ShowPropertiesMenu |
  16.         Win.PaletteSetStyles.ShowAutoHideButton;
  17.  
  18. // Let the palette set can be docked only to left\right by the user.
  19. // 3. The side (sides) of the Docking must to be specified before changing of the Docking state.
  20. palette_set.DockEnabled = Win.DockSides.Left | Win.DockSides.Right;
  21.  
  22. // The Docking status at the starting time  of displaying of the palette.
  23. // 4. Set the Docking status.
  24. palette_set.Dock = Win.DockSides.None;
  25.  
  26. // Position of the top left corner of palette
  27. palette_set.Location = new Point(150, 200);
  28.  
  29. palette_set.Size = new Size(400, 600);
  30. palette_set.TitleBarLocation = Win.PaletteSetTitleBarLocation.Left;
  31. palette_set.Opacity = 100;                     
  32.  
  33. // 5. Don't forget to do it at the end
  34. palette_set.RecalculateDockSiteLayout();
  35.  
  36. // P.S. Also you can reed this (russian text): http://adn-cis.org/forum/index.php?topic=364.0
  37. //*****************************************************************************
« Последнее редактирование: 04-12-2013, 09:19:31 от Андрей Бушман »

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Странное поведение Palette
« Ответ #13 : 03-12-2013, 20:04:37 »
Александр Наумович, вы просили меня запустить  в AutoCAD 2014 x64 SP1 код, обозначающий эту проблему и проверить, воспроизведётся ли она в указанной разрядности, если не вызывать указанный вами метод:
Код - C# [Выбрать]
  1. palette_set.RecalculateDockSiteLayout();

Ответ положительный - проблема возникает, так что можно передавать привет Баладжи... ;)
« Последнее редактирование: 03-12-2013, 20:21:22 от Андрей Бушман »

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Странное поведение Palette
« Ответ #14 : 04-12-2013, 09:22:42 »
В последовательности инициализации свойств палитры, Баладжи забыл упомянуть о том, что свойство Icon должно быть инициализировано до того, как палитра станет видимой. Подправил код в предыдущем своём коде с учётом этого обстоятельства.

Полезный материал опубликован по ссылке: Creating a Docking Palette for AutoCAD with VB.NET.