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