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

📄 ezdgnlayer.pas

📁 很管用的GIS控件
💻 PAS
📖 第 1 页 / 共 5 页
字号:
Begin
  TDGNLayer( FLayer ).FHeader.UseAttachedDB := Value;
  SetModifiedStatus( FLayer );
End;

Function TDGNLayerInfo.GetVisible: boolean;
Begin
  result := TDGNLayer( FLayer ).FHeader.Visible;
End;

Procedure TDGNLayerInfo.SetVisible( Value: boolean );
Begin
  If TDGNLayer( FLayer ).FHeader.Visible = Value Then Exit;
  TDGNLayer( FLayer ).FHeader.Visible := Value;
  If Assigned( FLayer.Layers.GIS.OnVisibleLayerChange ) Then
    FLayer.Layers.GIS.OnVisibleLayerChange( Self, FLayer.Name );
  SetModifiedStatus( FLayer );
End;

Function TDGNLayerInfo.GetOverlappedTextAction: TEzOverlappedTextAction;
Begin
  result := TDGNLayer( FLayer ).FHeader.OverlappedTextAction;
End;

Procedure TDGNLayerInfo.SetOverlappedTextAction( Value: TEzOverlappedTextAction );
Begin
  If TDGNLayer( FLayer ).FHeader.OverlappedTextAction = Value Then Exit;
  TDGNLayer( FLayer ).FHeader.OverlappedTextAction := Value;
  SetModifiedStatus( FLayer );
End;

Function TDGNLayerInfo.GetOverlappedTextColor: TColor;
Begin
  result := TDGNLayer( FLayer ).FHeader.OverlappedTextColor;
End;

Procedure TDGNLayerInfo.SetOverlappedTextColor( Value: TColor );
Begin
  If TDGNLayer( FLayer ).FHeader.OverlappedTextColor = Value Then Exit;
  TDGNLayer( FLayer ).FHeader.OverlappedTextColor := Value;
  SetModifiedStatus( FLayer );
End;

Function TDGNLayerInfo.GetTextHasShadow: boolean;
Begin
  result := TDGNLayer( FLayer ).FHeader.TextHasShadow;
End;

Procedure TDGNLayerInfo.SetTextHasShadow( Value: boolean );
Begin
  If TDGNLayer( FLayer ).FHeader.TextHasShadow = Value Then Exit;
  TDGNLayer( FLayer ).FHeader.TextHasShadow := Value;
  SetModifiedStatus( FLayer );
End;

Function TDGNLayerInfo.GetTextFixedSize: Byte;
Begin
  result := TDGNLayer( FLayer ).FHeader.TextFixedSize;
End;

Procedure TDGNLayerInfo.SetTextFixedSize( Value: Byte );
Begin
  If TDGNLayer( FLayer ).FHeader.TextFixedSize = Value Then Exit;
  TDGNLayer( FLayer ).FHeader.TextFixedSize := Value;
  SetModifiedStatus( FLayer );
End;

Function TDGNLayerInfo.GetSelectable: boolean;
Begin
  result := TDGNLayer( FLayer ).FHeader.Selectable;
End;

Procedure TDGNLayerInfo.SetSelectable( Value: boolean );
Begin
  If TDGNLayer( FLayer ).FHeader.Selectable = Value Then Exit;
  TDGNLayer( FLayer ).FHeader.Selectable := Value;
  If Assigned( FLayer.Layers.GIS.OnSelectableLayerChange ) Then
    FLayer.Layers.GIS.OnSelectableLayerChange( Self, FLayer.Name );
  SetModifiedStatus( FLayer );
End;

Function TDGNLayerInfo.GetExtension: TEzRect;
Begin
  result := TDGNLayer( FLayer ).FHeader.Extension;
End;

Procedure TDGNLayerInfo.SetExtension( Const Value: TEzRect );
Begin
  If EqualRect2D( Value, TDGNLayer( FLayer ).FHeader.Extension ) Then Exit;
  TDGNLayer( FLayer ).FHeader.Extension := Value;
  SetModifiedStatus( FLayer );
End;

Function TDGNLayerInfo.GetIDCounter: integer;
Begin
  result := TDGNLayer( FLayer ).FHeader.IDCounter;
End;

Procedure TDGNLayerInfo.SetIDCounter( Value: integer );
Begin
  If TDGNLayer( FLayer ).FHeader.IDCounter = Value Then Exit;
  TDGNLayer( FLayer ).FHeader.IDCounter := Value;
  SetModifiedStatus( FLayer );
End;

