//===================================================
// Выполнить печать
// Выход = true - печать выполнена
//===================================================
function TMapPrintDialog.Execute : boolean;
const
NameFuncLoad = 'prnLoadPrinter';
NameFuncDlg = 'prnMapPrintEx';
NameFuncFree = 'prnFreePrinter';
var
hDll : HMODULE;
pFuncLoad : Dll_prnLoadPrinter;
pFuncDlg : Dll_prnMapPrintTitle;
pFuncFree : Dll_prnFreePrinter;
PrinterH : HPRINTER;
TaskParm : TTASKPARM;
PrnParm : TMAPPRINTPARMEX;
aMapView : TMapView;
ii, aa, cnt : integer;
TypeSelectRect : TTypeSelectRect;
AutoSelectRect : boolean;
FTitle : GtkString;
pTitle : GtkPChar;
prnDFrame : TMAPDFRAME;
SelectMode : TSelectionMode;
mapPos : TMAPPOS;
// координаты углов рамки (выбранной области)
iPoint1,
iPoint2,
iPoint3,
iPoint4 : TDoublePoint;
FrameKey : integer;
FrameList : string;
X1,Y1,X2,Y2: double;
mv_placeout: TPPLACE;
mdframe : TMAPDFRAME;
begin
Result:=false;
if FMapView=nil then exit;
if FMapView.MapHandle = 0 then exit;
aMapView := TMapView(FMapView);
hDll := 0;
PrinterH := 0;
try
try
// Загрузить принтер
pFuncLoad := LoadFunction(sGISPRINT, NameFuncLoad, hDll); // 07/07/2017 24/10/2017 15/11/2017
if (hDll = 0) or not Assigned (pFuncLoad)
then exit; // должны попасть в finally
PrinterH := pFuncLoad();
if PrinterH = 0
then exit; // должны попасть в finally
// Заполнение параметров прикладной задачи
InitTaskParm(TaskParm, FMapView); // 20/06/2010
TaskParm.Handle := FMapView.Handle; // 03/05/2012 // Подменяем для того, чтобы отлавливать сообщения
if not FHelpEnabled
then TaskParm.HelpName := nil;
// Заполнение параметров печати
FillChar(PrnParm, sizeof(PrnParm), 0);
PrnParm.Length := sizeOf(PrnParm);
PrnParm.Handle := FMapView.Handle; // 10/07/2013
PrnParm.Restore := 1; // 04/07/2017
PrnParm.Regime := sMPR_PRINTALL; // 15/11/2013
case FTypePreview of
MPV_SCHEME : PrnParm.Preview := sMPV_SCHEME;
MPV_MAP : PrnParm.Preview := sMPV_MAP;
MPV_INFO : PrnParm.Preview := sMPV_INFO;
end; // case
case FTypePrint of
MPT_NORMAL : PrnParm.TypePrint := sMPT_NORMAL;
MPT_TRANSPARENT : PrnParm.TypePrint := sMPT_TRANSPARENT;
MPT_CONTOUR : PrnParm.TypePrint := sMPT_CONTOUR;
end; // case
case FTypeOutput of
MPO_VECTORIAL : PrnParm.TypeOutput := sMPO_VECTORIAL;
MPO_RASTERIAL : PrnParm.TypeOutput := sMPO_RASTERIAL;
end; // case
case FTypeOrient of
MPN_DEFAULT : PrnParm.Orientation := sMPN_DEFAULT;
MPN_PORTRAIT : PrnParm.Orientation := sMPN_PORTRAIT;
MPN_LANDSCAPE : PrnParm.Orientation := sMPN_LANDSCAPE;
end; // case
if (PrintRect.Left <> 0 ) or (PrintRect.Right <> 0) or
(PrintRect.Top <> 0 ) or (PrintRect.Bottom <> 0)
then begin
PrnParm.RectMetr := PrintRect;
PrnParm.Regime := sMPR_PRINT; // 24/05/2007
end;
PrnParm.ShiftLTmm := FShiftLeft;
PrnParm.ShiftUPmm := FShiftTop;
PrnParm.FieldLTmm := FFieldLeft;
PrnParm.FieldUPmm := FFieldTop;
PrnParm.FieldRTmm := FFieldRight;
PrnParm.FieldDNmm := FFieldBottom;
PrnParm.Intensity := FIntensity;
PrnParm.Copies := FCopies;
PrnParm.Scale := aMapView.ViewScale; // 24/05/2007
if FBorder
then PrnParm.Border := 1
else PrnParm.Border := 0;
if FFitToPage
then PrnParm.FitToPage := 1
else PrnParm.FitToPage := 0;
if FBlack
then PrnParm.Black := 1
else PrnParm.Black := 0;
if FFilePrn
then PrnParm.FileFlag := 1
else PrnParm.FileFlag := 0;
if FPrintSelecting = true
then begin
// Возьмем габариты печати из MapView // 28/08/2012
mv_placeout := aMapView.PrintSelect.PlaceOut;
aMapView.PrintSelect.PlaceOut := PP_PLANE;
aMapView.PrintSelect.GetRegionOut(false, X1, Y1, X2, Y2);
PrnParm.Regime := sMPR_PRINT;
aMapView.PrintSelect.PlaceOut := mv_placeout;
Prnparm.PlaneFrame.X1 := X1;
Prnparm.PlaneFrame.Y1 := Y1;
Prnparm.PlaneFrame.X2 := X2;
Prnparm.PlaneFrame.Y2 := Y2;
// Перебьем установки отображения печатью
with aMapView.PrintSelect do begin
for ii := 0 to aMapView.MapSites.SiteCount
do mapSetSiteViewSelect(aMapView.MapHandle,aMapView.MapSites[ii].FSite,SelectHandle[ii]);
end; // with
end
else begin // if FPrintSelecting
if aMapView.Selecting
then begin
if aMapView.ViewSelect.SelectNew = true // Что-то изменили в селекции отображенияs
then begin
aMapView.ViewSelect.SelectNew := false;
for ii:=0 to aMapView.MapSites.SiteCount
do mapSetSiteViewSelect(aMapView.MapHandle,
aMapView.MapSites[ii].FSite,aMapView.ViewSelect.SelectHandle[ii]);;
end;
mv_placeout := aMapView.ViewSelect.PlaceOut;
aMapView.ViewSelect.PlaceOut := PP_PLANE;
aMapView.ViewSelect.GetRegionOut(false, X1, Y1, X2, Y2);
aMapView.ViewSelect.PlaceOut := mv_placeout;
PrnParm.Regime := sMPR_PRINT;
Prnparm.PlaneFrame.X1 := X1;
Prnparm.PlaneFrame.Y1 := Y1;
Prnparm.PlaneFrame.X2 := X2;
Prnparm.PlaneFrame.Y2 := Y2;
end // if FMapView.Selecting
else
begin
mdframe := aMapView.GetRegionDFrame(PP_PLANE);
Prnparm.PlaneFrame.X1 := mdframe.X1;
Prnparm.PlaneFrame.Y1 := mdframe.Y1;
Prnparm.PlaneFrame.X2 := mdframe.X2;
Prnparm.PlaneFrame.Y2 := mdframe.Y2;
end;
end; // if FPrintSelecting
pFuncDlg := LoadFunction('', NameFuncDlg, hDll); // 07/07/2017
if (Not Assigned (pFuncDlg))
then exit; // должны попасть в finally
mapPos.MapTop:=FMapView.MapTop; // положение карты в окне // 07/02/2007
mapPos.MapLeft:=FMapView.MapLeft;
while true
do begin
pTitle := nil;
if FCaption <> EmptyStr
then begin
FTitle := GTKAnsiString(FCaption); // 12/02/2019
pTitle := GtkPChar(FTitle);
end;
// 12/02/2019 - выход с нулем может быть также и при закрытии диалога
// для остальных кодов возврата считаем, что результат положительный
if (pFuncDlg(FMapView.MapHandle, PrinterH, Prnparm, Taskparm, pTitle) <> 0)
then Result := true
else break;
TypeSelectRect := slNewRect;
iPoint1.X := 0; // 09/02/2011
iPoint1.Y := 0;
iPoint2.X := 0;
iPoint2.Y := 0;
iPoint3.X := 0;
iPoint3.Y := 0;
iPoint4.X := 0;
iPoint4.Y := 0;
// 15/11/2013 !!!!!!!!!!!!!!!!!!!!!!!!!
// Временно! Для GTKAx - выбор области по объекту не работает!
// Заменен на простой выбор области
{$IFDEF GTKAX}
if (PrnParm.Regime = sMPR_SELECTBYOBJECT)
then PrnParm.Regime := sMPR_SELECTFRAME;
{$ENDIF}
if PrnParm.Regime = sMPR_CHANGEFRAME // необходимо изменить область печати
then TypeSelectRect := slChangeRect;
if (PrnParm.Regime = sMPR_SELECTBYOBJECT)
then begin
if EditSelectRectByObject(TMapView(FMapView), PlaceShow, clRed,
prnDFrame, mapPos, FrameKey, FrameList,
TViewMapType(TMapView(FMapView).ViewType)) // 12/09/2014
then begin
PrnParm.FrameKey := FrameKey;
FillChar(PrnParm.FrameList, sizeof(PrnParm.FrameList), 0);
cnt := Length(FrameList);
if (cnt > sizeof(PrnParm.FrameList)-1)
then cnt := sizeof(PrnParm.FrameList)-1;
for aa := 0 to cnt-1 do
begin
PrnParm.FrameList[aa] := AnsiChar(FrameList[aa+1]);
end;
FillChar(PrnParm.RectMetr, sizeof(PrnParm.RectMetr), 0);
FillChar(PrnParm.PlaneFrame, sizeof(PrnParm.PlaneFrame), 0);
PrnParm.RectMetr.Left := trunc(prnDFrame.Y1);
PrnParm.RectMetr.Right := trunc(prnDFrame.Y2);
PrnParm.RectMetr.Top := trunc(prnDFrame.X1);
PrnParm.RectMetr.Bottom := trunc(prnDFrame.X2);
PrnParm.PlaneFrame.X1 := prnDFrame.X1;
PrnParm.PlaneFrame.Y1 := prnDFrame.Y1;
PrnParm.PlaneFrame.X2 := prnDFrame.X2;
PrnParm.PlaneFrame.Y2 := prnDFrame.Y2;
end
else PrnParm.Regime := sMPR_PRINTALL;
continue;
end;
if (PrnParm.Regime = sMPR_SELECTFRAME) or
(PrnParm.Regime = sMPR_CHANGEFRAME) or
(PrnParm.Regime = sMPR_SELECTTURNFRAME) // 23/01/2011
then begin
AutoSelectRect := true; // разрешим вызов штатного выбора области
if Assigned(FOnSelectRect)
then begin
// AutoSelectRect := false; 20/04/2011 иначе плохо в AX
AutoSelectRect := true; // 20/04/2011 иначе плохо в AX
FOnSelectRect(Self, TMapView(FMapView), TypeSelectRect, PrnParm.RectMetr, AutoSelectRect)
end;
if (PrnParm.Regime = sMPR_SELECTTURNFRAME) // 20/04/2011
then AutoSelectRect := false;
if AutoSelectRect = true
then begin
if TypeSelectRect <> slChangeRect
then begin
prnDFrame.X1 := 0; prnDFrame.X2 := 0;
prnDFrame.Y1 := 0; prnDFrame.Y2 := 0;
end
else begin // возьмем что есть
prnDFrame.Y1 := PrnParm.RectMetr.Left; prnDFrame.Y2 := PrnParm.RectMetr.Right;
prnDFrame.X1 := PrnParm.RectMetr.Top; prnDFrame.X2 := PrnParm.RectMetr.Bottom;
end;
if PrnParm.Regime=sMPR_CHANGEFRAME then SelectMode:=smEdit
else SelectMode:=smStandart_Edit;
if EditSelectRectExt(TMapView(FMapView), PP_PLANE, PlaceShow, clBlack, SelectMode, prnDFrame, mapPos,
iPoint1, iPoint2, iPoint3, iPoint4, // 09/02/2011
TViewMapType(TMapView(FMapView).ViewType)) // 12/09/2014
then begin
PrnParm.RectMetr.Left := trunc(prnDFrame.Y1);
PrnParm.RectMetr.Right := trunc(prnDFrame.Y2);
PrnParm.RectMetr.Top := trunc(prnDFrame.X1);
PrnParm.RectMetr.Bottom := trunc(prnDFrame.X2);
PrnParm.Regime := sMPR_PRINT;
PrnParm.PlaneFrame.X1 := iPoint1.X; // 09/02/2011
PrnParm.PlaneFrame.Y1 := iPoint1.Y;
PrnParm.PlaneFrame.X2 := iPoint3.X;
PrnParm.PlaneFrame.Y2 := iPoint3.Y;
PrnParm.TurnFrame := 0;
end
else begin
PrnParm.Regime := sMPR_PRINTALL;
PrnParm.PlaneFrame.X1 := 0;
PrnParm.PlaneFrame.Y1 := 0;
PrnParm.PlaneFrame.X2 := 0;
PrnParm.PlaneFrame.Y2 := 0;
PrnParm.TurnFrame := 0;
end;
end // if AutoSelectRect = true
else begin // 09/02/2011
if PrnParm.Regime=sMPR_SELECTTURNFRAME
then begin
SelectMode:=smSlopeRect;
if EditSelectRectExt(TMapView(FMapView), PP_PLANE, PlaceShow, clBlack, SelectMode, prnDFrame, mapPos, iPoint1, iPoint2, iPoint3, iPoint4,
TViewMapType(TMapView(FMapView).ViewType)) // 12/09/2014
then begin
PrnParm.RectMetr.Left := trunc(prnDFrame.Y1);
PrnParm.RectMetr.Right := trunc(prnDFrame.Y2);
PrnParm.RectMetr.Top := trunc(prnDFrame.X1);
PrnParm.RectMetr.Bottom := trunc(prnDFrame.X2);
PrnParm.Regime := sMPR_SELECTTURNFRAME;
PrnParm.TurnFrame := 1;
PrnParm.Angle := GetAngle(iPoint1, iPoint2);
PrnParm.PlaneFrame.X1 := iPoint1.X;
PrnParm.PlaneFrame.Y1 := iPoint1.Y;
PrnParm.PlaneFrame.X2 := iPoint3.X;
PrnParm.PlaneFrame.Y2 := iPoint3.Y;
PrnParm.Regime := sMPR_PRINT;
end;
end;
end; // if AutoSelectRect = true
continue;
end; // while true
// значит напечатали
break;
end; //while true
if FSaveParam = true // необходимо сохранить параметры диалога
then begin
case PrnParm.Preview of
sMPV_SCHEME : FTypePreview := MPV_SCHEME;
sMPV_MAP : FTypePreview := MPV_MAP;
sMPV_INFO : FTypePreview := MPV_INFO;
end; // case
case PrnParm.TypePrint of
sMPT_NORMAL : FTypePrint := MPT_NORMAL;
sMPT_TRANSPARENT : FTypePrint := MPT_TRANSPARENT;
sMPT_CONTOUR : FTypePrint := MPT_CONTOUR;
end; // case
case PrnParm.TypeOutput of
sMPO_VECTORIAL : FTypeOutput := MPO_VECTORIAL;
sMPO_RASTERIAL : FTypeOutput := MPO_RASTERIAL;
end; // case
case PrnParm.Orientation of
sMPN_DEFAULT : FTypeOrient := MPN_DEFAULT;
sMPN_PORTRAIT : FTypeOrient := MPN_PORTRAIT;
sMPN_LANDSCAPE : FTypeOrient := MPN_LANDSCAPE;
end; // case
PrintRect := PrnParm.RectMetr;
FShiftLeft := PrnParm.ShiftLTmm;
FShiftTop := PrnParm.ShiftUPmm;
FFieldLeft := PrnParm.FieldLTmm;
FFieldTop := PrnParm.FieldUPmm;
FFieldRight := PrnParm.FieldRTmm;
FFieldBottom := PrnParm.FieldDNmm;
FIntensity := PrnParm.Intensity;
FCopies := PrnParm.Copies;
if PrnParm.Border = 1
then FBorder := true
else FBorder := false;
if PrnParm.FitToPage = 1
then FFitToPage := true
else FFitToPage := false;
if PrnParm.Black = 1
then FBlack := true
else FBlack := false;
//if PrnParm.FilePrn = 1 // 09/02/2011
if PrnParm.FileFlag = 1
then begin
FFilePrn := true;
FFileName := String(PrnParm.FileName);
end
else FFilePrn := false;
end; // if FSaveParam
except
on E : Exception do
ShowGTKMessage(E.Message);
end;
finally
if hDll <> 0
then begin
// Освободить принтер
pFuncFree := LoadFunction('', NameFuncFree, hDll); // 07/07/2017
if (Assigned(pFuncFree) and (PrinterH <> 0))
then pFuncFree(PrinterH);
mapFreeLibrary(hDll); // 08/12/2016
hDll:=0;
end;
if FPrintSelecting = true // если меняли на печать
then begin
with aMapView.FViewSelect do
begin
for ii:=1 to aMapView.MapSites.SiteCount
do if FListUses[ii] <> nil then
mapSetSiteViewSelect(aMapView.MapHandle,aMapView.MapSites[ii].FSite,SelectHandle[ii]);
end;
end; // if FPrintSelecting
end; //try
end;
//===================================================
//=================================================== |