C#: Атрибуты документа для чертежа.cdw

Автор DarkCourt, 24.04.18, 09:34:27

« назад - далее »

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

DarkCourt

Здравствуйте.
Компас v14, среда VS 2013, язык C#.
Необходимо написать dll, читающую атрибуты документа (поиск определённого значения). Подразумевается использование в связке с 1С через COM. Возможные расширения файлов: a3d, m3d, cdw.
Столкнулся с проблемой: никак не удаётся получить данные атрибутов из cdw. Искомый атрибут - табличный. Для первых двух использовал интерфейс IKompasDocument1 (Attributes, IAttribute и т.д.), но для cdw не удаётся его получить (видимо, из-за того, что это чертёж). Через KompasObject.GetAttributeObject(), итераторы и GetAttrRow/GetAttrValue не выходит; информация в SDK.chm недостаточна (есть только примеры по чтению атрибута через координаты курсора, что неприменимо в данном случае). Возможно, что и устарела.
Если кто решал похожую задачу и/или модет подсказать решение - помогите, пожалуйста.


DarkCourt

#2
Цитата: Sabahs от 24.04.18, 10:04:55
А для cdw, разве нет интерфейса IKompasDocument1?
Получается, что нет. Опишу действия:
Документ, интерфейс и атрибут из него я получаю так (file - путь к файлу, атрибут в нём один):

var type = Type.GetTypeFromProgID("KOMPAS.Application.5");
KompasObject app = (KompasObject)Activator.CreateInstance(type);
IKompasAPIObject realApp = (IKompasAPIObject)app.ksGetApplication7();
var doc = realApp.Application.Documents.Open(file, false);
IKompasDocument1 inter = doc as IKompasDocument1;
var attrs = inter.Attributes[0, 0, 0, 0, 0, null];
string res = (attrs as IAttribute).Value[0,0].
.
Если документ cdw, то attrs выходит null вместо COMObject. По факту в этом случае в переменной inter нет свойства Attributes как такового. В случае 3Д моделей - есть. Почему - неизвестно, в хелпе информации нет (не нашёл).
Update: свойства и методы у inter в этом случае такие же, как и у doc (IKompasDocument), то есть по факту интерфейс IKompasDocument1 в случае cdw-документа получить не удаётся.

Всё там есть, это базовый интерфейс.

DarkCourt

Цитата: Sabahs от 24.04.18, 11:06:34
Всё там есть, это базовый интерфейс.
По факту свойства и методы полученного объекта не соответствуют IKompasDocument1. В том числе если добавлять сам документ через  realApp.Application.Documents.AddWithDefaultSettings(DocumentTypeEnum.ksDocumentDrawing, true);. Скрин приложил. При попытке запроса атрибута через Attributes, как уже писал, компилятор не ругается но результат - null.

+ Благодарностей: 1

DarkCourt

У меня подобное только для a3d и m3d документов. При cdw(2D) документе картина как на моём последнем скрине. В этом и проблема. Может, необходимо какие-то специфичные настройки задавать перед открытием документа? Весь код ,предшествующий открытию документа, я написал (кроме задания пути к файлу).
Альтернативные пути получения атрибутов (через GetAttributeObject()) я пробовал, но безрезультатно.

DarkCourt

Благодарю за помощь. Разобрался, в чём дело.
Оказывается, последний мой скрин не свидетельство какой-то ошибки, точно такая же ситуация наблюдается и при работе с 3Д моделями.
Моя ошибка была в том, что атрибуты я получал так:
var attrs = inter.Attributes[0, 0, 0, 0, 0, null];
а надо было так: var attrs = inter.Attributes[0, 0, 0, 0, 0, doc];.
С 3Д моделями первый вариант работал, а с чертежом - нет.