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

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

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

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

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

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

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

Библиотека для вставки подписей в штамп

Автор Дмитрий22, 12.11.12, 18:00:52

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

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

Дмитрий22

Добрый вечер!
Выкладываю свою первую программу Signature (подпись по нашему), написанную по заданию главного конструктора. Библиотека вставляет растровые подписи в штамп. Работает следующим образом: по фамилии в штампе ищет в папке С:\Подписи нужный фрагмент с образцом подписи и вставляет его в штамп. Заодно вставляет и дату. Образцы подписей обязательно должны находиться в папке С:\Подписи и быть монохромные, иначе эффекта "прозрачности" не получается(спасибо demosfenus, подсказал). В остальном, все выглядит довольно реалистично. Кому нужно, приложенный архив распаковываем в C:\Подписи. Прилагаю Чертеж3.cdw для тестирования. Просьба не пользоваться слоями с 110 по 115. Программа использует их под свои нужды. Удачи!

Результат работы библиотеки.
Windows 7x64

Дмитрий22

Под win 7/64 тестировал, все нормально работает, единственное Компас 12 был 32 разрядный. Странно, что напротив Иванова подпись не встала. В папке С:\Подписи Иванова Sabahs не удалял? То что "пп" не встала это понятно. Видимо такого фрагмента вообще нет. По поводу обилия замечаний при отсутствии фрагмента буду дальше работать.

На 64-разрядном Компасе работать не будет под него нужно отдельно компилировать. По поводу Иванов, возможно доступа к папке нет, в папке С:\Подписи файлы Иванов я не удалял.

Дмитрий22

У кого-нибудь библиотека заработала? Отпишитесь.

Да забыл сказать, если убрать пп, то ошибок не выдаётся, ставится дата, а подпись нет.

Есть пожелание, чтобы привязка библиотеки была не жёсткая к папке С:\Подписи.
Ниже функция которая вернёт, полный путь к библиотеке, возможно Вам поможет.

//==============================================================================
function GetDLLName:WideString; stdcall;
var
DLLFileName:array[0..MAX_PATH] of WideChar;
begin
  FillChar(DLLFileName,SizeOf(DLLFileName),#0);
  GetModuleFileName(hInstance,DLLFileName,SizeOf(DLLFileName));
  Result:=DLLFileName;
end;
//==============================================================================

demosfenus

#6
Я где-то здесь на форуме находил такую функцию определения пути к библиотеке:

function getPathRTW;
var
  nSize: Cardinal;
  fName, nPath: string;
begin
  nSize := 255;
  SetLength(fName, nSize);
  SetLength(fName, GetModuleFileName(hinstance, pChar(fName), nSize));
  nPath := ExtractFilePath(fName); // Путь к библиотеке
  Result := nPath;
end;

Хотя решение Sabahs'а IMHO более гибкое и красивое.

А то что даты инкрементируются это фишка такая?

P.S. Дмитрий (тезка кстати), а со спецификациями никаких идей не возникло?

Дмитрий22

Спасибо за предложения по поводу получения пути, еще бы кусок работающего кода, как напрямую к растру добраться, а то через фрагмент долго. demosfenus у тебя подписи вставлялись или только дата? Инкрементная дата - это фишка. Со спецификацией вообще беда.

Кода нет, можете почитать в SDK про интерфейс IRasters и IRaster, как раз то, что Вам нужно.

demosfenus

Пример вставки подписи с использованием API5:

procedure InsertSign;
var
  iRasterParam: ksRasterParam;
  iPlacementParam: ksPlacementParam;
  SignPath: String;
begin
  SignPath := getPathRTW + 'файл_подписи';  // путь к файлу относительно пути к библиотеке
  if not(FileExists(SignPath)) then // проверка на существование файла подписи
  begin
    iKompas.ksMessage('Файл подписи' + #10#13 + SignPath + #10#13 + 'не найден!');
    exit;
  end;

  iRasterParam := ksRasterParam(iKompas.GetParamStruct(ko_RasterParam));

  if iRasterParam = nil then exit;
  iRasterParam.embeded := True; // взять растр в документ (False - связать, но не брать в документ)
  iRasterParam.FileName := SignPath;
  iPlacementParam := ksPlacementParam(iKompas.GetParamStruct((ko_PlacementParam)));
  if iPlacementParam = nil then exit;

  iPlacementParam.angle := 0;   // угол поворота растра
  iPlacementParam.scale_ := 1;  // масштаб растра при вставке (1 - не масштабировать)
  iPlacementParam.xBase := 150; // координаты
  iPlacementParam.yBase := 25;  // вставки

  iRasterParam.SetPlace(iPlacementParam);   // вставляем
  iDocument2D.ksInsertRaster(iRasterParam); // подпись

  iPlacementParam := nil;
  iRasterParam := nil;
end;


getPathRTW описана выше.

Использование интерфейса iRaster из API7 мне кажется более предпочтительным, т.к. он описывает такие свойства растра, как Resolution, SourceHeight, SourceWidth. Это дает возможность вычислить масштаб вставки растра и, тем самым, сжать до нужных размеров. Но я пока не разбирался с API7, т.к. временно отвлекся на другую более приоритетную задачу.

Poltava

v13 и v14(beta) x86 win XP х32 вроде работает. Но детально тестировать времени не было.
Пара пожеланий с точки зрения пользователя:
- Добавить возможность выбора формата даты
- Добавить возможность подписи не всех фамилий из штампа, а только указанных в настройках
        a) Только определенные должности
        б) Только определенные фамилии
        в) Комбинация из а и б
