На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Роман (Все сообщения пользователя)

Поиск  Пользователи  Правила  Войти
Форум » Пользователи » Роман
Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 3 4 5 6 След.
Фоновая печать карты., первый лист печатает, остальные не хочет
 
[QUOTE]Елена Кузнецова написал:
[QUOTE] Роман написал:
После работы программы. В папке указанной в пункте 1 появляется только файл лист1.pdf, остальные файлы лист2.pdf, лист3.pdf и т.д. не создаются.[/QUOTE]
В программе обнаружили ошибку.
Будем разбираться, спасибо.[/QUOTE]
Если не поздно. Можно как-то учесть, может это будет сложно. Но что бы можно было несколько карт как-нибудь отправить на печать одним разом. Допустим открываю карту 1, отправляю на печать. Открываю карту 2. отправляю на печать. Открываю Карту 3. Отправляю на печать. Завершаю печать. Итогом - вывод одним файлом печати. Или одной сессией печати.
Фоновая печать карты., первый лист печатает, остальные не хочет
 
[QUOTE]Oleg Belenkov написал:
Что означает фраза - карта не печатается?
Выходит белый лист или печать не начинается?[/QUOTE]
Не печатается. Значит ничего не происходит с принтером, драйвером. Т.е. результата нет. Ни листа, ни файла.
Настроен драйвер Adobe PDF по умолчанию следующим образом:
1. Выводить по указанному пути.
2. Заменять существующие файлы.
3. Настроен формат вывода А3.

на всякий случай все pdf файлы удалены из папки в пункте 1.

Файлы создаются по имени карты. Т.е. если карта называется лист1.sit то создается pdf файл лист1.pdf
Все карты открываются по отдельности.

После работы программы. В папке указанной в пункте 1 появляется только файл лист1.pdf, остальные файлы лист2.pdf, лист3.pdf и т.д. не создаются.
Фоновая печать карты., первый лист печатает, остальные не хочет
 
Здравствуйте!
Почему не печатает листы.
Задача.

Есть карты. На каждой карте есть прямоугольный объект. Нужно распечатать карту по прямоугольному объекту. Размеры этих объектов не превышают установленного размера листа.

Решение задачи.
1. Сначала нужно вызвать диалог настройки принтера. Т.к. бумагу переводить не хочется. Печатаем в Adobe PDF creator.
Итак... как мы это делаем. Есть класс в delphi TMapPrinter. Он один раз создается в конструкторе.
[CODE]constructor TMapPrinter.create(form: IMain);
begin
 try

   fMap := form.getMap;

   fGISFORMS := sGISPRINT;
   fHDll := LoadLibrary(PChar(fGISFORMS));  // 01/08/2012
   if fHDll<>0 then begin
     fPFuncDlg := Dll_prnMapPrintTitle(GetProcAddress(fHDll,PChar(NameFuncDlg)));
   end;

   fHPrinter := prnLoadPrinter();

   FillChar(fPrintParm, sizeof(TMAPPRINTPARMEX), 0);
   fPrintParm.Length := sizeof(TMAPPRINTPARMEX);
   fPrintParm.Copies := 1;
   fPrintParm.Regime := byte(MPR_INITPARM);
   fPrintParm.TypePrint := MPT_NORMAL;
   fPrintParm.Preview := MPV_MAP;
   fPrintParm.TypeOutput := MPO_RASTERIAL;
//    fPrintParm.Handle := form.getHandle;
   fPrintParm.Handle := form.getHandle;
   fPrintParm.FitToPage := MPF_SPLITTOPAGES;

   FillChar(taskParm, sizeof(TTASKPARM), 0);
   taskParm.Language := 2;
   taskParm.Handle := form.getHandle;
   taskParm.ApplicationName := 'Печать карты';

   isFirstPrint := True;

 except
   on e: Exception do AddLogInfo(LOG_MAIN, 'TMapPrinter.FormCreate: ' + e.Message);
 end;
end;
[/CODE]2. Вызывается функция фонового печати карты. Но т.к. принтер не настроен, надо сначала вывести окно настройки принтера. Для этого мы вызываем диалог печати. После того как пользователь настроил печать. Обнуляем флаг, что больше выводить диалог настройки принтера не надо и в цикле вызываем функцию печати. В теле цикла текущая карта закрывается. Открывается следующая карта, вызывается функция печати. Выглядит это как-то так.[CODE] ownerMap.MapOpen(listPath, true);

   try
    здесь находим объект рамку печати и помещаем его в структуру TMapDFrame
   
     objFrame := Obj.ObjFrame;
   
