v3 / utils /dwg_handler.py
EGYADMIN's picture
Upload 115 files
82676b8 verified
"""
معالج ملفات DWG
"""
import os
import re
import subprocess
import shutil
import tempfile
import traceback
import pandas as pd
from pathlib import Path
import config
from utils.helpers import create_directory_if_not_exists
class DWGHandler:
"""معالج ملفات DWG (AutoCAD)"""
def __init__(self, converter_path=None):
"""
تهيئة معالج ملفات DWG
المعلمات:
converter_path: مسار برنامج تحويل DWG (اختياري)
"""
# محاولة تحديد مسار برنامج تحويل DWG
self.converter_path = converter_path
if not self.converter_path:
# البحث عن المسار في إعدادات النظام
if hasattr(config, 'DWG_CONVERTER_PATH') and config.DWG_CONVERTER_PATH:
self.converter_path = config.DWG_CONVERTER_PATH
else:
# محاولة البحث عن البرامج المعروفة
possible_paths = [
r"C:\Program Files\Autodesk\AutoCAD 2022\accoreconsole.exe",
r"C:\Program Files\Autodesk\AutoCAD 2021\accoreconsole.exe",
r"C:\Program Files\Autodesk\AutoCAD 2020\accoreconsole.exe",
r"C:\Program Files\ODA\ODAFileConverter\ODAFileConverter.exe"
]
for path in possible_paths:
if os.path.exists(path):
self.converter_path = path
break
def convert_to_pdf(self, dwg_path, output_path=None):
"""
تحويل ملف DWG إلى PDF
المعلمات:
dwg_path: مسار ملف DWG
output_path: مسار ملف الإخراج (اختياري)
الإرجاع:
مسار ملف PDF الناتج
"""
try:
# التحقق من وجود الملف
if not os.path.exists(dwg_path):
raise FileNotFoundError(f"ملف DWG غير موجود: {dwg_path}")
# التحقق من وجود برنامج التحويل
if not self.converter_path or not os.path.exists(self.converter_path):
raise FileNotFoundError("لم يتم العثور على برنامج تحويل DWG")
# تحديد مسار الإخراج
if not output_path:
output_path = os.path.splitext(dwg_path)[0] + ".pdf"
# إنشاء مجلد الإخراج إذا لم يكن موجودًا
output_dir = os.path.dirname(output_path)
create_directory_if_not_exists(output_dir)
# تنفيذ عملية التحويل باستخدام برنامج التحويل المناسب
if "accoreconsole.exe" in self.converter_path.lower():
# استخدام AutoCAD Core Console لتحويل الملف
script_content = f"""
/i "{dwg_path}"
/e
/o "{output_path}"
"""
script_path = tempfile.mktemp(suffix=".scr")
with open(script_path, "w") as f:
f.write(script_content)
cmd = [self.converter_path, "/s", script_path]
result = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
os.unlink(script_path) # حذف ملف النص البرمجي المؤقت
if result.returncode != 0:
raise RuntimeError(f"فشل في تحويل ملف DWG: {result.stderr}")
elif "odafileconverter.exe" in self.converter_path.lower():
# استخدام ODA File Converter لتحويل الملف
input_dir = os.path.dirname(dwg_path)
output_dir = os.path.dirname(output_path)
input_filename = os.path.basename(dwg_path)
output_format = "PDF"
cmd = [
self.converter_path,
input_dir,
output_dir,
"DWG",
output_format,
"1",
"1",
input_filename
]
result = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
if result.returncode != 0:
raise RuntimeError(f"فشل في تحويل ملف DWG: {result.stderr}")
else:
raise NotImplementedError(f"برنامج التحويل غير مدعوم: {self.converter_path}")
# التحقق من وجود ملف الإخراج
if not os.path.exists(output_path):
raise FileNotFoundError(f"لم يتم إنشاء ملف PDF: {output_path}")
return output_path
except Exception as e:
error_msg = f"خطأ في تحويل ملف DWG إلى PDF: {str(e)}"
print(error_msg)
traceback.print_exc()
raise Exception(error_msg)
def extract_quantities(self, dwg_path):
"""
استخراج الكميات من ملف DWG
المعلمات:
dwg_path: مسار ملف DWG
الإرجاع:
DataFrame يحتوي على الكميات المستخرجة
"""
try:
# تحويل ملف DWG إلى PDF أولاً
pdf_path = self.convert_to_pdf(dwg_path)
# استخدام معالج ملفات PDF لاستخراج الكميات
from utils.pdf_handler import extract_quantities_from_pdf
return extract_quantities_from_pdf(pdf_path)
except Exception as e:
error_msg = f"خطأ في استخراج الكميات من ملف DWG: {str(e)}"
print(error_msg)
traceback.print_exc()
raise Exception(error_msg)
def extract_text(self, dwg_path):
"""
استخراج النص من ملف DWG
المعلمات:
dwg_path: مسار ملف DWG
الإرجاع:
النص المستخرج من ملف DWG
"""
try:
# تحويل ملف DWG إلى PDF أولاً
pdf_path = self.convert_to_pdf(dwg_path)
# استخدام معالج ملفات PDF لاستخراج النص
from utils.pdf_handler import extract_text_from_pdf
return extract_text_from_pdf(pdf_path)
except Exception as e:
error_msg = f"خطأ في استخراج النص من ملف DWG: {str(e)}"
print(error_msg)
traceback.print_exc()
raise Exception(error_msg)
def get_dwg_info(self, dwg_path):
"""
الحصول على معلومات ملف DWG
المعلمات:
dwg_path: مسار ملف DWG
الإرجاع:
قاموس يحتوي على معلومات الملف
"""
try:
# التحقق من وجود الملف
if not os.path.exists(dwg_path):
raise FileNotFoundError(f"ملف DWG غير موجود: {dwg_path}")
# الحصول على معلومات الملف الأساسية
file_info = {
'filename': os.path.basename(dwg_path),
'path': dwg_path,
'size': os.path.getsize(dwg_path),
'modified_date': os.path.getmtime(dwg_path)
}
# محاولة استخراج معلومات إضافية من الملف
# ملاحظة: هذا يتطلب مكتبات إضافية أو استخدام برامج خارجية
return file_info
except Exception as e:
error_msg = f"خطأ في الحصول على معلومات ملف DWG: {str(e)}"
print(error_msg)
traceback.print_exc()
raise Exception(error_msg)
def is_converter_available(self):
"""
التحقق من توفر برنامج تحويل DWG
الإرجاع:
True إذا كان برنامج التحويل متوفرًا، False خلاف ذلك
"""
return self.converter_path is not None and os.path.exists(self.converter_path)