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

ADN Club => AutoCAD .NET API => Тема начата: Андрей Бушман от 27-11-2013, 20:18:05

Название: Как связывать поле (Field) с компонентами подшивки (sheet set)?
Отправлено: Андрей Бушман от 27-11-2013, 20:18:05
Спасибо.
Название: Re: Как связывать поле (Field) с компонентами подшивки (sheet set)?
Отправлено: Александр Ривилис от 27-11-2013, 22:00:14
Давай попробуем пойти другим путём. Создай такое поле вручную (средствами AutoCAD), а потом проанализируй его при помощи ARXDBG/MGDDBG. Тогда мне кажется будет понятно как его создать.
Название: Re: Как связывать поле (Field) с компонентами подшивки (sheet set)?
Отправлено: Андрей Бушман от 27-11-2013, 22:11:11
Давай попробуем пойти другим путём. Создай такое поле вручную (средствами AutoCAD), а потом проанализируй его при помощи ARXDBG/MGDDBG. Тогда мне кажется будет понятно как его создать.
Если бы я знал, как создать такое поле хотя бы в ручную, то не создавал бы этой темы.

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

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

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

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

Спасибо.
Название: Re: Как связывать поле (Field) с компонентами подшивки (sheet set)?
Отправлено: Андрей Бушман от 28-11-2013, 12:10:25
Чтобы тема не зачахла в виду непонимания того, о чём я спросил, привожу более развёрнутую информацию...

Когда пользователь создаёт в графическом интерфейса менеджера подшивок новое пользовательское свойство уровня подшивки или листа, то оно добавляется в набор пользовательских свойств объекта 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 вовсе не предусмотрена возможность создавать поля ни для произвольных пользовательских свойств подшивки, ни для групп листов в частности (самый хреновый варинат).
Название: Re: Как связывать поле (Field) с компонентами подшивки (sheet set)?
Отправлено: Андрей Бушман от 01-12-2013, 09:36:54
А по этой теме какие-то движения есть? Честно говоря, из всех вопросов, связанных с подшивками, этот для меня наиболее важен, т.к. иметь возможность создать навороченную структуру подшивок, но не иметь возможность привязываться к этой информации посредством полей - это "рубит на корню" все плюсы, предоставляемые программным интерфейсом подшивок.