Function TDGNLayerInfo.GetIsAnimationLayer: boolean;
Begin
  result := TDGNLayer( FLayer ).FHeader.IsAnimationLayer;
End;

Procedure TDGNLayerInfo.SetIsAnimationLayer( Value: boolean );
Begin
  If TDGNLayer( FLayer ).FHeader.IsAnimationLayer = Value Then Exit;
  TDGNLayer( FLayer ).FHeader.IsAnimationLayer := Value;
  SetModifiedStatus( FLayer );
End;

Function TDGNLayerInfo.GetCoordSystem: TEzCoordSystem;
Begin
  result := TDGNLayer( FLayer ).FHeader.CoordSystem;
End;

Procedure TDGNLayerInfo.SetCoordSystem( Value: TEzCoordSystem );
Begin
  If TDGNLayer( FLayer ).FHeader.CoordSystem = Value Then Exit;
  With TDGNLayer( FLayer ) Do
  Begin
    FHeader.CoordSystem := Value;
    If Value = csLatLon Then
    Begin
      CoordMultiplier := DEG_MULTIPLIER;
      FHeader.coordsunits := cuDeg;
    End
    Else
      CoordMultiplier := 1;
  End;
  SetModifiedStatus( FLayer );
End;

Function TDGNLayerInfo.GetCoordsUnits: TEzCoordsUnits;
Begin
  result := TDGNLayer( FLayer ).FHeader.CoordsUnits;
End;

Procedure TDGNLayerInfo.SetCoordsUnits( Value: TEzCoordsUnits );
Begin
  With TDGNLayer( FLayer ) Do
  Begin
    If FHeader.coordsunits = value Then Exit;

    If FHeader.CoordSystem = csLatLon Then
      FHeader.CoordsUnits := cuDeg
    Else
      FHeader.CoordsUnits := Value;
  End;
  SetModifiedStatus( FLayer );
End;

Function TDGNLayerInfo.GetIsIndexed: boolean;
Begin
  With TDGNLayer( FLayer ) Do
    result := FHeader.IsIndexed And ( Frt <> Nil );
End;

Procedure TDGNLayerInfo.SetIsIndexed( Value: boolean );
Begin
  If TDGNLayer( FLayer ).FHeader.IsIndexed = Value Then Exit;
  TDGNLayer( FLayer ).FHeader.IsIndexed := Value;
  SetModifiedStatus( FLayer );
End;

{-------------------------------------------------------------------------------}
{                  TDGNLayer - class implementation                            }
{-------------------------------------------------------------------------------}

Constructor TDGNLayer.Create( Layers: TEzBaseLayers; Const AFileName: String );
Begin
  Inherited Create( Layers, AFileName );
  FLayerInfo := TDGNLayerInfo.Create( Self );
  FUpdateRtree := True;

  Self.FileName := ChangeFileExt( AFileName, '' );
  Self.Name := ExtractFileName( AFileName );
  With FHeader Do
  Begin
    HeaderID := 8003;
    VersionNumber := LAYER_VERSION_NUMBER;
    IDCounter := 0;
    Extension := INVALID_EXTENSION;
    Visible := True;
    Selectable := True;
    FillChar( Reserved, SizeOf( Reserved ), 0 );
  End;
  CoordMultiplier := 1;
End;

Destructor TDGNLayer.Destroy;
Begin
  Close;
  If ol <> Nil Then ol.free;
  // FLayerInfo is destroyed in the inherited class
  If Assigned( FDGNFile ) then
    FreeAndNil( FDGNFile );
  Inherited Destroy;
End;

Function TDGNLayer.GetDGNFile: TEzDGNFile;
Begin
  If FDGNFile = Nil then FDGNFile := TEzDGNFile.Create;
  Result:= FDGNFile ;
End;

Procedure TDGNLayer.InitializeOnCreate( Const FileName: String;
  AttachedDB, IsAnimation: Boolean; CoordSystem: TEzCoordSystem;
  CoordsUnits: TEzCoordsUnits; FieldList: TStrings );
Begin
  // for now, .shp files will not be created with this method
End;

function TDGNLayer.GetBookmark: Pointer;
var
  I: Integer;
  bmrk: TEzDGNBookmark;
begin
  bmrk:= TEzDGNBookmark.Create;
  bmrk.FRecno:= FRecno;
  bmrk.FFiltered:= FFiltered;
  bmrk.FEofCrack:= FEofCrack;
  bmrk.FFilterRecno:= FFilterRecno;
  if (ol <> nil) and (ol.Count > 0) then
  begin
    bmrk.Fol.Capacity:= ol.Count;
    for I:= 0 to ol.Count-1 do
      bmrk.Fol.Add( ol[I] );
  end;
  Result:= bmrk;