//      ownerMap.appendSite(aMapFileName);
     ownerMap.getMapView.PrintSelect.ClearAll;
     mapScale := ownerMap.getMapView.MapScale;
     mapPrinter.StartBackGroundPrintActExecute(objFrame, mapScale);
   finally
//      ownerMap.MapClose;
   end;
[/CODE]Теперь поговорим о вызове метода фоновой печати
[CODE]procedure TMapPrinter.StartBackGroundPrintActExecute(aFrame: TMAPDFRAME; aScale: Integer);
var
 ret: Integer;

begin
 try

   if (not fMap.getMapView.Active) or
     (fHDll = 0) or
     (Not Assigned (fPFuncDlg))
     then exit;


   if isFirstPrint then begin
     fPrintParm.Regime := byte(MPR_INITPARM);
     isFirstPrint := False;
     ret := fPFuncDlg(fmap.MapHandle, fhPrinter, fPrintParm, taskparm, '');
   end;

   fPrintParm.Regime := byte(MPR_PRINTONLY);

   fPrintParm.PlaneFrame.X1 := aFrame.X1;
   fPrintParm.PlaneFrame.Y1 := aFrame.Y1;
   fPrintParm.PlaneFrame.X2 := aFrame.X2;
   fPrintParm.PlaneFrame.Y2 := aFrame.Y2;
   fPrintParm.Scale := aScale;

   ret := fPFuncDlg(fmap.MapHandle, fhPrinter, fPrintParm, taskparm, '');

 except
   on e:Exception do AddLogInfo(LOG_MAIN, 'TMapPrinter.PrinterSettingsExecute: ' + e.Message);
 end;
end;
[/CODE]что мы тут делаем... если вызывается первый раз этот метод, то мы настраиваем печать в диалоге печати а потом его закрываем просто. Далее мы подставляем габариты объекта нашего и печатаем.
Первая карта печатается. Вторая уже нет. Когда первая карта печатается я вижу getLastError = 87, когда карта не печатается getLastError = 2. Можете мне чем-то помочь?
Создание новой карты, не создается новая карта
 
Здравствуйте!

Необходимо создать обычную пользовательскую карту, без проекции да и тип карты раньше в старых версиях был не установленным. Сейчас все ставят "крупномасштабный план"

Не могу создать новую карту. Какие должны бть коды проекции и тип карты при создании... спасибо!

[CODE]procedure TbMap.newMap;
var
 createSite: TCREATESITE;
 q: Integer;
 str: AnsiString;
begin
 try

   ZeroMemory(@createSite, SizeOf(createSite));

   //createSite.Length := 0;

   str:='tbBD';
   for q := 1 to 32 do begin
     if q<=Length(str) then
       createSite.MapName[q] := str[q]
     else
       createSite.MapName[q] := #0;
   end;

   createSite.MapType := MT_LARGESCALE; // Обобщенный тип карты
   createSite.MaterialProjection := -1;// Проекция исх. материала
   createSite.Scale := 2000;              // Знаменатель масштаба карты

   if fMap.CreateSite(fMapPath,fMapRsc,createSite)<>0 then
     raise Exception.Create('Ошибка создания карты');

 except
   on E: Exception do AddLogMessage(LOG, 'TbMap.newMap: ' + E.Message);
 end;
end;
[/CODE]
GIS ToolKit Active - обработка скролла колесика мыши
 
[QUOTE]Andrey Gheleznyakov пишет:
А в какой версии работает?[/QUOTE]

Файл News.txt

версия 9.15.16        20.06.2008
GIS ToolKit Active - обработка скролла колесика мыши
 
[QUOTE]KFF пишет:
[QUOTE]Роман пишет:

Почему-то срабатывает аж 2-4 раза обработчик события. Как итог карта просто прокручивается 2-3 раза. Походу я перенесу колесо на главную форму. А в mapview непонятно почему так реализуется событие =)[/QUOTE]

