Как правильно получить габариты всего чертежа

Автор DonVik, 07.07.09, 13:25:34

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

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

DonVik

Значит пытаюсь сделать некий менеджер печати

Нужно чтоб программа сама выбирала принтер, формат бумаги, положение, масштаб в зависимости от начерченного (если точнее от формата штампа в документе)

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

пытался получить это так:

function TKompas.Format: string;
var n,partype:Longint;  sh:ksStandartSheet;
begin           {$o-}
sh:=ksStandartSheet(KompasObjectA.GetParamStruct(ko_StandartSheet));
KompasActiveDocument.ksGetObjParam(KompasActiveDocument.reference,sh,ALLPARAM);
  FormatActiveDoc:=sh.format;
  MultiplyActiveDoc:=sh.multiply;
  result:=IntTostr(FormatActiveDoc)+'x'+IntTostr(MultiplyActiveDoc);
end;


Но выдает 0. Проверял даже впихнув этот код в RTW, но все равно Компас 0 показывает.

Как правильно получить габариты начерченного?

Bordes

Возможно, размер всего документа можно получить вот так:
получить указатель на документ через ksGetCurrentDocument,
а потом получить габарит документа через GetObjGabaritRect, передав туда указатель на документ.

prog1

Если открываете чертеж, можно воспользоваться выделением ВСЕГО (Select -2) в "группу выделения" и далее также Doc.ksGetObjGabaritRect(grGeneralV,Gabarit);
А из штампа считать: масштаб, размер, ориентацию? - Вот про штамп много на форуме было написано.
Удачи!

Maxagg

после
sh:=ksStandartSheet(KompasObjectA.GetParamStruct(ko_StandartSheet));
нужно
sh.init;
и будет тебе габарит :-)))

DonVik

Цитата: prog1 от 07.07.09, 18:45:01
Если открываете чертеж, можно воспользоваться выделением ВСЕГО (Select -2) в "группу выделения" и далее также Doc.ksGetObjGabaritRect(grGeneralV,Gabarit);
А из штампа считать: масштаб, размер, ориентацию? - Вот про штамп много на форуме было написано.
Удачи!
Сенькс, если не сложно примерчик по поводу выделения.

Что касается штампа, так то оно так, но дело в том что  сам штамп немного больше чем стандартные форматы. Я где-то читал про это, поэтому мы всегда при печати делаем подгонку под размер страницы, там масштаб получается ни 1 а 0,9986 или 0,9957 в зависимости от формата, а еще бывают чертежи с допиской - это рамка, слева от штампа, как заметка сантиметров 20 примерно, там примечания пишут наши.
А так формат из штампа я получаю без проблем

ЦитироватьМаксимилиан
Ы-ы-ы. Не смешно. в хелпе написано: "Метод обнуляет все параметры размеров листа."
Я пробовал и так (ради прикола) все равно нули...





Maxagg

Я не с пустых слов пишу ответы
var
doc2d:ksdocument2d;
sh:ksStandartSheet;
begin
  StartKompas('asdf'); //моя процедурка для запуска компаса
  doc2d:=ksdocument2d(kompas.ActiveDocument2D);
   sh:=ksStandartSheet(Kompas.GetParamStruct(ko_StandartSheet)); //создаем объект
  sh.Init; //производим его инициализацию и обнуляем параметры
  doc2d.ksGetObjParam(doc2d.reference,sh,ALLPARAM); //Заполняем параметры данными
  form1.Caption:=IntTostr(sh.format)+'x'+IntTostr(sh.multiply);

нАдеюсь ты опередяешь размеры не фрагмента, а с cdw
если фрагмент тогда Doc.ksGetObjGabaritRect(grGeneralV,Gabarit);

DonVik

Цитата: Максимилиан от 08.07.09, 13:52:47
Я не с пустых слов пишу ответы
Ок. Я не против. Вот так как ты показал сработало, но вот так:

function TKompas.SizeDoc: TSizeDoc;
var n,partype:Longint;  sh:ksStandartSheet;sz:ksSheetSize;
begin       
   {$o-}
sh:=ksStandartSheet(KompasObjectA.GetParamStruct(ko_StandartSheet));
sh.Init;
KompasActiveDocument.ksGetObjParam(KompasActiveDocument.reference,sh,ALLPARAM);

sz:=ksSheetSize(KompasObjectA.GetParamStruct(ko_SheetSize));
sz.Init;
KompasActiveDocument.ksGetObjParam(KompasActiveDocument.reference,sz,ALLPARAM);

// Вот тут нули
result.Width:=sz.width;
result.Height:=sz.height;

// а так нормально
result.Width:=sh.format;
result.Height:=sh.multiply;

sh:=nil;
end;

В чем я ошибаюсь?

prog1

Извините, что встреваю... А я всё о "свинье" думаю...
-------------------------------------------
Прочтите в СДКе про команду ksSelectGroup. Она простая-разберётесь легко.
А также у Богуславского есть пример про габариты.
У меня селектирование заносится в именованную группу (выдрала куски из программы спец. для Вас), но можно указатель на группу поставить=0 - тоже работает. В Point-ах Вы получите левую нижнюю и правую верхнюю координаты реальные (не по листу).