end;

procedure TDGNLayer.GotoBookmark(Bookmark: Pointer);
var
  I: Integer;
  bmrk: TEzDGNBookmark;
begin
  bmrk:= TEzDGNBookmark(Bookmark);
  FRecno:= bmrk.FRecno;
  FFiltered:= bmrk.FFiltered;
  FEofCrack:= bmrk.FEofCrack;
  FFilterRecno:= bmrk.FFilterRecno;
  if bmrk.Fol.Count > 0 then
  begin
    if ol = nil then ol := TIntegerList.Create;
    ol.Clear;
    ol.Capacity:= bmrk.Fol.Count;
    for I:= 0 to bmrk.Fol.Count-1 do
      ol.Add( bmrk.Fol[I] );
  end else if ol <> nil then
    ol.Clear;
end;

procedure TDGNLayer.FreeBookmark(Bookmark: Pointer);
begin
  TEzDGNBookmark(Bookmark).Free;
end;

Procedure TDGNLayer.GetFieldList( Strings: TStrings );
Var
  i: Integer;
Begin
  If DBTable <> Nil Then
    For i := 1 To DBTable.FieldCount Do
      Strings.Add( Format( '%s;%s;%d;%d', [DBTable.Field( I ), DBTable.FieldType( I ),
        DBTable.FieldLen( I ), DBTable.FieldDec( I )] ) );
End;

Procedure TDGNLayer.StartBatchInsert;
Begin
  FUpdateRtree := False;
End;

Procedure TDGNLayer.FinishBatchInsert;
Begin
  FUpdateRtree := True;
  RebuildTree;
End;

Procedure TDGNLayer.Zap;
Begin
  // nothing to do here
End;

Function TDGNLayer.GetDBTable: TEzBaseTable;
Begin
  Result := FDBTable;
End;

Function TDGNLayer.GetRecno: Integer;
Begin
  If FFiltered Then
    Result := Longint( ol[FFilterRecno] )
  Else
    Result := FRecno;
End;

Procedure TDGNLayer.SetRecno( Value: Integer );
Begin
  If ( Value < 1 ) Or ( Value > FHeader.RecordCount ) Then
    EzGISError( SRecnoInvalid );
  FRecno := Value;
End;

Function TDGNLayer.SendEntityToBack( ARecno: Integer ): Integer;
Begin
  Result := 0;
  // nothing to do here
End;

Function TDGNLayer.BringEntityToFront( ARecno: Integer ): Integer;
Begin
  Result := 0;
  // nothing to do here
End;

Procedure TDGNLayer.SetGraphicFilter( s: TSearchType; Const VisualWindow: TEzRect );
Var
  treeBBox, viewBBox: TRect_rt;
Begin
  FFiltered := False;
  If Not FHeader.IsIndexed Then Exit;

  If ol = Nil Then
    ol := TIntegerList.Create
  Else
    ol.clear;
  treeBBox := Frt.RootExtent;
  viewBBox := FloatRect2Rect( VisualWindow );
  If Contains_rect( viewBBox, treeBBox ) Then
  Begin
    FreeAndNil( ol );
    Exit;
  End;
  Frt.Search( S, viewBBox, ol, DGNFile.RecordCount );
  //SortList(ol);
  FFiltered := True;
  FFilterRecno := -1;
End;

Procedure TDGNLayer.CancelFilter;
Begin
  If ol <> Nil Then FreeAndNil( ol );
  FFiltered := False;
End;

Function TDGNLayer.Eof: Boolean;
Begin
  result := FEofCrack;
End;

Procedure TDGNLayer.First;
Begin
  If FFiltered Then
  Begin
    If ol.Count > 0 Then
    Begin
      FFilterRecno := 0;
      FEofCrack := False;
    End
    Else
    Begin
      FEofCrack := True;
    End
  End
  Else If DGNFile.RecordCount > 0 Then
  Begin
    FRecno := 1;
    FEofCrack := False;
  End
  Else
  Begin
    FEofCrack := True;
  End;
End;

Procedure TDGNLayer.Next;
Var
  N: Integer;
Begin
  If FFiltered Then
  Begin
    N := ol.count;
    If N > 0 Then
    Begin
      If FFilterRecno < N - 1 Then
      Begin
        Inc( FFilterRecno );
        FEofCrack := False;
      End
      Else
      Begin
        FFilterRecno := N - 1;
        FEofCrack := True;
      End;
    End
    Else
    Begin
      FEofCrack := True;
    End
  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -