Wahbi-AI / utils /dwg_handler.py
EGYADMIN's picture
Upload 114 files
25d2b3e verified
raw
history blame
9 kB
"""
معالج ملفات 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)