Fields

Автор Тема: Fields  (Прочитано 8047 раз)

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

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Fields
« : 07-03-2014, 14:34:56 »
Доброго времени суток.

AutoCAD 2009 SP3 x64 Enu

Атрибуту программно назначено следующее значение:
Цитировать
%<\AcExpr ((%<\AcObjProp.16.2 Object(%<\_ObjId 8796087905888>%,1).InsertionPoint \f "%lu2%pt2">%-%<\AcObjProp.16.2 Object(%<\_ObjId 8796087894560>%,1).InsertionPoint \f "%lu2%pt2">%)/1000) \f "%lu2%pr3%ds44">%

Это значение корректно работает: создаётся поле, отображающее нужное значение.

Как видим, в тексте присутствуют идентификаторы (точнее Handle) двух объектов. Программно требуется получить их. На данный момент, я выполняю это посредством Regex. Упрощённый (для наглядности) код выглядит так:
Код - C# [Выбрать]
  1. // Текстовое значение фильтра: "Object\(%<\\_ObjId ([0-9]{1,19})>%.* Object\(%<\\_ObjId ([0-9]{1,19})>%"
  2. Match match = Regex.Match(attValue, ElevationLabelExtension.RegexFilter);
  3. Group group = match.Groups[2];
  4. Int64 anchorPtr = 0;
  5. Int64.TryParse(group.Value, out anchorPtr);
  6. Db.ObjectId anchorId = new Db.ObjectId(new IntPtr(anchorPtr));

Всё работает, однако мне бы хотелось получать идентификатор не при помощи Regex, но используя объекты класса Field. Правильно ли я понимаю,  что всё, что содержит в себе текст, начинающийся с "%<\" и заканчивается ">%" трактуется как поле? Т.е. в приведённой выше строке текста полей содержится 5 шт.: AcExpr, AcObjProp.16.2, ObjId, AcObjProp.16.2, ObjId.
Ориентируясь на такую трактовку, я набросал следующий код:
Код - C# [Выбрать]
  1. ...
  2. // Рекурсивно ищу поля и вывожу на консоль информацию о них
  3. if (attRef.HasFields) {
  4.         Db.ObjectId fieldId = attRef.GetField();
  5.         Db.Field field = tr.GetObject(fieldId, Db.OpenMode.ForRead) as Db.Field;
  6.         Db.Field[] fields = field.GetChildren();                                                       
  7.         PrintFields(ed, fields);
  8.        
  9. }
  10. ...
  11. private static void PrintFields(Ed.Editor ed, Db.Field[] fields) {
  12.         foreach (Db.Field childField in fields) {
  13.                 String code = childField.GetFieldCode(
  14.                         Db.FieldCodeFlags.AddMarkers | Db.FieldCodeFlags.FieldCode);
  15.                 String value = childField.GetStringValue();                            
  16.                 ed.WriteMessage("Code: {0}\nValue: {1}\n",code, value);
  17.                 if (childField.HasFields) PrintFields(ed, childField.GetChildren());
  18.         }
  19. }
На консоль получаю такой результат:
Цитировать
Code: %<\AcExpr ((%<\AcObjProp.16.2 Object(%<\_ObjId 8796087905888>%,1).InsertionPoint \f "%lu2%pt2">%-%<\AcObjProp.16.2 Object(%<\_ObjId 8796087894560>%,1).InsertionPoint \f "%lu2%pt2">%)/1000) \f "%lu2%pr3%ds44">%
Value: 0,000

Т.е. видимо я неверно понимаю, сколько полей в моей строке и на самом деле там оно действительно одно? Если эту строку формировать в AutoCAD посредством дизайнера полей, то сначала я создаю выражение и затем в нём создаю два поля... Можно ли посредством Field получить значение идентификатора, как я это делаю при помощи Regex?

Спасибо.

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Fields
« Ответ #1 : 07-03-2014, 15:18:20 »
Т.е. видимо я неверно понимаю, сколько полей в моей строке и на самом деле там оно действительно одно?
В данном случае это одно поле. И еще мне кажется что перед вызовом
Код - C# [Выбрать]
  1. String value = childField.GetStringValue();  
у тебя не хватает
Код - C# [Выбрать]
  1. childField.Evaluate();  
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Fields
« Ответ #2 : 07-03-2014, 15:46:11 »
но тем не менее, значение вычисляется :)
А как насчёт моего, собствено, основного вопроса:
Цитировать
Можно ли посредством Field получить значение идентификатора, как я это делаю при помощи Regex?
?
Или же дополнительный парсинг неизбежен?

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Fields
« Ответ #3 : 07-03-2014, 15:52:24 »
Подозреваю, что это статический метод Field.FindField
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Fields
« Ответ #4 : 07-03-2014, 15:58:44 »
В данном случае это одно поле.
Т.е. текстовое представление поля определяется "%<\AcExpr" и ">%"?

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Fields
« Ответ #5 : 07-03-2014, 15:59:25 »
Да.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Fields
« Ответ #6 : 07-03-2014, 16:01:20 »
Да.
понятно, значит применительно к данной задаче, класс Field можно смело отправлять в ведро, и остаётся старый, добрый Regex...