Gabarit       :ksRectParam;
PointV,PointV1:ksMathPointParam;
---------------
            Gabarit:=ksRectParam(Kompas.GetParamStruct(ko_RectParam));
GrGeneralV:=Doc.ksNewGroup(0);
Doc.ksSelectGroup(grGeneralV,2,-1000,-1000,-1001,-1001);
Doc.ksEndGroup;
        Doc.ksGetObjGabaritRect(grGeneralV,Gabarit);
        PointV:=ksMathPointParam(Gabarit.GetpTop);
        PointV1:=ksMathPointParam(Gabarit.GetpBot);
---------------
PS. Но всё же из штампа тоже можно: считали с него параметры, и, расписали варианты уменьшения-увеличения в зависимости от форматов и их ориентации. Ну, если Ваши пишут дописки, то может не стОит гадать, есть она или нет.
И ещё: как это компасовский штамп больше стандартного??? Это может, при печати Вы должны учитывать технологические припуски плоттера и, указав 1:1, бумагу для А1 указывать не 841х594, а, в зависимости от модели, например, 860х610. (Откровенно говоря, наши тоже печатают 0,997).

DonVik

Цитата: prog1 от 08.07.09, 14:25:43
Извините, что встреваю... А я всё о "свинье" думаю...
Ых!!! Ну что за невезуха...
За идею огромное спасибо. но я углядел в ней (методом наступани на грабли) некий фактор, из-за которого мне этот вариант не подходит...

Вот даже интересно что твой код выдаст если ты создашь чертеж со штампом скажем формата А4 и создашь в нем просто точку?
У меня код выдает 1,2 и 1,2 как размер.
Т.е. он не считает штамп начерченным. Не учитывает его.
Я конечно посмотрю хелп но мне никак не понятно почему ksSheetSize мне нули выдает...

prog1

1. можно использовать совместно размеры чертежа и Select. Кто больше (или по координатам смотреть) столько и печатать. Задача решаема ТАКИМ образом.
2. Вы для чего к ksSheetSize привязались? Выдаёт нули, вероятнее всего, что лист задан стандартный.
Ваша сторка: KompasActiveDocument.ksGetObjParam(KompasActiveDocument.reference,sz,ALLPARAM); вообще не рабочая - вернет 0. Вобщем:надо начинать Вам с параметров документа - если
docPar.type_    := lt_DocSheetUser;
sz  := ksSheetSize( shPar.GetSheetParam());
         Sz.width:=100;
         Sz.height:=1000; (к примеру)
то и счтывайте нестандартлный лист
sz:=ksSheetSize( shPar.GetSheetParam());
Kompas.ksMessage(Floattostr(sz.width)+' '+Floattostr(sz.height)); 
отлично работает
но если лист задан как стандартны, то уж... дальше Вы умеете (с sh у Вас)
Не путайтесь - почитайте ksSheetPar::GetSheetParam в СДКе - это успокаивает.
Но! Если что то вылазит за пределы заданного пользователем размера, то Вы его не увидите на плоттере. И скорее всего, Ваши пользуются всё же стандартными листами!?
Удачи!



Maxagg

procedure TForm1.Button1Click(Sender: TObject);
const format:array[0..4,1..2]of double=
((840,1186),(594,840),(420,594),(297,420),(210,297));
var
  fn:string;
  i:integer;
  n,partype:Longint;
  so:ksSheetoptions;
  sh:ksStandartSheet;
  sz:kssheetsize;
  C_width,C_height:double;
  dw,dh,du:double;
  kompas:KompasObject;
  doc2d:ksDocument2D;
begin
  try
//Ищем объект компаса
    kompas:=KompasObject(GetActiveOleObject('Kompas.Application.5'));
  except
    close;
  end;
//Компас не виден
  kompas.Visible:=true;
//Активируем АПИ функции компаса
  kompas.ActivateControllerAPI;
  doc2d:=ksdocument2d(kompas.ActiveDocument2D);
  so:=ksSheetoptions(kompas.GetParamStruct(ko_sheetoptions));
  doc2d.ksGetDocOptions(4,so);
  form1.Caption:=vartostr(so.sheetType);
  if so.sheetType=true then
  begin
    sz:=ksSheetsize(so.GetSheetParam(true));
    c_width:=sz.width;
    c_height:=sz.height;
  end; //}
  if so.sheetType=false then
  begin
    sh:=ksStandartSheet(so.GetSheetParam(false));
    dw:=format[sh.format,1]*sh.multiply;
    dh:=format[sh.format,2];
    if dw>dh then
    begin
      du:=dh;
      dh:=dw;
      dw:=du;
    end;
    if sh.direct=true then
    begin
      du:=dh;
      dh:=dw;
      dw:=du;
    end;
    c_width:=dw;
    c_height:=dh;
  end; //}
  form1.Caption:=floatTostr(c_width)+'x'+floatTostr(c_height);
end;

у меня стоит девятый компас, в более ранних версиях, может выдать неверный результат

DonVik

Ребята, спасибо, но появилась еще одна альтернативная идея.
Попробую реализовать ее, если не удастся вернусь к вашим примерам ;)