Роман, это баг в Вашей среде разработки а не в компонентах (см. тему [URL=http://www.gisweb.ru/forum/forum2/topic5334/messages/]http://www.gisweb.ru/forum/forum2/topic5334/messages/[/URL] )

заключается оно в следующем, цитирую:

[QUOTE]В деталях стандартных компонент Delphi не разбирался, но опытным путем выяснил, что при на один тик колеса мыши приходит два сообщения, если параметр Handled в событии не установить в true. При этом, если были нажаты клавиши Ctrl, Shift , то второе сообщение приходит с неправильным содержимым параметра Shift: TShiftState;. Так что, при обработке сообщения от колеса мыши установите Handled в true.[/QUOTE][/QUOTE]

Да я тоже разобрался =) Решил этот вопрос задать на форуме. Т.е. поиском мало нашел =) Вы говорите про глюк в среде разработки. Тогда почему в GTK предыдущей версии (ой какая старая) все работает? А в новой не работает?
GIS ToolKit Active - обработка скролла колесика мыши
 
Попытался реализовать колесико мыши. Делаю в BDS 2006 установил последнюю ГТК не нашел в списке свой BDS установил как для Rad 2007 откомпилилась нормально. Хотя предыдущие не компилились. Но не в этом дело. Почему-то срабатывает аж 2-4 раза обработчик события. Как итог карта просто прокручивается 2-3 раза. Походу я перенесу колесо на главную форму. А в mapview непонятно почему так реализуется событие =)

[I]procedure TForm1.MapViewMouseWheelDown(Sender: TObject; Shift: TShiftState;
 MousePos: TPoint; var Handled: Boolean);
var
NewScale:Integer;
SPoint:TPoint;
x,y:Double;
begin

if not MapView.Active then exit;
// определяем следующий масштаб

MousePos:=MapView.ScreenToClient(MousePos);

// NewScale:=MapView1.ViewScale * 2;
NewScale:=GetNewScale(MapView.ViewScale,1);

// позиционируем карту на новый масштаб
MapPoint.PlaceInp:=PP_Picture;
MapPoint.SetPoint(MapView.MapLeft+MousePos.X,MapView.MapTop+MousePos.Y);

MapView.ScaleInPoint(NewScale,MapPoint.point);
// установим курсор в новую позицию но с теми же
// координатами в карте
MapPoint.PlaceOut := PP_PICTURE;

MapPoint.GetPoint(x,y);

spoint.X := trunc(x) - MapView.MapLeft;
spoint.Y := trunc(y) - MapView.MapTop;

spoint   := MapView.ClientToScreen(spoint);
SetCursorPos(spoint.X, spoint.Y);
exit;
//
end;

procedure TForm1.MapViewMouseWheelUp(Sender: TObject; Shift: TShiftState;
 MousePos: TPoint; var Handled: Boolean);
var
NewScale:Integer;
SPoint:TPoint;
TX,TY:Double;
begin

if not MapView.Active then exit;

MousePos:=MapView.ScreenToClient(MousePos);

// определяем следующий масштаб
// NewScale:=MapView1.ViewScale div 2;
NewScale:=GetNewScale(MapView.ViewScale,-1);

// позиционируем карту на новый масштаб
MapPoint.PlaceInp:=PP_Picture;

MapPoint.SetPoint(
  MapView.MapLeft+MousePos.X,
  MapView.MapTop+MousePos.Y
);

MapView.ScaleInPoint(NewScale,MapPoint.point);
// установим курсор в новую позицию но с теми же
// координатами в карте
MapPoint.PlaceOut := PP_PICTURE;

MapPoint.GetPoint(TX,TY);

spoint.X := trunc(TX) - MapView.MapLeft;
spoint.Y := trunc(TY) - MapView.MapTop;

spoint   := MapView.ClientToScreen(spoint);
SetCursorPos(spoint.X, spoint.Y);
exit;
//
end;[/I]


Кому интересно еще и на среднюю конопку мыши сделал перемещение карты.

[I]procedure TForm1.MapViewMouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
if MapView.Active then begin
// двигаем карту
 if Button=mbMiddle then
  PanMapFlg:=true;
  LastX:=CurX;
  LastY:=CurY;
end;
end;

procedure TForm1.MapViewMouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
 var dx,dy:Integer;
begin
CurX:=X;
CurY:=Y;
if PanMapFlg then begin
 dx:=CurX-LastX;
 dy:=CurY-LastY;
 MapView.PlaceOut:=PP_PICTURE;
 MapPoint.PlaceInp:=PP_PICTURE;
 MapView.GoPointInWindow(MapView.MapLeft,
  MapView.MapTop,PP_PICTURE,dx,dy
 );
//  MapView1.ScaleInPoint(MapView1.ViewScale,MapPoint.Point);
end;
LastX:=CurX;
LastY:=CurY;
end;


