سؤال

هل يعرف أحد كود المصدر، بشكل مثالي في C# أو ما شابه ذلك، لقراءة ملفات .DXF (كما يستخدمها AutoCAD وما إلى ذلك)؟إذا لم يكن رمزًا، فهل الجداول توضح الرموز المختلفة (العناصر/الكتل/الخ) ومعانيها؟

أنا أكتب قارئًا بنفسي، ولدي وثائق شجرة ميتة توضح تفاصيل التنسيق، ولكني أحاول تجنب الكتابة على سبيل المثال:محول من كل لون من ألوان ACI الـ 255 إلى RGB...شكرًا!

هل كانت مفيدة؟

المحلول

Cadlib من WoutWare لدي تم استخدام لبضعة مشاريع مع نتائج جيدة.

نصائح أخرى

ولدي عمل بضع سنوات في تطوير بلدي DXF عارض في جافا (هل يمكن إسقاط ملف DXF الخاصة بك أو URL على المشاهد) للرسومات 2D.
المعلومات المنشورة من أوتوكاد هي قاعدة جيدة لكنها لا تفسر كيف يعمل.
تصبح عضوا في التحالف تصميم المفتوحة، وسوف تعطيك إمكانية لتحويل عدة صيغ CAD إلى DXF. قد تكون فكرة جيدة إذا كنت تقوم بتطوير منتج تجاري.
هناك كتاب الألمانية ( http://www.crlf.de/Verlag /DXF-intern/DXF-intern.html ) حول DXF التي تفسر حقا بهذا الشكل. أنها مكلفة، ولكن يمكن أن ينقذ أيام من البحث.
مفهرسة الألوان في تنسيق DXF، يجب أن يكون المحول من ACI إلى RGB. كن حذرا مع القيم 0 و 1 التي لها معنى خاص.

والتحيات.

ولحسن الحظ أوتوكاد نشر معلومات تنسيق DXF هنا: DXF تنسيقات

وتحديث في حالة شخص ما زالت تبحث ...
انها نفس المكتبة، فقط بما في ذلك الروابط.

https://github.com/haplokuon/netDxf
https://www.nuget.org/packages/netDXF/

وأنت قد ترغب في محاولة توسيع التحالف تصميم . انها منذ بعض الوقت نظرت إلى نفسي، ولكن لديهم حمولة من مكتبات C للتعامل مع مختلف ملفات أوتوكاد.

هنا وصلة لقارئ DXF CodeProject. على ما يبدو محدودة للغاية (وليس بشكل خاص أحسنت) على الرغم من.

هنا مفتوحة القارئ DXF آخر المصدر، في جاوة. عربات التي تجرها الدواب ولكن!

لقد قمت بكتابة بعض أكواد C# لقراءة النقاط/الخطوط/الأقواس من جميع إصدارات ASCII DXF المتوفرة حاليًا بنفس الكود
يمكنك إضافة المزيد من الكائنات فقط بإضافة المزيد من الإجراءات الفرعية بالاسم الصحيح
(انظر داخل DXF).

ماذا يفعل:

  1. يمكنك إرسال الملف بأكمله الذي قمت باستيراده مع القارئ إلى هذا الروتين
  2. ثم يبحث عن كتلة ENTITIES (هذا هو المكان الذي يتم فيه تخزين الأشكال الهندسية)
  3. ثم يبحث عن الكائن (نقطة/خط/قوس)
    (R12 حتى R14 استخدم POINT / LINE / ARC)
    (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