Wahbi-AI / modules /ai_assistant /engineering_drawing_analyzer.py
EGYADMIN's picture
Upload 74 files
e305028 verified
raw
history blame
5.36 kB
import cv2
import numpy as np
from PIL import Image
import pytesseract
import logging
from datetime import datetime
class EngineeringDrawingAnalyzer:
"""محلل الرسومات الهندسية المتقدم"""
def __init__(self, claude_client=None):
self.claude_client = claude_client
self.supported_formats = ['.dwg', '.dxf', '.pdf', '.jpg', '.jpeg', '.png']
def analyze_drawing(self, file_path):
"""تحليل الرسم الهندسي"""
try:
# قراءة الصورة
image = cv2.imread(file_path)
# تحليل الخطوط والأشكال
lines, shapes = self._analyze_shapes(image)
# استخراج النص والأبعاد
text, dimensions = self._extract_text_and_dimensions(image)
# تحليل متقدم باستخدام Claude
if self.claude_client:
drawing_info = {
'lines': lines,
'shapes': shapes,
'text': text,
'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)
},
'analysis': {
'lines': lines,
'shapes': shapes,
'text': text,
'dimensions': dimensions,
'ai_analysis': ai_analysis
}
}
except Exception as e:
logging.error(f"خطأ في تحليل الرسم: {str(e)}")
raise
def _analyze_shapes(self, image):
"""تحليل الخطوط والأشكال"""
# تحويل الصورة إلى تدرج رمادي
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# كشف الحواف
edges = cv2.Canny(gray, 50, 150)
# كشف الخطوط
lines = cv2.HoughLinesP(edges, 1, np.pi/180, 100)
# كشف الأشكال
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
shapes = []
for contour in contours:
approx = cv2.approxPolyDP(contour, 0.04 * cv2.arcLength(contour, True), True)
if len(approx) == 3:
shapes.append('triangle')
elif len(approx) == 4:
shapes.append('rectangle')
elif len(approx) == 5:
shapes.append('pentagon')
elif len(approx) > 5:
shapes.append('circle')
return {
'line_count': len(lines) if lines is not None else 0,
'line_angles': self._analyze_line_angles(lines) if lines is not None else [],
'line_lengths': self._analyze_line_lengths(lines) if lines is not None else []
}, {
'shape_count': len(shapes),
'shape_types': dict(Counter(shapes))
}
def _extract_text_and_dimensions(self, image):
"""استخراج النص والأبعاد"""
# استخراج النص
text = pytesseract.image_to_string(image, lang='ara+eng')
# تحليل الأبعاد
dimensions = self._analyze_dimensions_from_text(text)
return text, dimensions
def _analyze_dimensions_from_text(self, text):
"""تحليل الأبعاد من النص"""
import re
# نمط للبحث عن الأبعاد
dimension_pattern = r'(\d+(?:\.\d+)?)\s*(م|متر|سم|مم|m|cm|mm)'
# البحث عن جميع الأبعاد
dimensions = re.findall(dimension_pattern, text)
# تحويل الأبعاد إلى قائمة منظمة
processed_dimensions = []
for value, unit in dimensions:
processed_dimensions.append({
'value': float(value),
'unit': unit
})
return processed_dimensions