2016-04-28 4 views
1
lesen

Ich möchte eine .dxf-Datei lesen. Ich verwende C# library zum Lesen. Es liest die Datei, aber es kann nicht alle Schichten schreiben..DXF/.DWG-Datei in C#

Ich möchte alle Liste von Layern daraus und schreibe es.

+0

Seine unklar tun, was „nicht schreiben alle Schichten "bedeutet. Haben Sie Probleme, die Layer zu finden, um sie auszugeben, oder haben Sie Probleme, sie zu schreiben? Und was schreibst du ihnen, ein anderes DXF? –

+0

ok @JoelLucsy m Clearing meine Anforderungen. Ich habe eine DXF-Datei einer Gebäudekarte und ich möchte lesen, wie viele Türen darin und jede Tür Eigenschaften wie (Breite und Höhe) und Abstand zwischen Türen etc. –

Antwort

1

Ich sehe dies library. Sie haben in public DXFTable layers alle Schichten. Lesen Sie die Dokumentation und sehen Sie sich die Struktur von DXFImport.cs an.

+0

Ich benutze diese Bibliothek @neiic. Aber es kann nicht alle Schichten wie (LWPOLYLINE) schreiben. und ich möchte Ebenen ex gruppieren (für Door = [Block: {ARC, LWPOLYLINE, LINIE, LINIE, LINIE, LWPOLYLINE, LINIE}]) –

+0

Nur um zu verdeutlichen, dass Ebenen nicht die gleichen wie LWPOLYLINE sind. LWPOLYLINE ist ein Entitätstyp. Sie versuchen, alle spezifischen Entitäten auf bestimmten Ebenen durch ihre Laute zu finden. Haben Sie Teigha für DWG von www.opendesign.com in Betracht gezogen? –

2

Sie benötigen dazu keine Bibliothek. DXF ist im ASCII-Format und Sie haben eine Textzeile pro DXF-Code, unmittelbar gefolgt von einem Wert.

Alle Objekte verweisen auf einen Layer mit dem DXF-Code 8, so dass Sie mit '^ 8 [\ r \ n] * ([_ a-zA-Z0-9 -] +) eine Regelsuche durchführen können. $ 'und den Namen bekommen. Diese Methode funktioniert mit partiellen DXF- und älteren R12 DXF-Dateien. Dadurch erhalten Sie auch die Schichten, die tatsächlich verwendet werden, wie wenn Sie die Zeichnung zuerst gelöscht haben.

Sie könnten auch den Layer Table-Header verwenden, um die Layernamen zu lesen. Es ist ein bisschen schwieriger, da Sie diesen Abschnitt finden müssen, aber auf dem gleichen Principal suchen Sie nach Code 0 - LAYER, dann gibt Ihnen der folgende Code 2 den Layernamen.

+0

FYI, DXF entweder Text oder binär basiert. In der Regel verwenden die Leute die textbasierte, weil sie lesbar ist, aber es ist möglich, sie in binärer Form auszugeben. –

+0

Sie haben Recht DXF kann binär sein, aber in diesem Fall ist es ein DXB-Format. Ich weiß, dass ich hier Text angenommen habe, seit es DXF erwähnt wurde. – cyrille

+0

Ich habe gelernt, niemals anzunehmen, dass eine Dateierweiterung den Inhalt einer Datei genau identifiziert. YMMV. –

0

Ich habe einige Codes geschrieben Punkte/Linien/Bogen des von allen ASCII DXF-Versionen zur Zeit mit dem gleichen Code zur Verfügung zu lesen
Sie mehr Objekte mehr Subroutinen mit dem richtigen Namen nur Bij hinzufügen Hinzufügen
(aussehen in der DXF).

