質問
.DXFファイル(AutoCADなどで使用される)を読み取るためのソースコードを(C#などで)知っている人はいますか?コードでない場合、さまざまなコード(要素/ブロック/など)とその意味を示す表?
私は自分で読者を書いており、フォーマットについて詳しく説明した枯れ木文書を持っていますが、 255 ACIの各色からRGBへのコンバーター...ありがとう!
解決
Cadlib を使用して、いくつかのプロジェクトで良い結果を得ています。
他のヒント
私は独自の JavaでのDXf-Viewerの開発に数年携わっています(ビューアーに独自のDXFファイルまたはURLをドロップできます)。
AutoCADから公開された情報は適切なベースですが、その仕組みについては説明していません。
Open Design Allianceは、いくつかのCAD形式をDXFに変換する可能性を提供します。商用製品を開発している場合は、良いアイデアかもしれません。
ドイツ語の本( http://www.crlf.de/Verlag /DXF-intern/DXF-intern.html )この形式を実際に説明するDXFについて。高価ですが、検索の日数を節約できます。
DXF形式の色にはインデックスが付けられているため、ACIからRGBへのコンバーターが必要です。値0と1には特別な意味があることに注意してください。
よろしく。
幸い、AutoCADはDXF形式の情報をここに公開しています: DXF形式
誰かがまだ見ている場合に更新する...
同じライブラリで、両方のリンクが含まれています。
https://github.com/haplokuon/netDxf
https://www.nuget.org/packages/netDXF/
Open Design Alliance を試してみてください。自分で調べてからしばらく経ちましたが、さまざまなAutoCADファイルを処理するためのCライブラリがたくさんありました。
こちらは、CodeProject dxfリーダーへのリンクです。ただし、非常に限られているように見えます(特によくできていません)。
こちらは、Javaの別のオープンソースdxfリーダーです。バギー!
同じコードで現時点で利用可能なすべてのASCII DXFバージョンからポイント/ライン/アークを読み取るためのC#コードをいくつか作成しました
正しい名前のサブルーチンを追加するだけで、より多くのオブジェクトを追加できます
(DXFの中を見てください)。
機能:
- インポートしたファイル全体をリーダーでこのルーチンに送信します
- 次に、ENTITIESブロックを検索します(これはジオメトリが格納されている場所です)
- 次に、オブジェクトを検索します(ポイント/ライン/アーク)
(R12からR14まではPOINT / LINE / ARCを使用)
(R2000からR2013までは、角度が含まれている場合はAcDbPoint / AcDbLine / AcDbArcまたはAcDbCircleを使用します) - 次に、レイヤー名をチェックします
- 次に、変数コードが存在するかどうかを確認します
-
その後、データを使用して何かを行うことができます
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] } } } } }