2016-04-28 19 views
1

.dxfファイルを読んでみたい。私はC#ライブラリを使用して読み込みます。ファイルを読み込みますが、すべてのレイヤーを書き込むことはできません。Cで書かれた.DXF/.DWGファイル#

私はそれから層のすべてのリストを取得し、それを書きたいと思います。

+0

その不明瞭なものを「書くことはできませんすべての層 "は意味する。あなたがそれらを書き出すためにレイヤーを見つけるのに問題があるのか​​、それを書き留める際に問題がありますか?そして、あなたは何を他のdxfに書いていますか? –

+0

ok @JoelLucsy m自分の要件をクリアしています。私は建物の地図のdxfファイルを持っていて、その中のいくつのドアとドアのプロパティ(幅と高さ)とドア間の​​距離などを読みたいです。 –

答えて

1

私はこれを見ますlibrary。すべてのレイヤーがpublic DXFTable layersです。 DXFImport.csのドキュメントと構造を参照してください

+0

私はこのライブラリを@neiiic使っています。しかし、(LWPOLYLINE)のようにすべてのレイヤーを書き込むことはできません。レイヤーをグループ化したい(Door = [ブロック:{ARC、LWLINE、LINE、LINE、LWPOLYLINE、LINE})) –

+0

レイヤーがLWPOLYLINEと同じではないことを明確にする。 LWPOLYLINEはエンティティタイプです。特定のレイヤーのすべての特定のエンティティをそのサウンドで検索しようとしています。 www.opendesign.comからDWG用のTeighaを検討しましたか? –

2

あなたは本当にこれのためのライブラリを必要としません。 DXFはASCII形式で、DXFコードごとに1行のテキストがあり、その直後に値があります。

すべてのエンティティがDXFコード8を使用してレイヤを参照しているため、 '^ 8 [\ r \ n] *([_ a-zA-Z0-9 - ] +) $ 'と名前を取得します。このメソッドは、部分的なDXFファイルと古いR12 DXFファイルで機能します。それはまた、あなたが最初に図面をパージした場合のように、実際に使用されているレイヤーを提供します。

レイヤーテーブルのヘッダーを使用してレイヤー名を読み取ることもできます。あなたはそのセクションを見つける必要があるので少し難しいですが、同じプリンシパルでコード0 - レイヤーを検索すると、次のコード2がレイヤー名を表示します。あなたはより多くのオブジェクトを追加することができます

+0

FYI、DXFはテキストベースまたはバイナリベースです。通常、人々はテキストベースのものを読みやすいのでバイナリで出力することができます。 –

+0

あなたは正しいです。DXFはバイナリですが、この場合はDXB形式です。私はそれがDXFに言及されて以来、私はここにテキストを仮定していたと知っています – cyrille

+0

私は、ファイル拡張子がファイルの内容を正確に特定するとは決して考えないことを学びました。 YMMV。 –

0

私は
同じコードで、現時点で利用可能なすべてのASCII DXFのバージョンからのポイント/ライン/円弧のを読むためにいくつかのコードを書いているだけで、正しい名前
でより多くのサブルーチンを追加BIJ(ルックDXFの中に)。それは何

:あなたはこのルーチン

  • にリーダーで読み込んだファイル全体がその後、エンティティを検索お送り

    1. は(アルジオメトリが格納されている場所です)ブロック
    2. は、その後、それはオブジェクト(ポイント/ライン/円弧)
      (R12 R14までの使用POINT/LINE/ARC)
      (R2000それは角度が含まれている場合R2013はAcDbPoint/AcDbLine/AcDbArcまたはAcDbCircleを使うまで)
    3. を検索します
    4. そして、それはレイヤ名
    5. をチェックすると、変数のコードが
    6. にあるなら、あなたはデータで何かを行うことができますチェック

      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] 
             } 
            } 
           } 
      
          } 
      } 
      
  • 関連する問題