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

📄 ezbasicctrls.pas

📁 很管用的GIS控件
💻 PAS
📖 第 1 页 / 共 5 页
字号:
    End
    Else
    Begin
      FEofCrack := True;
    End
  End
  Else
  Begin
    If FEntities.Count > 0 Then
    Begin
      FRecno := 1;
      FEofCrack := False;
    End
    Else
    Begin
      FEofCrack := True;
    End;
  End;
End;

Procedure TEzMemoryLayer.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
  End
  Else
  Begin
    N := FEntities.Count;
    If N > 0 Then
    Begin
      If FRecno < N Then
      Begin
        Inc( FRecno );
        FEofCrack := False;
      End
      Else
      Begin
        FRecno := N;
        FEofCrack := True;
      End;
    End
    Else
    Begin
      FEofCrack := True;
    End;
  End;
End;

Procedure TEzMemoryLayer.Last;
Var
  N: Integer;
Begin
  If FFiltered Then
  Begin
    N := ol.count;
    If N > 0 Then
    Begin
      FFilterRecno := N - 1;
      FEofCrack := False;
    End
    Else
    Begin
      FEofCrack := True;
    End;
  End
  Else
  Begin
    N := FEntities.Count;
    If N > 0 Then
    Begin
      FRecno := N;
      FEofCrack := False;
    End
    Else
    Begin
      FEofCrack := True;
    End;
  End;
End;

Procedure TEzMemoryLayer.StartBuffering;
Begin
End;

Procedure TEzMemoryLayer.EndBuffering;
Begin
End;

Procedure TEzMemoryLayer.Assign( Source: TEzBaseLayer );
Var
  TmpID: Integer;
Begin
  If Not ( Source Is TEzMemoryLayer ) Then Exit;

  TmpID := FHeader.IDCounter;
  FHeader := TEzMemoryLayer( Source ).FHeader;
  FHeader.IDCounter := TmpID;
End;

Procedure TEzMemoryLayer.RebuildTree;
Var
  I, RecCount: Integer;
  GIS: TEzBaseGIS;
  Mode: Word;
Begin
  GIS := Layers.GIS;
  If GIS.ReadOnly Then Exit;

  ForceOpened;
  RecCount := FEntities.Count;
  Mode := GIS.OpenMode;

  If Frt <> Nil Then
    FreeAndNil( Frt );

  Frt := TMemRTree.Create( Self, RTYPE, Mode );
  Frt.CreateIndex( FileName, CoordMultiplier );

  For I := 1 To RecCount Do
  Begin
    If IsDeleted( I ) Then
      Continue;

    Frt.Insert( FloatRect2Rect( TEzEntity( FEntities[I - 1] ).FBox ), I );
  End;
  If Not FHeader.Visible Then Frt.Close;
End;

Procedure TEzMemoryLayer.WriteHeaders( FlushFiles: Boolean );
Begin
  // nothing to do here
End;

Procedure TEzMemoryLayer.Open;
Begin
  Close;
  If Not FHeader.Visible Then Exit;
  If Frt <> Nil Then
    FreeAndNil( Frt );
  Frt := TMemRTree.Create( Self, RTYPE, fmCreate );
  Frt.CreateIndex( '', CoordMultiplier );
  FIsOpened := True;
End;

Procedure TEzMemoryLayer.Close;
Var
  I: Integer;
Begin
  If Not FIsOpened Then Exit;

  For I := 0 To FEntities.Count - 1 Do
    TEzEntity( FEntities[I] ).Free;
  FEntities.Clear;
  If Frt <> Nil Then
    FreeAndNil( Frt );
  FDelStatus.Free;
  FDelStatus := TBits.Create;

  FIsOpened := False;
End;

Procedure TEzMemoryLayer.LoadFromFile;
Var
  Stream: TStream;
  AFileName: String;
Begin
  AFileName := FileName + CADEXT;

  If Not FIsOpened Or Not FileExists( AFileName ) Then Exit;
  Stream := TFileStream.Create( AFileName, Layers.GIS.OpenMode );
  Try
    LoadFromStream( Stream );
  Finally
    Stream.Free;
  End;
End;

Procedure TEzMemoryLayer.SaveToFile;
Var
  Stream: TStream;
Begin
  If Not FIsOpened Or Layers.GIS.ReadOnly Or Not Modified Or LayerInfo.Locked Then
  Begin
    Modified := False;
    Exit;
  End;
  Stream := TFileStream.Create( FileName + CADEXT, fmCreate );
  Try
    SaveToStream( Stream );
  Finally
    Stream.Free;
  End;
End;

Procedure TEzMemoryLayer.LoadFromStream( Stream: TStream );
Var
  I: Integer;
  Ent: TEzEntity;
  EntityID: TEzEntityID;
Begin
  With Stream Do
  Begin
    If Frt <> Nil Then
      FreeAndNil( Frt );
    Frt := TMemRTree.Create( Self, RTYPE, fmCreate );
    Frt.CreateIndex( '', CoordMultiplier );
    FDelStatus.Free;
    FDelStatus := TBits.Create;

    Read( FHeader, SizeOf( TEzLayerHeader ) );
    If FHeader.RecordCount > 0 Then
      Layers.GIS.StartProgress( Format( SLoadingCAD, [Self.Name] ), 1, FHeader.RecordCount );
    For I := 1 To FHeader.RecordCount Do
    Begin
      Layers.GIS.UpdateProgress( I );
      Read( EntityID, sizeof( TEzEntityID ) );
      Ent := GetClassFromID( EntityID ).Create( 4 );
      Ent.LoadFromStream( Stream );
      If EqualRect2D( Ent.FBox, INVALID_EXTENSION) Then
      begin
        Ent.Free;
        Continue;
      end;
      { add this entity }
      FEntities.Add( Ent );
      Frt.Insert( FloatRect2Rect( Ent.FBox ), I );
    End;
    If FHeader.RecordCount > 0 Then
      Layers.GIS.EndProgress;
  End;
