문제

.DXF 파일 (AutoCAD 등에 사용)을 읽기 위해 C# 또는 유사한 소스 코드를 알고 있습니까? 코드가 아닌 경우 다양한 코드 (요소 / 블록 / 등)와 그 의미를 보여주는 테이블?

나는 독자를 직접 작성하고 있으며 형식을 자세히 설명하는 데드 트리 문서를 가지고 있지만 255 ACI 색상에서 RGB로 컨버터를 쓰는 것을 피하려고 노력하고 있습니다. 감사합니다!

도움이 되었습니까?

해결책

Cadlib Woutware에서 좋은 결과를 얻은 몇 가지 프로젝트를 사용했습니다.

다른 팁

나는 내 자신을 개발하는 데 몇 년 동안 일했습니다. Java의 DXF-Viewer (2D 도면의 경우 자신의 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/

당신은 시도하고 싶을 수도 있습니다 오픈 디자인 동맹. 내가 직접 살펴 본 지 오래되었지만 다양한 AutoCAD 파일을 다루기위한 C 라이브러리가 많이있었습니다.

여기 CodeProject DXF 리더에 대한 링크입니다. 그러나 그것은 매우 제한적으로 보입니다 (특히 잘하지 못했습니다).

여기 Java의 또 다른 오픈 소스 DXF 리더입니다. 그러나 버기!

동일한 코드로 현재 사용 가능한 모든 ASCII DXF 버전에서 포인트/라인/아크를 읽기 위해 일부 C# 코드를 작성했습니다.
더 많은 객체를 추가 할 수 있습니다.
(DXF 내부를보십시오).

그것이하는 일 :

  1. 독자와 함께 가져온 전체 파일을이 루틴으로 보냅니다.
  2. 그런 다음 엔터티 블록을 검색합니다 (이것은 지오메트리가 저장되는 곳입니다)
  3. 그런 다음 객체를 검색합니다 (Point/Line/Arc)
    (R12 ~ R14 포인트 / 라인 / 아크 사용)
    (R2000까지 R2013까지 ACDBPOINT / ACDBLINE / ACDBARC 또는 ACDBCIRCLE가 각도를 포함하는 경우 사용)
  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]
                    }
                }
            }
    
        }
    }
    
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top