Wahbi-AI / modules /ai_assistant /cad_bim_analyzer.py
EGYADMIN's picture
Upload 74 files
e305028 verified
"""
محلل الرسومات الهندسية وملفات BIM المتقدم
"""
import ezdxf
import cv2
import numpy as np
from PIL import Image
import pytesseract
from shapely.geometry import Point, Polygon
import json
import os
import logging
from datetime import datetime
class CADBIMAnalyzer:
"""محلل الرسومات الهندسية وملفات BIM"""
def __init__(self, claude_client=None):
"""تهيئة المحلل"""
self.claude_client = claude_client
self.analysis_results = {}
def analyze_drawing(self, file_path):
"""تحليل الرسم الهندسي"""
try:
file_extension = os.path.splitext(file_path)[1].lower()
if file_extension in ['.dwg', '.dxf']:
return self._analyze_cad_file(file_path)
elif file_extension == '.ifc':
return self._analyze_bim_file(file_path)
elif file_extension in ['.pdf', '.jpg', '.jpeg', '.png']:
return self._analyze_image_file(file_path)
else:
raise ValueError(f"نوع الملف غير مدعوم: {file_extension}")
except Exception as e:
logging.error(f"خطأ في تحليل الرسم: {str(e)}")
raise
def _analyze_cad_file(self, file_path):
"""تحليل ملف CAD"""
doc = ezdxf.readfile(file_path)
msp = doc.modelspace()
# تحليل العناصر
elements = {
'lines': len(msp.query('LINE')),
'circles': len(msp.query('CIRCLE')),
'arcs': len(msp.query('ARC')),
'polylines': len(msp.query('LWPOLYLINE')),
'dimensions': len(msp.query('DIMENSION')),
'text': len(msp.query('TEXT')),
'blocks': len(doc.blocks)
}
# تحليل الطبقات
layers = {layer.dxf.name: {
'color': layer.dxf.color,
'linetype': layer.dxf.linetype,
'is_on': layer.dxf.on,
'is_frozen': layer.dxf.frozen
} for layer in doc.layers}
# استخراج الأبعاد
extents = msp.get_extents()
if extents:
dimensions = {
'width': abs(extents.size.x),
'height': abs(extents.size.y),
'area': abs(extents.size.x * extents.size.y)
}
else:
dimensions = {'width': 0, 'height': 0, 'area': 0}
# تحليل متقدم باستخدام Claude
if self.claude_client:
drawing_info = {
'elements': elements,
'layers': layers,
'dimensions': dimensions
}
analysis_prompt = f"""
قم بتحليل معلومات الرسم الهندسي التالية وتقديم:
1. وصف عام للرسم
2. تحليل العناصر والطبقات
3. تحديد نوع المشروع والتخصص
4. توصيات فنية
5. ملاحظات هامة
معلومات الرسم:
{json.dumps(drawing_info, indent=2, ensure_ascii=False)}
"""
response = self.claude_client.messages.create(
model="claude-3-sonnet-20240229",
max_tokens=4000,
temperature=0.7,
messages=[{"role": "user", "content": analysis_prompt}]
)
ai_analysis = response.content[0].text
else:
ai_analysis = "تحليل الذكاء الاصطناعي غير متاح"
return {
'file_info': {
'path': file_path,
'type': os.path.splitext(file_path)[1],
'size': os.path.getsize(file_path),
'modified': datetime.fromtimestamp(os.path.getmtime(file_path)).strftime('%Y-%m-%d %H:%M:%S')
},
'elements': elements,
'layers': layers,
'dimensions': dimensions,
'ai_analysis': ai_analysis
}
def _analyze_bim_file(self, file_path):
"""تحليل ملف BIM"""
try:
# تحليل ملف IFC
import ifcopenshell
ifc_file = ifcopenshell.open(file_path)
# تحليل العناصر
elements = {
'structural': self._analyze_structural_elements(ifc_file),
'architectural': self._analyze_architectural_elements(ifc_file),
'mep': self._analyze_mep_elements(ifc_file)
}
# تحليل الأبعاد
dimensions = self._analyze_dimensions(ifc_file)
# تحليل متقدم باستخدام Claude
if self.claude_client:
building_info = {
'elements': elements,
'dimensions': dimensions,
'properties': self._extract_properties(ifc_file)
}
analysis_prompt = f"""
قم بتحليل معلومات نموذج BIM التالية وتقديم:
1. تحليل شامل للنموذج
2. تقييم جودة النمذجة
3. توصيات للتحسين
4. تقدير التكاليف
5. تحليل الاستدامة
معلومات النموذج:
{json.dumps(building_info, indent=2, ensure_ascii=False)}
"""
response = self.claude_client.messages.create(
model="claude-3-sonnet-20240229",
max_tokens=4000,
temperature=0.7,
messages=[{"role": "user", "content": analysis_prompt}]
)
ai_analysis = response.content[0].text
else:
ai_analysis = "تحليل الذكاء الاصطناعي غير متاح"
return {
'file_info': {
'path': file_path,
'type': 'IFC',
'schema': ifc_file.schema,
'size': os.path.getsize(file_path)
},
'elements': elements,
'dimensions': dimensions,
'analysis': ai_analysis
}
except Exception as e:
logging.error(f"خطأ في تحليل ملف BIM: {str(e)}")
raise
def _analyze_image_file(self, file_path):
"""تحليل ملف صورة"""
# قراءة الصورة
if file_path.lower().endswith('.pdf'):
# TODO: Add PDF to image conversion
pass
else:
image = cv2.imread(file_path)
# استخراج النص
text = pytesseract.image_to_string(image, lang='ara+eng')
# تحليل الخطوط والأشكال
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150)
lines = cv2.HoughLinesP(edges, 1, np.pi/180, 100)
# تحليل متقدم باستخدام Claude
if self.claude_client:
image_info = {
'dimensions': image.shape,
'extracted_text': text,
'detected_lines': len(lines) if lines is not None else 0
}
analysis_prompt = f"""
قم بتحليل معلومات الصورة الهندسية التالية وتقديم:
1. وصف عام للصورة
2. تحليل النص المستخرج
3. تحليل الخطوط والأشكال
4. تحديد نوع المشروع والتخصص
5. توصيات وملاحظات
معلومات الصورة:
{json.dumps(image_info, indent=2, ensure_ascii=False)}
"""
response = self.claude_client.messages.create(
model="claude-3-sonnet-20240229",
max_tokens=4000,
temperature=0.7,
messages=[{"role": "user", "content": analysis_prompt}]
)
ai_analysis = response.content[0].text
else:
ai_analysis = "تحليل الذكاء الاصطناعي غير متاح"
return {
'file_info': {
'path': file_path,
'type': os.path.splitext(file_path)[1],
'size': os.path.getsize(file_path),
'modified': datetime.fromtimestamp(os.path.getmtime(file_path)).strftime('%Y-%m-%d %H:%M:%S')
},
'dimensions': {
'width': image.shape[1],
'height': image.shape[0],
'channels': image.shape[2]
},
'extracted_text': text,
'analysis': {
'detected_lines': len(lines) if lines is not None else 0
},
'ai_analysis': ai_analysis
}