Spaces:
Sleeping
Sleeping
""" | |
معالج ملفات 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) |