- Добавить возможность удалить подписи с аналогичными а, б, в вариантами настройки
- Инкрементирующиеся  даты сделать опциональной возможностью.
- Ну и как писали выше, задать место расположения базы подписей(с возможность указания сетевого пути)
PS: Проверил подключив библиотеку по сети. С путями к подписям сработала корректно при первом запуске взяв подписи из папки в которой расположена библиотека. При повторном запуске компаса библиотека уже обратилась к диску C:\ и выдала ошибку.

Дмитрий22

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

demosfenus

Пример вставки подписи с использованием API7:

procedure InsertSignAPI7;
var
  pViews: IViews;
  pView: IView;
  pDrawingContainer: IDrawingContainer;
  pRasters: IRasters;
  pRaster: IRaster;
  SignPath: String;
begin
  SignPath := 'полный путь к подписи';
  pViews := GetViews(); //функция взята из SDK (Step1_API7_2D_1.pas)
  pView := pViews.ViewByNumber[0]; //вставлять подписи будем в нулевой вид (можно в 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 := SignPath;
        pRaster.SetPlacement(60, 30, 0, False); // x, y, угол поворота, зеркальность
        pRaster.Scale := 0.5; // масштабирование (если масштаб 1 - можно не указывать)
        pRaster.InsertionType := True; // взять в документ
        pRaster.Update; // чтобы применить введенные свойства, вызываем метод update
        pRaster := nil;
      end;
      pRasters := nil;
    end;
    pDrawingContainer := nil;
  end;
  pView := nil;
  pViews := nil;
end;

Цитата: demosfenus от 13.11.12, 10:54:40
Использование интерфейса iRaster из API7 мне кажется более предпочтительным, т.к. он описывает такие свойства растра, как Resolution, SourceHeight, SourceWidth.
Интересно что до окончательной вставки (iRaster.Update) возвращает ширину, длину и разрешение равные 0.
Получается чтобы автоматически вычислить масштаб, нужно вставить растр с дефолтными значениями, а уже потом вычислить/указать нужные и еще раз выполнить iRaster.Update.

Ширину и высоту рисунка можно взять из файла изображения, pRasters.Add; создаёт растровый объект в памяти, параметры которого Вы заполняете и только после iRaster.Update он создастся в документе.

demosfenus

Компас поддерживает bmp, gif, jpg, png, tif, tga. Я не знаю (возможно только я) универсального способа узнать ширину, высоту и (!) разрешение напрямую из файла для всех этих форматов.
А с двумя апдейтами некрасиво, но работает. :)

#15
Кроме Компаса, есть ещё стандартные классы.

demosfenus

Цитата: Poltava от 13.11.12, 16:52:35
- Добавить возможность подписи не всех фамилий из штампа, а только указанных в настройках
        a) Только определенные должности
        б) Только определенные фамилии
        в) Комбинация из а и б
Что вы понимаете под должностями? Вести список фамилия-должность или под должностью имеется ввиду "разраб-провер-т.контр-н.контр" и т.п.?
Цитата: Poltava от 13.11.12, 16:52:35
- Добавить возможность удалить подписи с аналогичными а, б, в вариантами настройки
А вот здесь задумался:
Как отличить уже вставленные подписи друг от друга и от других растров (например логотип фирмы)?

Poltava

ЦитироватьЧто вы понимаете под должностями?
Под должностями я имею в виду "разраб-провер-т.контр-н.контр" Ведь если я  в должности нормоконтроля проверил и нажал кнопку подписать то подпишется не только моя должность а все сразу, то есть я нажав кнопку подписываю сразу за ВСЕХ участников проекта, а не только за себя! Таже история с фамилиями!

Дмитрий22

Цель данной библиотеки привести в соответствие бумажный носитель и электронный вариант, чтоб потом можно было отправлять заказчику, либо в производство картинки непосредственно из Компаса, а не сканировать бумагу с подписями. Если Вам нужна система электронных подписей с пошаговым подписанием, то Вам нужно обратиться к встроенным возможностям "Лоцмана".

Poltava

Я так понимаю вы имеете в виду электронную подпись. Вариант хороший но это при наличии купленного лоцмана :) Ну а если рассматривать в аспекте
Цитироватьпривести в соответствие бумажный носитель и электронный вариант
То свои функции она выполняет. Но я так понимаю это не последняя версия библиотеки! Ну и еще пара замечаний:
- при отсутствии фамилии в базе подписей выдает ошибку на каждую подпись как по мне не совсем удобно.
- даже при отсутствии фамилии в базе дата все равно заполняется.