• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Проблема при вызове интерфейса ILayoutSheets

Автор KrissKross, 27.09.12, 19:16:38

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

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

KrissKross

Добрый день, Всем!

При вызове ILayoutSheets для Спецификации

IKompasDocument _kompasDocument = documents.Open(file.FullPath, false, true);
ISpecificationDocument _specification = (ISpecificationDocument)_kompasDocument;
LayoutSheets _layoutSheets = _specification.LayoutSheets;

LayoutSheets == null
тоже и для текстовых документов (ITextDocument)
а для чертежей (IKompasDocument) все нормально

В чем может быть причина
или посоветуйте другой способ получения коллекции листов

С наилучшими!

chelkar

Причина.
LayoutSheets работает только для:
цитата из справки "1. Свойство используется только для документа "Чертеж"."

Коллекции листов спецификациии текстового документа не существует. Получать нечего.
Чтобы ответить на второй вопрос, надо понимать какую инфу хотите получить?


KrissKross

Все просто
хочу добраться до ISheetFormat - Формат листа и Кратность
всех 2д документов (чертежей, спецификаций и текстовых)

Так как SheetFormat получаем от ILayoutSheet::Format

chelkar


Придется через API5 получать ksDocument2D::ksGetObjParam

Структура параметров формата листа KompasObject::GetParamStruct (ko_StandartSheet)

KrissKross

Спасибо за ответ

эх не нравиться мне этот API5
для получения простых вещей приходиться городить кучу кода

тогда еще уточняющий вопрос
GetParamStruct (ko_StandartSheet) - данные об одном листе
а как быть в случае многолистового и разных форматов
ksDocument2D::ksGetDocumentPagesCount - Узнаем количество листов документа.
а как пробежаться по всем листам
я так понимаю итератором (дурацким - плохо понимаемый мной)
по какому параметру

С уважением!

chelkar

Цитата: KrissKross от 28.09.12, 12:54:07
GetParamStruct (ko_StandartSheet) - данные об одном листе
а как быть в случае многолистового и разных форматов
ksDocument2D::ksGetDocumentPagesCount - Узнаем количество листов документа.
а как пробежаться по всем листам
Я так понимаю форматки считаете ...
У спецификации и текстового документа нет разноформатности листов.
Получаете формат листа, количество листов и можно просто умножить.
А для чертежа оставьте тот код которые уже есть, через LayoutSheets.

KrissKross

Ну скажем так не совсем правда Ваша
В спецификации и текстовом документе - есть менеджер документов
в котором можно настраивать - дополнительные листы как в начале документа так и в конце
В дальнейшем ИМХО будет развиваться функционал
и появиться возможность настраивать каждый лист
- хотя наверное будет использоваться мало - но для особо хитрых документов пригодиться

chelkar

Цитата: KrissKross от 01.10.12, 09:52:05
Ну скажем так не совсем правда Ваша
В спецификации и текстовом документе - есть менеджер документов
в котором можно настраивать - дополнительные листы как в начале документа так и в конце
Да, можно. Но они того же формата что и основные листы. Суть решения не меняется.

Цитата: KrissKross от 01.10.12, 09:52:05
В дальнейшем ИМХО будет развиваться функционал
и появиться возможность настраивать каждый лист
- хотя наверное будет использоваться мало - но для особо хитрых документов пригодиться
Наверное так и будет. И тогда, видимо, поменяются интерфейсы в API. Вы хотите заранее угадать как они поменяются :)

KrissKross

ЦитироватьНаверное так и будет. И тогда, видимо, поменяются интерфейсы в API. Вы хотите заранее угадать как они поменяются :)
Разговор не об этом. Возвращаясь к первому посту, чтобы было бы логично уже сейчас применять LayoutSheets

Повторю вопрос
как итератором пройти по каждому листу

С наилучшими!

Можете попробовать так, на работоспособность не проверял, набросал примерно, как должно быть, код на Delphi.
На картинке показано всё, что можно с помощью итератора получить, т.ч. выбор не сильно большой.

DocumentParamIter:=ksIterator(Kompas.GetIterator);
DocumentParamIter.ksCreateIterator(SPC_DOCUMENT_OBJ,ALLPARAM);
DocPar:=ksDocumentParam(Kompas.GetParamStruct(ko_DocumentParam));
Obj:=DocumentParamIter.ksMoveIterator('F');
while Obj<>0 do
begin
   DocPar.Init;
   if(Doc.ksGetObjParam(Obj,DocPar,ALLPARAM))<>0 then
    begin
      SheetPar:=ksSheetPar(DocPar.GetLayoutParam);
      ...
    end;
   Obj:=DocumentParamIter.ksMoveIterator('N');
end;
DocumentParamIter.ksDeleteIterator;

KrissKross

Благодарю всех за участие
Но пока результата нет

Пройдемся по шагам
При выполнении
Obj:=DocumentParamIter.ksMoveIterator('F');
Obj == ДокументСпецификация.reference - что наверное логично, т.е. ссылаемся на текущую спецификацию

Doc.ksGetObjParam(Obj,DocPar,ALLPARAM)
== 130 что соответствует SPC_DOCUMENT_OBJ из перечесления DrawingObjectTypeEnum
от которого по идеи идет интерфейс ksDocumentParam

SheetPar := ksSheetPar(DocPar.GetLayoutParam);
да здесь все идет - получаем параметры
и дальше инициируются ksStandartSheet (для стандартного листа) или ksSheetSize (для нестандартного листа)
вот только результаты непонятно какие
для теста создал спецификацию стандартную - 2 листа, но добавил
дополнительные листа в начале документа чертеж кострукторский формата А3
и все равно получаем Format=4 и MultiPly =1

Obj:=DocumentParamIter.ksMoveIterator('N');
а вот здесь облом
Obj == 0

Цитироватьа вот здесь облом
Obj == 0
Получается, что итератор видит только сам документ, а листы нет. Можно попробовать переделать итератор DocumentParamIter.ksCreateIterator(DOCUMENT_SIZE,ALLPARAM) и получить ksSheetSize,
пройтись по листам, можете узнать их размеры, по размерам формат и положение, если тоже облома не будет. 

chelkar

Я думаю что ничего не выйдет.
Не будет итератор ходить по листам. Не умеет он этого делать.

KrissKross


chelkar

Оставить для чертежей получения форматок через LayoutSheets.
А для спецификации и текстового документа ksStandartSheet  или ksSheetSize  умножать на количество листов.

KrissKross

такого быть не может!!!
потому что быть не может!!!

KrissKross

Появились новые вопросы

1. Как раньше узнавали форматы листа - до API7
к примеру для чертежа

2. Попробовал
ksSpcDocument::GetStampEx(long sheetNumb);
где sheetNumb - номер листа начиная с 1.

затем
ksStamp::ksGetStampColumnText(numb)
где numb = 32 - номер ячейки с форматом

Так вот ведь и здесь
не могу получить значение

chelkar

Цитата: KrissKross от 08.10.12, 10:44:06
1. Как раньше узнавали форматы листа - до API7
к примеру для чертежа
Не было такой задачи раньше  :)
Многолистовой чертеж появился в версии V8. Одновременно появился интерфейс ILayoutSheets.

KrissKross