ADN Club > AutoCAD .NET API

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

(1/1)

Андрей Бушман:

* Как связать Field со значением элемента AcSmCustomPropertyValue?
* Как связать Field со значением компонента подшивки через его идентификатор (IAcSmObjectId)? Например сослаться на имя группы листов (AcSmSubset) идентификатор (IAcSmObjectId) которой известен, или же на её определённое пользовательское свойство, добавленное программно.Спасибо.

Александр Ривилис:
Давай попробуем пойти другим путём. Создай такое поле вручную (средствами AutoCAD), а потом проанализируй его при помощи ARXDBG/MGDDBG. Тогда мне кажется будет понятно как его создать.

Андрей Бушман:

--- Цитата: Александр Ривилис от 27-11-2013, 22:00:14 ---Давай попробуем пойти другим путём. Создай такое поле вручную (средствами AutoCAD), а потом проанализируй его при помощи ARXDBG/MGDDBG. Тогда мне кажется будет понятно как его создать.
--- Конец цитаты ---
Если бы я знал, как создать такое поле хотя бы в ручную, то не создавал бы этой темы.

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

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

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

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

Спасибо.

Андрей Бушман:
Чтобы тема не зачахла в виду непонимания того, о чём я спросил, привожу более развёрнутую информацию...

Когда пользователь создаёт в графическом интерфейса менеджера подшивок новое пользовательское свойство уровня подшивки или листа, то оно добавляется в набор пользовательских свойств объекта 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 вовсе не предусмотрена возможность создавать поля ни для произвольных пользовательских свойств подшивки, ни для групп листов в частности (самый хреновый варинат).

Андрей Бушман:
А по этой теме какие-то движения есть? Честно говоря, из всех вопросов, связанных с подшивками, этот для меня наиболее важен, т.к. иметь возможность создать навороченную структуру подшивок, но не иметь возможность привязываться к этой информации посредством полей - это "рубит на корню" все плюсы, предоставляемые программным интерфейсом подшивок.

Навигация

[0] Главная страница сообщений

Перейти к полной версии