procedure TForm1.MapViewMouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
if MapView.Active then begin
// двигаем карту
 if Button=mbMiddle then
  PanMapFlg:=false;
  LastX:=CurX;
  LastY:=CurY;
end;
end;[/I]

Еще один момент. Я перешел от старой версии GTK к новой. Может что не так работает. Т.к. раньше например к компоненту TMapPoint можно было получить доступ к координатам через свойства X, Y а сейчас убрали и приходится использовать GetPoint, SetPoint что неудобно иногда бывает. Например при вставке в формулы. Хотя с точки зрения оптимизации set- getpoint лучше.

Вот только почему аж 2-4 раза увеличивается - уменьшается...
Почему площади с минусами?, Площади с минусами при формировании XML файла
 
[QUOTE]Leyla пишет:
Наверно вы, дорогой Роман, не внимательно читали мой пост #8!

Я не спрашивала как определить какой контур должен быть внешним, а какой внутренним. Я спрашивала как это быстро исправить.[/QUOTE]

Когда вы процитировали мой текст выше, я конкретно писал про то, что разработчикам ПО будет наверное несложно внедрить в свою программу код с алгоритмом вычисления основного контура с подобъектами =)
Я могут здесь только посоветовать разработчикам что-то изменить. Предложить. А исправлять код программы не в моей компетенции.
Ну а пока программа улучшается, можно использовать редактор карты =)

[QUOTE]Александр Кружков пишет:
В настоящее время более эффективный способ, предложенный Романом Демиденко, мне не известен.[/QUOTE]

Ну и отлично! Предлагаю улучшить следующую версию ГИС =)
Изменено: Роман - 29.07.2013 10:54:05
Почему площади с минусами?, Площади с минусами при формировании XML файла
 
[QUOTE]Leyla пишет:

Ну раз такой умный, давайте поделитесь решением такой проблемы. Только пожалуйста не предлагайте мне вырезать подъобъекты самостоятельно![/QUOTE]

Я умный :D Спасибо за комплимент.


Алгоритм поиска может быть следующий.

1. В цикле перебираем контура. Первый попавшийся контур, априори он будет для нас контуром А - потенциально внешним.
2. Во втором цикле перебираем остальные контура. Первый попавшийся контур для нас будет Б - потенциально внутренним.
3. Проверяем Является контур Б контуром внутри объекта А, если да, то контур А является внешним. Если нет, то проверяем остальные контура для контура А (следующий контур Б).
4. Проверяем следующий контур А.

Условием проверки входимости Контура Б в контур А (пункт 3) является условие при котором все точки контура Б находятся внутри контура А.
Алгоритмов проверки входимости точки Бi внутрь контура А много. Предложу свой: Определяем произвольную точку вне габаритов контура s. Считаем количество пересечений линии Бi-s с контуром А.
Если число пересечений четное, то точка находится вне контура, если число пересечений нечетное, то точка находится внутри контура.
Почему площади с минусами?, Площади с минусами при формировании XML файла
 
[QUOTE]Роман Демиденко пишет:
[QUOTE]Leyla пишет:

А У нас несколько иная проблема.

Мы выгружаем КПТ: у участка есть много подъобъектов. И получается что когда мы выгружаем XML и галочку "все наносимые контура - внешние" убираем, панорама сама вырезает подъобъекты. Причем вырезает она так, что за основной контур принимается подъобъект. Не знаю ясно ли я описала нашу проблему. Для примера высылаю КПТ. Нет ли такой возможности у панорамы менять порядок подъобъектов? Или выгружать в правильном порядке? Кадастровый номер участка 16:20:080802:9.[/QUOTE]

Добрый день!

Здесь вопрос нужно адресовать доблестным работникам Росреестра, так как они перепутали координаты контуров в КПТ.

Для ЗУ 16:20:080802:9, который в себе содержит подобъекты, они присвоили внешнюю границу из 4 точек, одного из контуров от ЗУ 16:20:080802:52.

При загрузке в Панораму мы это никак не исправим.

Необходимо после загрузки корректировать метрику контуров.[/QUOTE]


Есть несложные алгоритмы выявления общего контура =) Даже простой школьник может написать алгоритм анализа контуров. Некоторые ГИС прекрасно с этим справляются. Да и в ГИС Карта 2011 это делается через редактор карты =)
Страницы: 1 2 3 4 5 6 След.



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности