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

ADN Club => AutoCAD .NET API => Тема начата: Дмитрий Загорулькин от 11-03-2014, 12:20:11

Название: Как получить ограничения для динамических параметров блоков?
Отправлено: Дмитрий Загорулькин от 11-03-2014, 12:20:11
Здравствуйте!
В динамическом блоке имеется, к примеру, линейный параметр. Варианты задания значения для него: Нет, Приращение и Список. В первых двух вариантах можно задавать максимальное и минимальное значение. Во втором можно задать еще приращение изменения значения между максимальным и минимальным значением. В третьем варианте - строго фиксированный список возможных значений.
Вот таким вот образом можно добраться до значений списка (метод DynamicBlockReferenceProperty.GetAllowedValues):
http://through-the-interface.typepad.com/through_the_interface/2009/03/accessing-the-properties-of-a-dynamic-autocad-block-using-net.html
А как получить максимальное, минимальное значения и приращение?
Прикладываю чертеж для примера.
Название: Re: Как получить ограничения для динамических параметров блоков?
Отправлено: Дмитрий Загорулькин от 11-03-2014, 13:39:39
Вопрос снимается. Опыты показали, что при задании значения, не попадающего в диапазон, автоматически (каким-то внутренним механизмом) принимается значение из допустимых, ближайшее к заданному. Что для меня самое удивительное - исключений никаких не возникает :).
Название: Re: Как получить ограничения для динамических параметров блоков?
Отправлено: Дмитрий Загорулькин от 11-03-2014, 15:12:27
Зато возник вопрос с параметром отражения (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 - для отраженного. Откуда можно получить текстовые названия состояний?

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fs28.postimg.org%2Fp4kpyrf7t%2FFlip_States.jpg&hash=f1953a5469c928269eecac8e1dea3908) (http://postimg.org/image/p4kpyrf7t/)

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fs30.postimg.org%2Ffdqnny3tp%2FFlip_States_From_Net.jpg&hash=84093f5c05672d7c8b7386a36522b60b) (http://postimg.org/image/fdqnny3tp/)
Название: Re: Как получить ограничения для динамических параметров блоков?
Отправлено: Александр Ривилис от 11-03-2014, 15:50:12
В любом случае публичного API для этого нет.
Название: Re: Как получить ограничения для динамических параметров блоков?
Отправлено: Дмитрий Загорулькин от 11-03-2014, 16:43:55
Эврика!
Сделал на базе этого: 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