Как связывать поле (Field) с компонентами подшивки (sheet set)?

Автор Тема: Как связывать поле (Field) с компонентами подшивки (sheet set)?  (Прочитано 8728 раз)

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

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
  • Как связать Field со значением элемента AcSmCustomPropertyValue?
  • Как связать Field со значением компонента подшивки через его идентификатор (IAcSmObjectId)? Например сослаться на имя группы листов (AcSmSubset) идентификатор (IAcSmObjectId) которой известен, или же на её определённое пользовательское свойство, добавленное программно.
Спасибо.
« Последнее редактирование: 27-11-2013, 20:41:30 от Андрей Бушман »

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

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

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Давай попробуем пойти другим путём. Создай такое поле вручную (средствами AutoCAD), а потом проанализируй его при помощи ARXDBG/MGDDBG. Тогда мне кажется будет понятно как его создать.
Если бы я знал, как создать такое поле хотя бы в ручную, то не создавал бы этой темы.

Текущая реализация графического инструментария AutoCAD позволяет привязываться к AcSmCustomPropertyValue определённым в составе самой подшивки, а для групп листов такая возможность отсутствует.

В менеджере подшивок базовой версии AutoCAD так же отсутствует возможность создавать пользовательские свойства для групп подшивок, однако это не означает, что такой возможности нет на самом деле: COM API подшивок позволяет это сделать программно, что я успешно и делаю. Но создать пользовательские свойства, читать их и редактировать - это только полдела - теперь нужно выполнить то, ради чего они, собственно, и создавались: связать их значения с полями. Без такой связи пользовательские свойства становятся почти бесполезными.

Я надеюсь (правда слабо), что создать такие поля всё таки можно, ведь все пользовательские свойства всех элементов подшивки представлены объектами одного и того же типа: AcSmCustomPropertyValue, а поскольку существует возможность привязаться к пользовательским свойствам подшивки и листа, то логично было бы предположить, что и для групп листов такая возможность (программная, т.к. в GUI  подшивок это не реализовано) может существовать.

Кроме того, я нигде не видел нормальной документации на тему полей (Field), в которой бы подробно были изложены принципы построения текстового кода поля со всеми их возможными форматами и описанием имеющихся ограничений. Может плохо искал? Приходится гадать по фотографиям, изучая текстовые коды других полей. Если такая информация всё же имеется (а вдруг?), то буду признателен за ссылку на неё.

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

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Чтобы тема не зачахла в виду непонимания того, о чём я спросил, привожу более развёрнутую информацию...

Когда пользователь создаёт в графическом интерфейса менеджера подшивок новое пользовательское свойство уровня подшивки или листа, то оно добавляется в набор пользовательских свойств объекта AcSmSheetSet. Однако аналогичный набор имеется и у групп листов IAcSmSubset, а так же непосредственно у листов AcSmSheet подшивки. Это обусловлено тем, что все перечисленные выше классы наследуются от IAcSmComponent. Соответственно имеется возможность создавать пользовательские свойства групп листов, а так же дополнительные, индивидуальные пользовательские свойства, специфичные для конкретного листа (в случае такой необходимости). Программно всё это выполняется успешно. Но, как говорится, вернёмся к нашим баранам: поля (Fields)...

Когда пользователь создаёт в графическом интерфейса менеджера подшивок новое пользовательское свойство уровня подшивки (Sheet), AutoCAD генерирует для поля (Field)  такой код:
%<\AcSm SheetSet.PropertyName>%где вместо PropertyName подставляется имя конкретного пользовательского свойства уровня подшивки.

Когда пользователь создаёт в графическом интерфейса менеджера подшивок новое пользовательское свойство уровня листа (Sheet), AutoCAD генерирует для поля (Field)  такой код:
%<\AcSm Sheet.PropertyName>%где вместо PropertyName подставляется имя конкретного пользовательского свойства уровня листа.

Поскольку в подшивке присутствует множество групп листов (AsSmSubset), то в коде поля должен быть как-то указан конкретный AsSmSubset. Логично предположить, что идентификация должна выполняться при помощи идентификатора IAcSmObjectId, по аналогии тому, как в AutoCAD происходит считывание значения некоторого свойства для конкретного примитива: там для этого используется ObjectId.

Например, для того, чтобы сослаться в поле на значение длины некоторой линии, AutoCAD создаёт примерно такое поле:
%<\AcObjProp Object(%<\_ObjId 2128461592>%).Length \f "%lu2%pr2">%где 2128461592 - это конкретное числовое значение идентификатора  ObjectId, а Length - имя искомого свойства (\f "%lu2%pr2" - это форматирование, которое пока не представляет интереса для пользовательских свойств).

Руководствуясь некоторой логикой, я могу предположить, что для группы листов (AsSmSubset) код поля должен был бы выглядеть примерно так:
%<\AcSmObjProp Object(%<\_ObjId 2128461592>%).PropertyName>%где 2128461592 - это конкретное числовое значение идентификатора  IAcSmObjectId, а PropertyName - имя искомого свойства.

Объекты класса IAcSmObjectId имеют такие идентификаторы: HashCode, представленный целым числом, и Handle, записанный в виде GUID. Например, для одного из пользовательских свойств, добавленных  мною к группе листов, их значения были такими:
Цитировать
HashCode = 47463329
Handle = g57EF20E1-B173-4F1E-8C88-0EBA806AFCB5

Имя добавленного в группу листов пользовательского свойства было таким: sh_prop_2. Соответственно код поля, должен был бы быть примерно таким:
%<\AcSmObjProp Object(%<\_ObjId 47463329>%).sh_prop_2>%ну, или на крайний случай (что весьма маловероятно), таким:
%<\AcSmObjProp Object(%<\_ObjId g57EF20E1-B173-4F1E-8C88-0EBA806AFCB5>%).sh_prop_2>%
Однако оба варианта показывают вместо значений ####.

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

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
А по этой теме какие-то движения есть? Честно говоря, из всех вопросов, связанных с подшивками, этот для меня наиболее важен, т.к. иметь возможность создать навороченную структуру подшивок, но не иметь возможность привязываться к этой информации посредством полей - это "рубит на корню" все плюсы, предоставляемые программным интерфейсом подшивок.