Как получить ограничения для динамических параметров блоков?

Автор Тема: Как получить ограничения для динамических параметров блоков?  (Прочитано 4994 раз)

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Здравствуйте!
В динамическом блоке имеется, к примеру, линейный параметр. Варианты задания значения для него: Нет, Приращение и Список. В первых двух вариантах можно задавать максимальное и минимальное значение. Во втором можно задать еще приращение изменения значения между максимальным и минимальным значением. В третьем варианте - строго фиксированный список возможных значений.
Вот таким вот образом можно добраться до значений списка (метод DynamicBlockReferenceProperty.GetAllowedValues):
http://through-the-interface.typepad.com/through_the_interface/2009/03/accessing-the-properties-of-a-dynamic-autocad-block-using-net.html
А как получить максимальное, минимальное значения и приращение?
Прикладываю чертеж для примера.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Вопрос снимается. Опыты показали, что при задании значения, не попадающего в диапазон, автоматически (каким-то внутренним механизмом) принимается значение из допустимых, ближайшее к заданному. Что для меня самое удивительное - исключений никаких не возникает :).

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Зато возник вопрос с параметром отражения (Flip).
Проверяю таким кодом:
Код - C# [Выбрать]
  1. [CommandMethod("TestDynParams")]
  2.         public void TestDynParamsRun()
  3.         {
  4.             Document adoc = Application.DocumentManager.MdiActiveDocument;
  5.             Database db = adoc.Database;
  6.             Editor ed = adoc.Editor;
  7.            
  8.             PromptEntityOptions blkSelOpt = new PromptEntityOptions("\nSelect block: ");
  9.             blkSelOpt.SetRejectMessage("\nThis is not block!");
  10.             blkSelOpt.AddAllowedClass(typeof(BlockReference), true);
  11.  
  12.             PromptEntityResult blkSelRes = ed.GetEntity(blkSelOpt);
  13.             if (blkSelRes.Status == PromptStatus.OK)
  14.             {
  15.                 using (Transaction tr = db.TransactionManager.StartTransaction())
  16.                 {
  17.                     BlockReference blkRef = tr.GetObject(blkSelRes.ObjectId, OpenMode.ForRead) as BlockReference;
  18.  
  19.                     if (blkRef.IsDynamicBlock)
  20.                     {
  21.                         DynamicBlockReferencePropertyCollection dynPropCol = blkRef.DynamicBlockReferencePropertyCollection;                        
  22.                         foreach (DynamicBlockReferenceProperty prop in dynPropCol)
  23.                         {
  24.                             // Свойство отражения
  25.                             if (prop.UnitsType == DynamicBlockReferencePropertyUnitsType.NoUnits && prop.PropertyTypeCode == 3)
  26.                             {
  27.                                 ed.WriteMessage("Name: {0}, value: {1}", prop.PropertyName, prop.Value);
  28.                             }                            
  29.                         }
  30.                     }
  31.                     tr.Commit();
  32.                 }
  33.             }
  34.         }
Если смотреть значение параметра с помощью палитры свойств - то там осмысленные текстовые названия состояний. Если же получать значения с помощью Net, то вместо текста будет 0 - для нормального состояния и 1 - для отраженного. Откуда можно получить текстовые названия состояний?





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

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Эврика!
Сделал на базе этого: http://adndevblog.typepad.com/autocad/2012/05/accessing-visible-entities-in-a-dynamic-block.html
Только вместо раздела "AcDbBlockVisibilityParameter" искал "AcDbBlockFlipParameter".
Под кодом 305 - название параметра. 307 - название нормального состояния, 308 - отраженного.
Переделать под 2014 автокад помогла эта статья: http://adn-cis.org/zerkalnoe-otobrazhenie-primitiva-odnostrochnogo-teksta-(dbtext).html