تفتح ملف الكاد في بيئة نظم المعلومات الجغرافية فتجد أسماء الشوارع حروفاً مبعثرة أو مربعات فارغة. المشكلة ليست في الخط بل في طريقة تخزين النص داخل الملف نفسه.
تستلم مخططاً بصيغة DWG فيه شبكة مياه كاملة بأسماء شوارع وأقطار مواسير. تحوّله إلى طبقات مكانية، فتفتح جدول البيانات لتجد: ﺪﻤﺣﺃ ﻖﻳﺮﻃ أو مربعات فارغة أو حروفاً منفصلة بلا تشكيل.
هذه ليست مشكلة خط ناقص. هي ثلاث مشكلات مختلفة يخلط بينها أغلب الناس، ولكل واحدة حلّ مختلف.
أصل المشكلة: الكاد يخزّن الشكل لا المعنى
برامج الرسم الهندسي لم تُصمَّم لتكون قواعد بيانات. حين تكتب «طريق أحمد» في ملف كاد، فالبرنامج مهتم بأن يظهر النص صحيحاً على الورق — لا بأن يبقى قابلاً للبحث والتحليل.
ولتحقيق ذلك لجأت الملفات القديمة إلى حيلة: تخزين الحروف بأشكالها المتصلة الجاهزة بدل تخزين الحرف الأساسي وترك البرنامج يصلها. هذا يضمن الشكل، ويدمّر المعنى.
المشكلات الثلاث — ولكل واحدة حلّ مختلف
1. حروف منفصلة أو مربعات فارغة → مشكلة ترميز
النص مخزّن بترميز قديم (صفحة ترميز عربية) لا بـ Unicode. البرنامج المستقبِل يقرأ البايتات بترميز آخر فيخرج طلاسم.
الحل: إعادة فك الترميز بجدول الصفحة الصحيحة، ثم تحويل النتيجة إلى Unicode. ليس حلاً بتغيير الخط.
2. الحروف صحيحة والترتيب معكوس → مشكلة اتجاه
النص مخزّن بترتيبه المرئي (Visual) لا المنطقي (Logical). أي أن أول حرف في الملف هو آخر حرف في الكلمة.
الحل: عكس الترتيب المنطقي للنص العربي مع الانتباه ألا تُعكس الأرقام والكلمات اللاتينية داخله — وهذه أكثر نقطة يُخطئ فيها الحل اليدوي.
3. الحروف والترتيب صحيحان والشكل غريب → مشكلة أشكال متصلة
النص مخزّن بأشكال العرض الجاهزة (Presentation Forms) بدل الحروف الأساسية.
الحل: تحويل كل شكل عرض إلى حرفه الأساسي، ثم ترك محرّك العرض يصل الحروف من جديد.
التشخيص قبل العلاج: افحص قيمة نصية واحدة فقط قبل أن تعالج الملف كله. الحل الخطأ للمشكلة الخطأ يزيد الفساد ولا يُصلحه.
المشكلة الأكبر التي لا أحد يذكرها: النص غير مرتبط بالعنصر
حتى لو أصلحت النص بالكامل، تبقى مشكلة أعمق: في ملف الكاد، النص كيان مستقل تماماً عن الخط أو المضلع الذي يصفه.
كلمة «300 مم» موضوعة بجوار ماسورة ليست خاصية لها — هي مجرد نص يطفو في الفراغ عند إحداثي معيّن. وحين تحوّل الملف، تحصل على طبقتين منفصلتين: طبقة خطوط بلا بيانات، وطبقة نقاط نصية بلا هندسة.
الربط يحتاج منطقاً مكانياً: أقرب نص لكل عنصر، ضمن مسافة معقولة، مع مراعاة اتجاه العنصر. وهذا هو العمل اليدوي الذي يستهلك أياماً في المشاريع الكبيرة.
سير عمل عملي قبل التحويل
# فحص سريع لعيّنة نصوص قبل معالجة الملف كله
import ezdxf
doc = ezdxf.readfile("plan.dxf")
msp = doc.modelspace()
texts = [e for e in msp if e.dxftype() in ("TEXT", "MTEXT")]
print(f"عدد الكيانات النصية: {len(texts):,}")
for e in texts[:5]:
s = e.dxf.text if e.dxftype() == "TEXT" else e.text
print(repr(s)) # repr يكشف الترميز الحقيقي
print([hex(ord(c)) for c in s[:6]])
كيف تقرأ النتيجة:
- أكواد في المدى
0x0600–0x06FF→ حروف عربية أساسية ✅ - أكواد في المدى
0xFE70–0xFEFF→ أشكال عرض متصلة ← تحتاج إرجاعاً للأساسي - أكواد أقل من
0x00FFلنص عربي → ترميز قديم ← يحتاج فك ترميز
قائمة فحص قبل تسليم التحويل
- هل النصوص قابلة للبحث في جدول البيانات؟ جرّب البحث عن كلمة شائعة.
- هل الفرز الأبجدي يعطي ترتيباً منطقياً؟ الفرز الفاسد يكشف ترميزاً فاسداً.
- هل الأرقام واللاتينية داخل النص العربي بقيت بترتيبها الصحيح؟
- هل كل عنصر هندسي مرتبط بنصه لا بنص جاره؟
- هل الطبقات محافظة على تسمياتها الأصلية من الكاد؟
اختصار الطريق
أبني حالياً أداة تعمل داخل المتصفح تقرأ DXF و DWG، وتصحّح النص العربي بجداول فك ترميز، وتربط النصوص بالعناصر تلقائياً، وتصدّر إلى Shapefile و GeoPackage و GeoJSON — دون رفع ملفك إلى أي خادم.
أُعدّ الطبقات مقصوصة ومنظّفة ومرفقة ببياناتها الوصفية — تصفّح المكتبة أو اطلب منطقتك.