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

📄 ezdgnimport.pas

📁 很管用的GIS控件
💻 PAS
📖 第 1 页 / 共 2 页
字号:

            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 + -