📄 ezmiscelentities.pas
字号:
If ( FDrawingUnits = 0 ) Or ( fPlottedUnits = 0 ) Then
Exit;
//Printer.BeginDoc;
TmpBox.Emin.X := dMin( FPoints[0].X, FPoints[1].X );
TmpBox.Emin.Y := dMin( FPoints[0].Y, FPoints[1].Y );
TmpBox.Emax.X := dMax( FPoints[0].X, FPoints[1].X );
TmpBox.Emax.Y := dMax( FPoints[0].Y, FPoints[1].Y );
DrawingScale := FDrawingUnits / fPlottedUnits;
(* ancho y alto del area a imprimir en unidades reales (mms o inches) *)
PaperAreaWidth := Abs( TmpBox.Emax.X - TmpBox.Emin.X );
PaperAreaHeight := Abs( TmpBox.Emax.Y - TmpBox.Emin.Y );
{ This is used to calculate a viewport rectangle in logical units }
PrinterGrapher := TEzGrapher.Create( 10, adPrinter );
Try
PrinterAreaRect := Grapher.RealToRect( TmpBox );
With PrinterAreaRect Do
PrinterGrapher.Setviewport( Left, Top, Right, Bottom );
FProposedPrintArea := ReorderRect2D( FProposedPrintArea );
FCalculatedPrintArea := FProposedPrintArea;
With FCalculatedPrintArea Do
Begin
TmpX1 := Emin.X;
TmpY2 := Emax.Y;
TmpX2 := TmpX1 + PaperAreaWidth * DrawingScale;
TmpY1 := TmpY2 - PaperAreaHeight * DrawingScale;
End;
With FCalculatedPrintArea Do
Begin // mark the calculated visual window
Emin.X := TmpX1;
Emin.Y := TmpY1;
Emax.X := TmpX2;
Emax.Y := TmpY2;
End;
PrinterGrapher.SetWindow( TmpX1, TmpX2, TmpY1, TmpY2 );
VisualWindow := PrinterGrapher.CurrentParams.VisualWindow;
// Now calculate the DrawBox rect in TEzPreviewEntity coordinates
VPArea := PrinterGrapher.RectToReal( Grapher.RealToRect( Clip ) );
Clipped := FALSE;
With VisualWindow Do
Begin
If Emin.X < VPArea.Emin.X Then
Begin
Emin.X := VPArea.Emin.X;
Clipped := TRUE;
End;
If Emin.Y < VPArea.Emin.Y Then
Begin
Emin.Y := VPArea.Emin.Y;
Clipped := TRUE;
End;
If Emax.X > VPArea.Emax.X Then
Begin
Emax.X := VPArea.Emax.X;
Clipped := TRUE;
End;
If Emax.Y > VPArea.Emax.Y Then
Begin
Emax.Y := VPArea.Emax.Y;
Clipped := TRUE;
End;
End;
If Not Clipped Then
Begin
R := PrinterGrapher.RealToRect( VisualWindow );
With R Do
PrinterGrapher.CanvasRegionStacker.Push( Printer.Canvas,
CreateRectRgn( Left, Top, Right, Bottom ) );
End;
TmpMinDrawLimit := Ez_Preferences.MinDrawLimit;
Ez_Preferences.MinDrawLimit := 0;
With Ez_Preferences Do
Begin
TmpShowText := ShowText;
ShowText := True;
End;
With TEzPainterObject.Create(Nil) Do
Try
DrawEntities( VisualWindow,
GIS,
Printer.Canvas,
PrinterGrapher,
FSelection,
FALSE,
FALSE,
FPrintMode,
Nil ); { warning!!: cannot show transparent bitmaps on printer }
Finally
free;
End;
With Ez_Preferences Do
Begin
MinDrawLimit := TmpMinDrawLimit;
ShowText := TmpShowText;
End;
Finally
PrinterGrapher.CanvasRegionStacker.PopAll( Printer.Canvas );
PrinterGrapher.Free;
End;
{$IFDEF TRIAL_VERSION}
{ draw trial version message }
Printer.Canvas.Font.Name := 'Arial';
Printer.Canvas.Font.Size := 40;
Printer.Canvas.Font.Style := [fsBold];
Printer.Canvas.Font.Color := clGray;
GetObject( Printer.Canvas.Font.Handle, SizeOf( LogRec ), @LogRec );
LogRec.lfEscapement := 450;
LogRec.lfOutPrecision := OUT_TT_ONLY_PRECIS;
StrPCopy( LogRec.lfFaceName, Printer.Canvas.Font.Name );
newFont := CreateFontIndirect( LogRec );
oldFont := SelectObject( Printer.Canvas.Handle, newFont );
OldAlign := GetTextAlign( Printer.Canvas.Handle );
SetTextAlign( Printer.Canvas.Handle, TA_CENTER );
Printer.Canvas.TextOut( Printer.PageWidth Div 2, Printer.PageHeight Div 2,
'For evaluation purposes only' );
newFont := SelectObject( Printer.Canvas.Handle, oldFont );
DeleteObject( newFont );
SetTextAlign( Printer.Canvas.Handle, OldAlign );
{$ENDIF}
End;
Procedure TEzPreviewEntity.LoadFromStream( Stream: TStream );
Begin
Inherited LoadFromStream( Stream );
With Stream Do
Begin
Read( FFileNo, SizeOf( Integer ) );
Read( FPlottedUnits, SizeOf( Double ) );
Read( FDrawingUnits, SizeOf( Double ) );
Read( FPaperUnits, SizeOf( FPaperUnits ) );
Read( FPrintFrame, SizeOf( Boolean ) );
Read( FPresentation, sizeof( fPresentation ) );
Read( FProposedPrintArea, SizeOf( TEzRect ) );
Read( FCalculatedPrintArea, SizeOf( TEzRect ) );
Read( FPrintMode, sizeof( FPrintMode ) );
End;
// CalculateScales;
End;
Procedure TEzPreviewEntity.SaveToStream( Stream: TStream );
Begin
Inherited SaveToStream( Stream );
{ Save aditional properties }
With Stream Do
Begin
Write( FFileNo, SizeOf( Integer ) );
Write( FPlottedUnits, SizeOf( Double ) );
Write( FDrawingUnits, SizeOf( Double ) );
Write( FPaperUnits, SizeOf( FPaperUnits ) );
Write( FPrintFrame, SizeOf( Boolean ) );
Write( FPresentation, sizeof( FPresentation ) );
Write( FProposedPrintArea, SizeOf( TEzRect ) );
Write( FCalculatedPrintArea, SizeOf( TEzRect ) );
Write( FPrintMode, sizeof( FPrintMode ) );
End;
End;
function TEzPreviewEntity.GetControlPoints(TransfPts: Boolean; Grapher: TEzGrapher=Nil): TEzVector;
Var
TmpR: TEzRect;
Movept: TEzPoint;
Begin
Result := TEzVector.Create( 8 );
TmpR.Emin := FPoints[0];
TmpR.Emax := FPoints[1];
TmpR := ReorderRect2D( TmpR );
With Result Do
Begin
Add( TmpR.Emin ); // LOWER LEFT
AddPoint( ( TmpR.Emin.X + TmpR.Emax.X ) / 2, TmpR.Emin.Y ); // MIDDLE BOTTOM
AddPoint( TmpR.Emax.X, TmpR.Emin.Y ); // LOWER RIGHT
AddPoint( TmpR.Emax.X, ( TmpR.Emin.Y + TmpR.Emax.Y ) / 2 ); // MIDDLE RIGHT
Add( TmpR.Emax ); // UPPER RIGHT
AddPoint( ( TmpR.Emin.X + TmpR.Emax.X ) / 2, TmpR.Emax.Y ); // MIDDLE TOP
AddPoint( TmpR.Emin.X, TmpR.Emax.Y ); // UPPER LEFT
AddPoint( TmpR.Emin.X, ( TmpR.Emin.Y + TmpR.Emax.Y ) / 2 ); // MIDDLE LEFT
if TransfPts then
begin
// the move control point
MovePt.X := ( TmpR.Emin.X + TmpR.Emax.X ) / 2;
MovePt.Y := ( TmpR.Emin.Y + TmpR.Emax.Y ) / 2;
AddPoint( MovePt.X, MovePt.Y );
end;
End;
end;
function TEzPreviewEntity.GetControlPointType(Index: Integer): TEzControlPointType;
begin
If Index = 8 Then
Result := cptMove
Else
Result := cptNode;
end;
procedure TEzPreviewEntity.UpdateControlPoint(Index: Integer; const Value: TEzPoint; Grapher: TEzGrapher=Nil);
Var
TmpR: TEzRect;
Movept: TEzPoint;
M: TEzMatrix;
Begin
FPoints.DisableEvents := True;
Try
TmpR.Emin := FPoints[0];
TmpR.Emax := FPoints[1];
TmpR := ReorderRect2D( TmpR );
Case Index Of
0: // LOWER LEFT
Begin
TmpR.Emin := Value;
End;
1: // MIDDLE BOTTOM
Begin
TmpR.Emin.Y := Value.Y;
End;
2: // LOWER RIGHT
Begin
TmpR.Emax.X := Value.X;
TmpR.Emin.Y := Value.Y;
End;
3: // MIDDLE RIGHT
Begin
TmpR.Emax.X := Value.X;
End;
4: // UPPER RIGHT
Begin
TmpR.Emax := Value;
End;
5: // MIDDLE TOP
Begin
TmpR.Emax.Y := Value.Y;
End;
6: // UPPER LEFT
Begin
TmpR.Emin.X := Value.X;
TmpR.Emax.Y := Value.Y;
End;
7: // MIDDLE LEFT
Begin
TmpR.Emin.X := Value.X;
End;
8: // MOVE POINT
Begin
// calculate current move point
MovePt.X := ( TmpR.Emin.X + TmpR.Emax.X ) / 2;
MovePt.Y := ( TmpR.Emin.Y + TmpR.Emax.Y ) / 2;
M := Translate2d( Value.X - MovePt.X, Value.Y - MovePt.Y );
TmpR.Emin := TransformPoint2d( TmpR.Emin, M );
TmpR.Emax := TransformPoint2d( TmpR.Emax, M );
End;
End;
FPoints[0] := TmpR.Emin;
FPoints[1] := TmpR.Emax;
UpdateExtension;
Finally
FPoints.DisableEvents := false;
End;
end;
function TEzPreviewEntity.IsEqualTo(Entity: TEzEntity;
IncludeAttribs: Boolean = false ): Boolean;
begin
Result:= False;
if Not ( Entity.EntityID = idPreview ) Or
( Inherited IsEqualTo( Entity, IncludeAttribs ) = False )
{$IFDEF FALSE}Or
( IncludeAttribs And ( ( FFileNo <> TEzPreviewEntity(Entity).FFileNo ) Or
( FPlottedUnits <> TEzPreviewEntity(Entity).FPlottedUnits ) Or
( FDrawingUnits <> TEzPreviewEntity(Entity).FDrawingUnits ) Or
( FPaperUnits <> TEzPreviewEntity(Entity).FPaperUnits ) Or
( FPrintMode <> TEzPreviewEntity(Entity).FPrintMode ) Or
( FPresentation <> TEzPreviewEntity(Entity).FPresentation ) Or
( FPrintFrame <> TEzPreviewEntity(Entity).FPrintFrame ) Or
Not EqualRect2d( FProposedPrintArea, TEzPreviewEntity(Entity).FProposedPrintArea ) Or
( FPrintFrame <> TEzPreviewEntity(Entity).FPrintFrame ) ) ){$ENDIF} Then Exit;
Result:= True;
end;
{-------------------------------------------------------------------------------}
{ Implements TEzTableEntity }
{-------------------------------------------------------------------------------}
{ ----- TEzTitleItem ----- }
Constructor TEzTitleItem.Create( ColumnItem: TEzColumnItem );
Begin
Inherited Create;
FColumnItem := ColumnItem;
FColor := clWhite;
FFont.Name := EzSystem.DefaultFontName;
FFont.Height := 1;
FFont.Angle := 0;
End;
{ ----- TEzColumnItem ----- }
Constructor TEzColumnItem.Create( ColumnList: TEzColumnList );
Begin
Inherited Create;
FColumnList := ColumnList;
FStrings:= TStringSparseList.Create( SPASmall );
FTitle := TEzTitleItem.Create( self );
FTitle.Alignment := taCenter;
FColor := clWhite;
FFont.Name := EzSystem.DefaultFontName;
FFont.Height := 1;
Width:= 1;
End;
Destructor TEzColumnItem.Destroy;
Begin
FTitle.Free;
FStrings.Free;
Inherited Destroy;
End;
{ ----- TEzColumnList ----- }
Constructor TEzColumnList.Create( Table: TEzTableEntity );
Begin
Inherited Create;
FTable := Table;
FItems := TList.Create;
End;
Destructor TEzColumnList.Destroy;
Begin
Clear;
FItems.free;
Inherited Destroy;
End;
Function TEzColumnList.Add: TEzColumnItem;
Begin
Result := TEzColumnItem.Create( Self );
FItems.Add( Result );
End;
Procedure TEzColumnList.Clear;
Var
I: Integer;
Begin
For I := 0 To FItems.Count - 1 Do
TEzColumnItem( FItems[I] ).Free;
FItems.Clear;
End;
Procedure TEzColumnList.Delete( Index: Integer );
Begin
TEzColumnItem( FItems[Index] ).Free;
FItems.Delete( Index );
End;
Function TEzColumnList.GetCount: Integer;
Begin
Result := FItems.Count;
End;
Function TEzColumnList.GetItem( Index: Integer ): TEzColumnItem;
Begin
Result := FItems[Index];
End;
Procedure TEzColumnList.Assign( Source: TEzColumnList );
Var
I: Integer;
Begin
Clear;
For I := 0 To Source.Count - 1 Do
With Add Do
Begin
ColumnType:= Source[I].ColumnType;
Strings.Assign( Source[I].Strings );
Alignment := Source[I].Alignment;
Color := Source[I].Color;
Transparent := Source[I].Transparent;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -