📄 ezbasicctrls.pas
字号:
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 + -