⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ezmiscelentities.pas

📁 很管用的GIS控件
💻 PAS
📖 第 1 页 / 共 5 页
字号:
  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 + -