End;

Procedure TEzMemoryLayer.SaveToStream( Stream: TStream );
Var
  I, n: Integer;
  Ent: TEzEntity;
  EntityID: TEzEntityID;
Begin
  //If LayerInfo.Locked then Exit;
  With Stream Do
  Begin
    { count effective entities }
    n := 0;
    For I := 1 To FEntities.Count Do
      If Not IsDeleted( I ) Then
        Inc( n );
    If FEntities.Count > 0 Then
      Layers.GIS.StartProgress( Format( SSavingCAD, [Self.Name] ), 1, FEntities.Count );
    Try
      FHeader.RecordCount := n;
      Write( FHeader, SizeOf( FHeader ) );
      FHeader.RecordCount := FEntities.Count;
      For I := 1 To FEntities.Count Do
      Begin
        Layers.GIS.UpdateProgress( I );
        If IsDeleted( I ) Then Continue;

        Ent := TEzEntity( FEntities[I - 1] );
        EntityID := Ent.EntityID;
        Write( EntityID, sizeof( TEzEntityID ) );
        Ent.SaveToStream( Stream );
      End;
    Finally
      If FEntities.Count > 0 Then
        Layers.GIS.EndProgress;
    End;
  End;
End;

Procedure TEzMemoryLayer.ForceOpened;
Begin
  If FIsOpened Then Exit;
  Open;
End;

Procedure TEzMemoryLayer.UpdateMapExtension( Const R: TEzRect );
Var
  MapExt: TEzRect;
Begin
  { new map extension }
  With Layers.GIS Do
  Begin
    MapExt := MapInfo.Extension;
    MaxBound( MapExt.Emax, R.Emax );
    MinBound( MapExt.Emin, R.Emin );
    MapInfo.Extension := MapExt;
    Modified := True;
  End;
End;

Function TEzMemoryLayer.AddEntity( Entity: TEzEntity ): Integer;
Var
  ent: TEzEntity;
  Extents: TEzRect;
Begin
  result := 0;
  ForceOpened;

  If Layers.GIS.ReadOnly Or LayerInfo.Locked Then Exit;

  NormalizePolygon( Entity );

  Extents := Entity.FBox;
  With FHeader.Extension Do
  Begin
    MaxBound( Emax, Extents.Emax );
    MinBound( Emin, Extents.Emin );
  End;

  Inc( FHeader.IDCounter );
  Entity.ID := FHeader.IDCounter;
  { Add the entity }
  ent := InternalCopyEntity( Entity );
  FEntities.Add( ent );
  result := FEntities.Count;
  FHeader.RecordCount := result;
  If Frt <> Nil Then
    Frt.Insert( FloatRect2Rect( ent.FBox ), FHeader.RecordCount );
  UpdateMapExtension( Extents );
  Modified := True;
End;

Procedure TEzMemoryLayer.DeleteEntity( RecNo: Integer );
Var
  bbox: TEzRect;
Begin

  If Layers.GIS.ReadOnly Or ( Recno < 1 ) Or LayerInfo.Locked Or
    ( Recno > FEntities.Count ) Or IsDeleted( Recno ) Then Exit;

  bbox := TEzEntity( FEntities[Recno - 1] ).FBox;
  If Frt <> Nil Then
    Frt.Delete( FloatRect2Rect( bbox ), Recno );
  FHeader.RecordCount := FEntities.Count;
  FDelStatus[Recno] := True;
  //Layers.GIS.UpdateExtension;
  Modified := True;
End;

Procedure TEzMemoryLayer.UndeleteEntity( RecNo: Integer );
Var
  bbox: TEzRect;
Begin
  If Not IsDeleted( Recno ) Or LayerInfo.Locked Then Exit;
  bbox := TEzEntity( FEntities[Recno - 1] ).FBox;
  Frt.Insert( FloatRect2Rect( bbox ), Recno );
  FDelStatus[Recno] := False;
  Modified := True;
End;

Function TEzMemoryLayer.IsDeleted( Recno: Integer ): Boolean;
Begin
  Result := True;
  If ( Recno < 1 ) Or ( Recno > FEntities.Count ) Then Exit;
  If RecNo <= FDelStatus.Size - 1 Then
    result := FDelStatus[Recno]
  Else
    result := False;
End;

Function TEzMemoryLayer.QuickUpdateExtension: TEzRect;
begin
  UpdateExtension;
end;

Function TEzMemoryLayer.UpdateExtension: TEzRect;
Var
  cnt, RecCount: Integer;
  Entity: TEzEntity;
  Extents: TEzRect;
Begin
  If Layers.GIS.ReadOnly Then Exit;
  Result := INVALID_EXTENSION;
  Try
    RecCount := FEntities.Count;
    For cnt := 1 To RecCount Do
    Begin
      If IsDeleted( cnt ) Then Continue;

      Entity := TEzEntity( FEntities[cnt - 1] );
      If Entity.EntityID = idNone Then Continue;

      Extents := Entity.FBox;
      MaxBound( Result.Emax, Extents.Emax );
      MinBound( Result.Emin, Extents.Emin );
    End;
  Finally

⌨️ 快捷键说明

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