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

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

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

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

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

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

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

Смена оформления чертежа

Автор mkrz, 21.09.16, 12:51:38

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

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

mkrz

Простая казалось бы задача - сменить оформление чертежа. Почему-то при открытии в Компас v16 х64 чертежей из старых версий Компас теряется оформление чертежа. Или по-простому - нет рамки со штампом. Решается легко: Сервис-Параметры-Параметры первого лист-Оформление-Название-Чертеж констр. Первый лист. (номер 1).
Хотел автоматизировать сей процесс. Чтобы нажал кнопочку и оформление автоматически установилось на №1.
Вот текст библиотеки. Не могу понять, почему не меняется оформление. Может кто подскажет?

procedure LIBRARYENTRY( command: WORD ); pascal;
const
SHEET_OPTIONS_EX=4;
var
  docPar  : ksDocumentParam;
  docPar1 : ksDocumentParam;
  shPar   : ksSheetPar;
begin
  kompas := KompasObject( CreateKompasObject );
  doc := ksDocument2D( kompas.ActiveDocument2D );
  if ( doc <> nil ) then
  begin
    kompas.ksMessage('doc ok!!!');
    docPar  := ksDocumentParam( kompas.GetParamStruct(ko_DocumentParam) );
     docPar1 := ksDocumentParam( kompas.GetParamStruct(ko_DocumentParam) );
     if ( (docPar <> nil) And (docPar1 <> nil) ) then
    begin
        shPar:= ksSheetPar( docPar.GetLayoutParam() );
        if ( shPar <> nil ) then
      begin
        kompas.ksMessage('sheet ok!!!');
        shPar.shtType:=1;
        doc.ksSetDocOptions(SHEET_OPTIONS_EX, shPar);
      end;
    end;
  end;
end;
end.

Вы получили параметры старого чертежа, где shPar.shtType по идеи и так равно 1, shPar.layoutName - тут вопрос, если там полный путь к файлу оформления, то он ведёт к старому расположению, которого нет, тогда Вы этим кодом нечего не меняете.
PS. Это мои догадки, просто проверять времени нет.

mkrz

Спасибо за ответ, Sabahs.
По поводу старого чертежа не совсем понял. Я специально создал чертеж с оформлением "Титульный лист" (42). По идее shPar.shtType должно быть равно 42.
По поводу shPar.layoutName - попробую задать принудительно. Мне казалось, что по умолчанию он должен сам указывать на существующий файл оформления. Но за идею спасибо. Буду ковырять. Если еще есть какие мысли - буду рад

mkrz

Попробовал считать текущие данные по оформлению:

        doc.ksGetDocOptions(SHEET_OPTIONS_EX, shPar);
        kompas.ksMessage('layoutName='+shPar.layoutName);
        kompas.ksMessage('shtType='+inttostr(shPar.shtType));

так вот получилось:

layoutName=пусто
           shtType=0

Думаю у меня что-то с shPar не в порядке. Хотя проверку shPar<>nil проходит.
Не пойму

Остаётся проверить sheetType, если не поможет, поменять на API7.
+ Благодарностей: 1

mkrz

Не могу добраться до sheetType.
При попытке получить параметры стандартного листа:
stPar:= ksStandartSheet( shPar.GetSheetParam() );
компас закрывается с ошибкой и все.

mkrz

Нет, извиняюсь. Ошибка вылетает после получения интерфейса стандартного листа при обращении к любому параметру. Например:
stPar.format или stPar.multiple

Пример кода:

        stPar := ksStandartSheet( shPar.GetSheetParam );
        Doc.ksGetDocOptions(SHEET_OPTIONS_EX, stPar);
        kompas.ksMessage('format='+inttostr(stPar.format));


mkrz

Скопировал пример из http://forum.ascon.ru/index.php/topic,23070.msg161957.html#msg161957
вот что получилось:

//------------------------------------------------------------------------------
// LibraryEntry
//---
procedure LIBRARYENTRY( command: WORD ); pascal;
var
  iKompas: KompasObject;
  iDocument2D: ksDocument2D;
  iDocumentParam: ksDocumentParam;
  iSheetPar: ksSheetPar;
  iStandartSheet: ksStandartSheet;

begin
  iDocumentParam := ksDocumentParam(iKompas.GetParamStruct(ko_DocumentParam));
  iDocument2D.ksGetObjParam(iDocument2D.reference, iDocumentParam, ALLPARAM);
  iSheetPar := ksSheetPar(iDocumentParam.GetLayoutParam());
  if (iSheetPar <> nil) then
  begin
    iStandartSheet := ksStandartSheet(iSheetPar.GetSheetParam);
    if (iStandartSheet <> nil) then
    begin
      iDocument2D.ksGetDocOptions(SHEET_OPTIONS_EX, iStandartSheet);
      kompas.ksMessage(inttostr(iStandartSheet.format));
    end;
