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

28/10/2014

Проблема с префиксом и суффиксом размеров

Remy van den Bor из компании ICN Solutions столкнулся с проблемой при попытке получить префикс и суффикс размера. В результате общения, Scott Wilson предоставил несколько возможных решений проблемы.

Вопрос: Я заметил странную особенность при работе с размерами в Revit 2014 и 2015.

У меня есть набор размеров из Revit и мне нужно проверить, используется ли префикс или суффикс. Если да, то поместить это значение в текстовое поле.

Проблема в следующих строках:

Код - C#: [Выделить]
  1. dim(seg).Prefix != null and dim(seg).Suffix != null

Допустим, у размера есть только суффикс «мм» и в этом случае свойство dim.Prefix возвращает пустую строку. Но, если не используется ни префикс ни суффикс, то Revit выбрасывает исключение AccesViolation и закрывается без каких-либо предупреждений.

Фактически, вы не можете проверить суффикс или префикс размера, если ни один из них не установлен.

В качестве временного решения я проверяю, является ли значение размера числом или нет. Если нет, значит у размера есть суффикс или префикс.

Кто-нибудь знает, как решить эту проблему более корректным способом?

Вот мой код, который я использую для проверки, дабы избежать непредвиденное завершение работы Revit:

Код - C#: [Выделить]
  1.   private bool CheckVal( string val )
  2.   {
  3.     foreach( char c in val )
  4.     {
  5.       if( !char.IsDigit( c ) && c != '.' )
  6.       {
  7.         return true;
  8.       }
  9.     }
  10.     return false;
  11.   }
  12.  
  13.   // . . .
  14.  
  15.   if( CheckVal( dimseg.ValueString ) )
  16.   {
  17.     if( string.IsNullOrEmpty( txtPrefix.Text ) )
  18.     {
  19.       txtPrefix.Text = dimseg.Prefix;
  20.     }
  21.     if( string.IsNullOrEmpty( txtSuffix.Text ) )
  22.     {
  23.       txtSuffix.Text = dimseg.Suffix;
  24.     }
  25.   }

Ответ Скота: Я придумал пару способов как избежать этой неопрятной ошибки, до тех пор, пока она не будет исправлена.

Первый способ довольно скучный и долгий. Этот способ предполагает анализ значения свойства ValueString – того значения, которое видит пользователь в интерфейсе, и определения того, есть ли там модификаторы значения.

Это немного сложно для реализации, и, к счастью, вам не придется это делать. Есть более красивый способ. Если вы зададите значение любому текстовому свойству у размера, то похоже после этого можно без ошибок обращаться к свойству Prefix или Suffix.

Т.е., перед тем как обращаться к свойствам, которые закрывают Revit, просто возьмите свойство, которое работает без ошибок, и переназначьте его значение на то же самое. Например, свойство Above.

Вот пример кода:

Код - C#: [Выделить]
  1.   foreach( DimensionSegment dimseg in dim.Segments )
  2.   {
  3.     dimseg.Above = dimseg.Above; // Привет API! Давай исправляйсяJ
  4.  
  5.     if( string.IsNullOrEmpty( txtPrefix.Text ) )
  6.     {
  7.       txtPrefix.Text = dimseg.Prefix;
  8.     }
  9.     if( string.IsNullOrEmpty( txtSuffix.Text ) )
  10.     {
  11.       txtSuffix.Text = dimseg.Suffix;
  12.     }
  13.   }

ДОБАВЛЕНО: Упс.. Оказывается, вы уже нашли решение. Что ж, будет еще одно.

Ответ: Я попробовал решение Скота. В Revit 2014 это не работает. Revit по прежнему падает. А в Revit 2015 работает нормально. Подтверждаю.

Источник: http://thebuildingcoder.typepad.com/blog/2014/09/revit-2015-r2-ur4-and-dimension-prefix-suffix.html#3

Обсуждение: http://adn-cis.org/forum/index.php?topic=1056

Опубликовано 28.10.2014
Отредактировано 18.11.2014 в 15:24:26