Was es tut:

  1. Sie die die gesamte Datei senden Sie mit einem Lesegerät an diese Routine
  2. importiert haben Dann sucht es nach der Entities-Block (das ist, wo al die Geometrie gespeichert ist)
  3. Dann sucht es für das Objekt (Punkt/Linie/Bogen)
    (R12 bis R14 Verwendung POINT/LINE/ARC)
    (R2000 bis R2013 AcDbPoint/AcDbLine/AcDbArc oder AcDbCircle verwenden, wenn es um die Winkel enthält)
  4. Dann überprüft er für einen Layer-Namen
  5. Dann prüft sie, ob die variablen Codes gibt es
  6. Dann können Sie etwas mit den Daten

    private void ReadDxfFile (string DxfFile) 
    { 
        string Layer = ""; 
    
        string[] D = DxfFile.Split(new[] { Environment.NewLine }, StringSplitOptions.None); 
    
        int iEntities = 0; for(int i = 0; i < D.Length; i++) { if (D[i] == "ENTITIES") {iEntities = i; break; } } 
        for (int i = iEntities; i < D.Length; i++) 
        { 
         if (D[i] == "POINT" || D[i] == "AcDbPoint") 
         { 
          int iEntity = i; if (D[i].StartsWith("AcDb")) { for (iEntity = i; D[iEntity] != "AcDbEntity"; iEntity--) ; } 
          Layer = ""; for (int iLayer = iEntity; iLayer < i + 10 && Layer == ""; iLayer++) { if (D[iLayer] == " 8") { Layer = D[iLayer + 1]; }; } 
          for (int iWaarden = i; iWaarden < i + 8; iWaarden++) 
          { 
           if (D[iWaarden] == " 10" && D[iWaarden + 2] == " 20") 
           { 
            //Here you can store the following data in a list for later use 
            //LayerName = Layer 
            //X = D[iWaarden + 1] 
            //Y = D[iWaarden + 3] 
            //Z = D[iWaarden + 5] 
           } 
          } 
         } 
    
         if (D[i] == "LINE" || D[i] == "AcDbLine") 
         { 
          int iEntity = i; if (D[i].StartsWith("AcDb")) { for (iEntity = i; D[iEntity] != "AcDbEntity"; iEntity--) ; } 
          Layer = ""; for (int iLayer = iEntity; iLayer < i + 10 && Layer == ""; iLayer++) { if (D[iLayer] == " 8") { Layer = D[iLayer + 1]; }; } 
          for (int iWaarden = i; iWaarden < i + 10; iWaarden++) 
          { 
           if (D[iWaarden] == " 10" && D[iWaarden + 2] == " 20") 
           { 
            //Here you can store the following data in a list for later use 
            //LayerName = Layer 
            //Xbegin = D[iWaarden + 1] 
            //Ybegin = D[iWaarden + 3] 
            //Zbegin = D[iWaarden + 5] 
            //Xend = D[iWaarden + 7] 
            //Yend = D[iWaarden + 9] 
            //Zend = D[iWaarden + 11] 
           } 
          } 
         } 
    
         if (D[i] == "ARC" || D[i] == "AcDbArc" || D[i] == "AcDbCircle") 
         { 
          int iEntity = i; if (D[i].StartsWith("AcDb")) { for (iEntity = i; D[iEntity] != "AcDbEntity"; iEntity--) ; } 
          Layer = ""; for (int iLayer = iEntity; iLayer < i + 10 && Layer == ""; iLayer++) { if (D[iLayer] == " 8") { Layer = D[iLayer + 1]; }; } 
          for (int iWaarden = i; iWaarden < i + 10; iWaarden++) 
          { 
           if (D[iWaarden] == " 10" && D[iWaarden + 2] == " 20" && D[iWaarden + 10] == " 51") 
           { 
            //Here you can store the following data in a list for later use 
            //LayerName = Layer 
            //Xmid = D[iWaarden + 1] 
            //Ymid = D[iWaarden + 3] 
            //Zmid = D[iWaarden + 5] 
            //Radius = D[iWaarden + 7] 
            //StartAngle = D[iWaarden + 9] 
            //StartAngle = D[iWaarden + 11] 
           } 
           if (D[iWaarden] == " 10" && D[iWaarden + 2] == " 20" && D[iWaarden + 12] == " 51") 
           { 
            //Here you can store the following data in a list for later use 
            //LayerName = Layer 
            //Xmid = D[iWaarden + 1] 
            //Ymid = D[iWaarden + 3] 
            //Zmid = D[iWaarden + 5] 
            //Radius = D[iWaarden + 7] 
            //StartAngle = D[iWaarden + 11] 
            //StartAngle = D[iWaarden + 13] 
           } 
          } 
         } 
    
        } 
    }