end;

Компас закрывается с ошибкой при выполнении       iDocument2D.ksGetDocOptions(SHEET_OPTIONS_EX, iStandartSheet);

KrissKross

Предлагаю
1. Использоавть API7 - как предлагает уважаемый Sabahs
2. Прочитать ILayoutSheet::LayoutStyleNumber - Номер стиля оформления.
3. Прочитать ILayoutSheet::LayoutLibraryFileName - Имя файла библиотеки стилей оформления.
и если LayoutLibraryFileName == нулю или указывает на старый путь
4. Поменять
4.1. Присвоить новое значение LayoutLibraryFileName
4.2. Продублировать значение LayoutStyleNumber
4.3. и вызвать метод Update.

ЦитироватьПримечание: из SDK.chm

Данное свойство позволяет получить\изменить номер используемого стиля в библиотеке стилей оформлений
(см. LayoutLibraryFileName). После изменения значений свойств формата листа оформления,
для того чтобы изменения вступили в силу, надо вызвать метод Update.

ksSheetPar - перед использованием структуры её получать не надо?
PS. iKompas.GetParamStruct

mkrz

Добрый день, KrissKross.
Я слабо разбираюсь в программировании. С большим трудом настроил Delphi для работы с Компас через API5, много нестыковок того что написано и того что получается. Ну там хоть было описано в файле "Компиляция библиотек под K16".
Если не трудно - напишите как настроить Delphi для работы через API7.

mkrz

Цитата: Sabahs от 22.09.16, 12:04:25
ksSheetPar - перед использованием структуры её получать не надо?
PS. iKompas.GetParamStruct
так в первой строчке после begin и есть получение GetParamStruct. Или я ошибаюсь

Ошибаетесь, Вы в первой строке получили структуру ksDocumentParam, а где Вы получили  iSheetPar?
iSheetPar:=ksSheetPar(iKompas.GetParamStruct(ko_SheetPar));

mkrz

Всем спасибо за ответы. Видимо не судьба мне решить эту "простенькую" задачку. Не обижайтесь, но чтобы заниматься программами для Компас нужно быть очень продвинутым. Так все запутано. Насколько проще все делать в Автокад.
Решаю вопрос по-старому - через меню. Глупо, но работает.
Еще раз всем спасибо


mkrz

Цитата: Sabahs от 22.09.16, 12:35:17
Для новичков, то, что надо http://forum.ascon.ru/index.php/topic,15837.msg180004.html#msg180004 .
Именно оттуда я и брал пример.
Если найдется человек с хорошими знаниями и большим терпением - я бы хотел детально рассмотреть пример из этой книги. Прямо по каждой команде с комментариями, что делается и для чего.
Sabahs, Вам можно задать эти вопросы?

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

mkrz

Возвращаюсь к примеру из указанной книги:

после каждой строчки буду писать комментарии или задавать вопросы. если кто может вразумительно ответить - буду благодарен.

procedure LIBRARYENTRY( command: WORD ); pascal;
const
SHEET_OPTIONS_EX=4;
var
  docPar  : ksDocumentParam;
  docPar1 : ksDocumentParam;
  shPar   : ksSheetPar;
begin
  kompas := KompasObject( CreateKompasObject );  // здесь мы создаем объект Компас. вроде все понятно.
  doc := ksDocument2D( kompas.ActiveDocument2D );  // здесь получаем указатель на активный документ
  if ( doc <> nil ) then
  begin
    kompas.ksMessage('doc ok!!!');
    docPar  := ksDocumentParam( kompas.GetParamStruct(ko_DocumentParam) ); // здесь мы получаем интерфейс текущего документа.
     docPar1 := ksDocumentParam( kompas.GetParamStruct(ko_DocumentParam) ); // для чего его получать второй раз не пойму?
     if ( (docPar <> nil) And (docPar1 <> nil) ) then
    begin
        shPar:= ksSheetPar( docPar.GetLayoutParam() );  // здесь получаем интерфейс текущего листа. не уверен, поправьте
        if ( shPar <> nil ) then
      begin
        kompas.ksMessage('sheet ok!!!');
        shPar.shtType:=1; // устанавливаем номер оформления 1
        doc.ksSetDocOptions(SHEET_OPTIONS_EX, shPar);  // устанавливаем новое значение в параметрах листа. здесь все верно?
      end;
    end;
  end;
end;
end.

По моей логике оформление листа должно смениться. Если только еще нет дополнительной команды инициализации типа Init()

Вы лучше прикрепите в архиве проект.