📄 ezdgnimport.pas
字号:
SrcLayer.Next;
end;
finally
Layer.FinishBatchInsert;
end;
Layer.Modified := true;
end;
end else
begin
{ Exists a layer with that name already ? }
temps := ezsystem.GetValidLayerName( ExtractFileName( FileWithoutExt ) );
Index := DrawBox.GIS.Layers.IndexOfName( temps );
If Index >= 0 Then
Begin
If MessageDlg( Format( SLayerAlreadyExists, [temps] ), mtConfirmation, [mbYes, mbNo], 0 ) = mrYes Then
// replace existing layer
With DrawBox.GIS Do
Begin
Layer := Layers[Index];
wasActive := AnsiCompareText( MapInfo.CurrentLayer, Layer.Name ) = 0;
Layers.Delete( Layer.Name, true );
If wasActive And ( Layers.Count > 0 ) Then
MapInfo.CurrentLayer := Layers[0].Name;
If Layers.Count = 0 Then
With MapInfo Do
Begin
Extension := INVALID_EXTENSION;
CurrentLayer := '';
End;
//Layer.LayerInfo.CoordsUnits := MapInfo.CoordsUnits;
End
Else
Exit;
End;
FieldList := TStringList.Create;
Try
FieldList.Add( 'UID;N;12;0' );
FieldList.Add( 'ELE_TYPE;N;2;0' );
FieldList.Add( 'ELE_STR;C;20;0' );
FieldList.Add( 'DIMENSION;N;1;0' );
FieldList.Add( 'Z;N;20;4' );
Layer := DrawBox.GIS.Layers.CreateNewEx( ExtractFilePath( DrawBox.GIS.FileName ) +
temps, DestCoordSystem, DestCoordsUnits, FieldList );
Finally
FieldList.Free;
End;
If Layer = Nil Then
Begin
MessageToUser( SCannotCreateNewLayer, SMsgError, MB_ICONERROR );
Exit;
End;
DataIndex:= -1;
Layer.ForceOpened;
Layer.StartBatchInsert;
try
For LIndex:= 0 to FCad.Layers.Count-1 do
begin
SrcLayer:= FCad.Layers[LIndex];
If Not SrcLayer.LayerInfo.Visible then Continue;
SrcLayer.First;
While Not SrcLayer.Eof do
begin
Inc(CurrCnt);
FOnFileProgress( Self, FFilename,
Round( ( ( CurrCnt + 1 ) / ImportCnt ) * 100 ), CurrCnt, 0,
CanContinue );
If Not CanContinue Then Break;
TmpEntity:= SrcLayer.RecLoadEntity;
try
{ convert from source coordinate system }
{TmpEntity.BeginUpdate;
For J := 0 To TmpEntity.Points.Count - 1 Do
TmpEntity.Points[J] := FConverter.Convert( TmpEntity.Points[J] );
TmpEntity.EndUpdate; }
TheRecno:= Layer.AddEntity( TmpEntity );
If Layer.DBTable <> Nil Then
Begin
Inc( DataIndex );
with Layer.DBTable do
begin
Recno:= TheRecno;
BeginTrans;
Edit;
IntegerPut( 'ELE_TYPE', FCol0[DataIndex] );
StringPut( 'ELE_STR', Copy(FCol1[DataIndex],1,20) );
IntegerPut( 'DIMENSION', FCol2[DataIndex] );
FloatPut( 'Z', FCol2[DataIndex] );
Post;
EndTrans;
end;
End;
finally
TmpEntity.Free;
end;
SrcLayer.Next;
end;
end;
finally
Layer.FinishBatchInsert;
end;
Layer.Modified := true;
End;
{ sort by name }
If FGenerateMultiLayers then
DrawBox.GIS.Layers.Sort;
{With DrawBox.GIS.MapInfo Do
Begin
emax := FConverter.Convert( emax );
emin := FConverter.Convert( emin );
If PrevLayerCount = 0 Then
Begin
rtemp.Emax := emax;
rtemp.Emin := emin;
Extension := rtemp;
End
Else
Begin
rtemp := Extension;
MaxBound( rtemp.Emax, emax );
MinBound( rtemp.Emin, emin );
Extension := rtemp;
End;
End; }
finally
Screen.Cursor:= crDefault;
end;
DrawBox.GIS.QuickUpdateExtension;
If PrevLayerCount = 0 Then
With DrawBox.GIS Do
For I := 0 To DrawBoxList.Count - 1 Do
DrawBoxList[I].ZoomToExtension;
End;
Procedure TEzDGNImport.ConvertPoint(Sender: TObject; Var P: TEzPoint );
Begin
P:= FConverter.Convert( P ) ;
End;
Function TEzDGNImport.ReadDGN: Boolean;
Var
element_Type: Integer;
element_level: Integer;
_3Dz: Double;
PlanOfEle: integer;
element_str: String;
TmpEntity: TEzEntity;
Layer: TEzBaseLayer;
i: integer;
OldCursor: TCursor;
PrevLayerCount: Integer;
Begin
Assert( (FDrawBox <> Nil) And (FDrawBox.GIS <> Nil) And ( FConverter <> Nil ) );
Result := False;
If Not FileExists( FFileName ) Then
Begin
MessageToUser( Format( SShpFileNotFound, [FFileName] ), smsgerror, MB_ICONERROR );
Exit;
End;
{ configure the projection for this source file }
PrevLayerCount := FDrawBox.GIS.Layers.Count ;
If PrevLayerCount > 0 Then
begin
With FDrawBox.GIS, FConverter Do
Begin
FConverter.DestinCoordSystem := MapInfo.CoordSystem;
FConverter.DestinProjector.Params.Assign( ProjectionParams );
End;
end;
If FConfirmProjectionSystem And
Not FConverter.EditProjections( PrevLayerCount = 0 ) Then Exit;
Application.ProcessMessages;
FDGNFile.Close;
FDGNFile.FileName := FFileName;
FDGNFile.UseDefaultColorTable:= FUseDefaultColorTable;
FDGNFile.UseTrueType:= Self.FUseTrueType;
{ assign the converter event for converting points from one coord system to another}
FDGNFile.OnConvertPoint := Self.ConvertPoint;
//Canceled := False;
FCAD.UpdateExtension;
FTargetNames.Clear;
OldCursor:= Screen.Cursor;
Screen.Cursor:= crHourglass;
Try
{ open file and read offsets for every element }
FDGNFile.Open;
For I:= 0 to FDGNFile.RecordCount-1 do
begin
TmpEntity:= FDGNFile.GetElement(I, element_type, element_level, PlanOfEle,
element_str, _3Dz ) ;
If TmpEntity = Nil then Continue;
Try
Layer:= FCad.Layers.LayerByName( Format('A%.2d', [element_level] ) );
if Layer = Nil then
begin
Layer := FCad.Layers.CreateNew( Format('A%.2d', [element_level] ) );
FTargetNames.Add( Layer.Name );
end;
Layer.AddEntity( TmpEntity );
FCol0.Add( element_type );
FCol1.Add( element_str );
FCol2.Add( PlanOfEle );
FCol3.Add( _3Dz );
Finally
TmpEntity.Free;
End;
end;
Finally
Screen.Cursor:= OldCursor;
End;
If FCad.Layers.Count > 0 then
FCad.MapInfo.CurrentLayer := FCad.Layers[0].Name;
Result := True;
End;
Function TEzDGNImport.ImportFiles( FileList: TStrings ): Boolean;
Var
I: Integer;
TmpFilename: String;
TmpBool: Boolean;
Begin
result := false;
TmpBool := FConfirmProjectionSystem;
TmpFilename := FFileName;
Try
For I := 0 To FileList.Count - 1 Do
Begin
FFileName := FileList[I];
Execute;
FConfirmProjectionSystem := false;
End;
Finally
FFileName := TmpFilename;
FConfirmProjectionSystem := TmpBool;
End;
End;
Procedure TEzDGNImport.SetConverter( Value: TEzImportConverter );
Begin
If ( FConverter <> Nil ) And FMustDeleteConverter Then
FreeAndNil( FConverter );
FConverter := Value;
FMustDeleteConverter := False;
End;
function TEzDGNImport.GetAbout: TEzAbout;
begin
Result:= SEz_GisVersion;
end;
procedure TEzDGNImport.SetAbout(const Value: TEzAbout);
begin
end;
End.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -