Размеры растрового объекта

Автор demosfenus, 16.08.12, 11:29:22

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

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

demosfenus

Доброго времени суток!

Поставили мне задачу написать библиотеку для Компаса, которая будет вставлять сканированные подписи конструкторов в основную надпись. До этого я не сталкивался с написанием библиотек Компаса (использую Delphi XE).

Как вставить рисунок в чертеж разобрался. Но:

1. Нигде не нашел как получить его размеры. Дело в том, что подписи хранятся в разных форматах с разными разрешениями. И было бы здорово вычислить размер (в миллиметрах) вставленной подписи и исходя из него вычислить scale. Чтобы подпись "вписывалась" в штамп. Кто-нибудь знает как получить геометрические размеры растрового объекта?

2. Чтобы определить координаты xBase и yBase для вставки подписи, необходимо знать формат листа. Вроде бы в SDK есть пример step3, но у меня компас вместо выдачи сообщения вылетает при выполнении этого кода. Пробовал на нескольких компьютерах с компасами 13SP1 и 13SP2. Картина одинаковая. Может кто подскажет как получить параметры листа?

Без куска кода места, где вылетает помочь тяжело.
ILayoutSheet - Интерфейс параметров листа оформления.


snegok74

ЦитироватьЧтобы определить координаты xBase и yBase для вставки подписи, необходимо знать формат листа.
Если нужно получить параметры штампа для вставки в него подписи то вот кусок кода который это может..

procedure TForm1.FormActivate(Sender: TObject);
var  doc:     ksDocument2D;
     docPar:  ksDocumentParam;
     shPar:   ksSheetPar;
     stPar:   ksStandartSheet;
begin
  // обнуляем индикатор стандартного листа
  CurrentStandartSheet:=False;
  if (ks <> nil) then begin
    // указатель на документ
    doc := ksDocument2D( ks.ActiveDocument2D );
    // если документ открытый
    if ( doc <> nil ) then begin
      //
      docPar:=ksDocumentParam(ks.GetParamStruct(ko_DocumentParam));
      if (docPar <> nil) then begin
        //
        doc.ksGetObjParam(doc.reference, docPar, ALLPARAM);
        shPar:= ksSheetPar(docPar.GetLayoutParam());
        if ( shPar <> nil ) then begin
          //
          stPar := ksStandartSheet( shPar.GetSheetParam());
          // если стандартное оформление листа
          if ( stPar <> nil ) then begin
            //
            CurrentStandartSheet:=True; //
            CurrentSheetFormat:=stPar.format; // вернет 3 - если формат  А3, 4 = если А4
            CurrentSheetDirect:= stPar.direct;  // указывает вертикально лист или горизонтально
            GetSheetFormat;
          end; // if ( stPar <> nil ) then begin
        end; // if ( shPar <> nil ) then begin
      end; // if (docPar <> nil) then begin
    end; //if ( doc <> nil ) then begin
  end; // if (ks <> nil) then begin
  Button2.Enabled := CurrentStandartSheet;
  doc    := nil;
  docPar := nil;
  shPar  := nil;
  stPar  := nil;
end;


и прилагаю исходник откуда этот кусок кода

И по растровому объекту... Может имеет смысл получать размер файла в пикселях и из этого как то выяснять размеры?

demosfenus

Спасибо, все работает!
В SDK Компаса в примере step3 пропущена строка
Цитата: snegok74 от 16.08.12, 12:02:35
docPar:=ksDocumentParam(ks.GetParamStruct(ko_DocumentParam));
С ней все работает.
Цитата: snegok74 от 16.08.12, 12:02:35
И по растровому объекту... Может имеет смысл получать размер файла в пикселях и из этого как то выяснять размеры?
Возможно так и придется делать. Просто тогда нужно все подписи в одном формате. Чтобы не городить огород с определением типа файла и вычислением разрешения... А хотелось сделать универсально, чтобы любой секретарь или архивариус мог пополнять базу образцов подписей не особо заморачиваясь с форматом.

