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