Посмотрите интерфейс IRaster:
DisplayModePartial - Режим отрисовки.
FileName - Имя файла растрового объекта.
Height - Высота вставки.
InsertionType - Способ вставки растрового объекта.
IsCutBoundarySet - Признак задания границы.
IsEnableChangeResolution - Доступность изменения разрешения.
Palette - Цветовая палитра (Количество разрядов).
Resolution - Разрешение растра.
Scale - Масштаб.
SourceHeight - Высота источника.
SourceWidth - Ширина источника.
Width - Ширина вставки.

demosfenus

Пока я пытаюсь разобраться с api7 и iRaster может кто-нибудь подскажет что не так в этом коде:
// получить содержимое ячейки основной надписи по ее номеру
Function cmGetTextFromStamp(ColID: integer): String;
var
  iStamp: ksStamp;
  iTextItemParam: ksTextItemParam;
  iTextLineParam: ksTextLineParam;
  iTextItemDynamicArray: ksDynamicArray;
  iTextLineDynamicArray: ksDynamicArray;
begin
  iStamp := ksStamp(iDocument2D.GetStamp);
  if iStamp = nil then
    Exit
  else
  begin
    if iStamp.ksOpenStamp <> 0 then
    begin
      iStamp.ksColumnNumber(ColID);
      iTextItemParam := ksTextItemParam
        (iKompas.GetParamStruct(ko_TextItemParam));
      iTextItemParam.Init;
      iTextLineParam := ksTextLineParam
        (iKompas.GetParamStruct(ko_TextLineParam));
      iTextLineDynamicArray :=
        ksDynamicArray(iStamp.ksGetStampColumnText(ColID));
      iTextLineDynamicArray.ksGetArrayItem(0, iTextLineParam);
      iTextItemDynamicArray := ksDynamicArray(iTextLineParam.GetTextItemArr());
      iTextItemDynamicArray.ksGetArrayItem(0, iTextItemParam);
      iStamp.ksCloseStamp;
      Result := iTextItemParam.s; // возвращаем содержимое ячейки
      iTextItemDynamicArray := nil;
      iTextLineDynamicArray := nil;
      iTextLineParam := nil;
      iTextItemParam := nil;
      iStamp := nil;
    end
    else
      Result := EmptyStr;
  end;
end;


Когда фамилия в ячейке есть, все работает правильно... А когда ячейка пустая, выдает ошибку: "Сообщение библиотеки: Неверный индекс массива".

demosfenus

Цитата: Sabahs от 16.08.12, 16:15:18
Посмотрите интерфейс IRaster:
Никак не могу достучаться до iRaster:
procedure cmInsertSign(Developer: string);
var
  pViews: IViews;
  pView: IView;
  pDrawingContainer: IDrawingContainer;
  pRasters: IRasters;
  pRaster: IRaster;
  FilePath: String;
begin
  FilePath := 'sign.jpg';
  pViews := GetViews();
  if (pViews <> nil) then
  begin
    pView := pViews.ActiveView;
    // получаем указатель на контейнер графических объектов
    pDrawingContainer := pView As IDrawingContainer;
    if (pDrawingContainer <> nil) then
    begin
      // получаем указатель на коллекцию растровых объектов
      pRasters := pDrawingContainer.Rasters;
      if pRasters <> nil then
      begin
        // получаем указатель на растровый объект
        pRaster := pRasters.Add;
        if pRaster <> nil then
        begin
          // меняем свойства растрового объекта
          pRaster.FileName := FilePath;
          pRaster.Width := 15;
          pRaster.SetPlacement(105, 150, 0, False);
          pRaster.InsertionType := True;
          // вызываем метод update для растрового объекта
          pRaster.Update;
        end;
      end;
    end;
  end;
end;


При выполнении этого кода не происходит ничего. Ни добавления картинки. Ни ошибок. Ничего. :(

Я понимаю, что высота рисунка pRaster.Height равна нулю и путь FilePath := 'sign.jpg'; должен быть полный.


demosfenus

добавил
pRaster.Height := 5;
и путь к файлуC:\sign.jpg
Так же пробовал играть с разрешением, масштабом и т.п.: результат нулевой... :(


demosfenus

Ничего не показывает. :(
Не получается настроить никак. Посмотрел ваши видео об отладчике, но толку мало. Ошибок нет, но и на breakpoint'ы реакции ноль.

Вы, если внимательно смотрели, то должны были выполнить следующее условие:
При смене любой из опций, необходимо сделать полный Build проекту (а не просто Compile).