جستجوی یک برچسب یا یادداشت خاص در یک نقشه DWG لازم نیست به معنای باز کردن فایل در یک ویرایشگر CAD و بررسی دستی هر حاشیه‌نویسی باشد. با استفاده از Python می‌توانید موجودیت‌های متنی نقشه را بررسی کنید و نام‌های اتاق، برچسب‌های تجهیزات یا سایر حاشیه‌نویسی‌های مطابقت‌دار را شناسایی کنید.

این مقاله نشان می‌دهد که چگونه متن را در یک فایل DWG با استفاده از Python جستجو کنید با Aspose.CAD for Python via .NET. شما یک فایل DWG را بارگذاری می‌کنید، متن تک‌خطی و چندخطی را جستجو می‌کنید، محتوای مطابق و لایه آن را چاپ می‌کنید و به‌صورت اختیاری جستجو را به یک لایه محدود می‌کنید. مثال نقشه را بدون تغییر یا استخراج می‌خواند.

نصب Aspose.CAD for Python via .NET

برای دنبال کردن مثال، به یک محیط Python که توسط Aspose.CAD پشتیبانی می‌شود، یک فایل DWG که حاوی حاشیه‌نویسی‌های متنی است، و بسته Aspose.CAD نیاز دارید. صفحه محصول Aspose.CAD Python فهرست می‌کند که Python 3.9 یا بالاتر یکی از الزامات است.

پکیج را از PyPI نصب کنید:

pip install aspose-cad

شما همچنین می‌توانید برای جزئیات تنظیم بسته، به Aspose.CAD راهنمای نصب مراجعه کنید.

برای این آموزش، یک فایل به نام drawing.dwg در پوشه کاری خود قرار دهید. در صورت امکان، از یک نقشه استفاده کنید که شامل حاشیه‌نویسی‌های تک‌خطی TEXT و چندخطی MTEXT باشد تا بتوانید هر دو حالت را بررسی کنید.

چگونه متن را در یک فایل DWG با استفاده از پایتون جستجو کنیم

فایل‌های DWG محتویات نقشه را به‌صورت موجودیت‌ها ذخیره می‌کنند. برای جستجوی متن، دو نوع موجودیت مفید وجود دارد:

  • TEXT (CadText): معمولاً نمایانگر یک حاشیه‌نویسی تک‌خطی است. ویژگی default_value آن مقدار متن را فراهم می‌کند.
  • MTEXT (CadMText): متن چندخطی را نشان می‌دهد. ویژگی full_clear_text آن متن را بدون کدهای قالب‌بندی CAD برمی‌گرداند.

می‌توانید این موجودیت‌ها را بدون تبدیل ابتدا نقاشی به تصویر یا PDF جستجو کنید. جریان کار ساده است:

  1. فایل DWG را با Image.load() بارگذاری کنید و به عنوان یک CadImage به آن دسترسی پیدا کنید.
  2. در مجموعه entities نقشه پیمایش کنید.
  3. TEXT و MTEXT را شناسایی کنید و محتوای آن‌ها را بخوانید.
  4. هر مقدار را با عبارت جستجوی خود مقایسه کنید.
  5. هر تطابق و لایه‌ای که موجودیت به آن تعلق دارد را نمایش دهید.

مثال زیر این مراحل را پیاده‌سازی می‌کند. این مثال به جستجوی top-level TEXT and MTEXT entities می‌پردازد؛ متن داخل بلوک‌های تو در تو و ویژگی‌ها به‌طور جداگانه در ادامه مورد بحث قرار می‌گیرد.

یافتن متن در یک نقشه DWG به‌صورت برنامه‌نویسی

فرض کنید نیاز دارید تمام حاشیه‌نویسی‌هایی که شامل کلمه valve در یک نقشه مهندسی هستند را پیدا کنید. کد زیر این کلمه را بدون توجه به حروف بزرگ یا کوچک جستجو می‌کند و لایه هر موجودیت مطابق را گزارش می‌دهد.

import aspose.cad as cad
from aspose.pycore import cast

# Path to the source drawing and the text to find.
dwg_path = "drawing.dwg"
keyword = "valve"

if not keyword:
    raise ValueError("The search keyword must not be empty.")

# Load the DWG as a CAD image.
image = cad.Image.load(dwg_path)
cad_image = cast(cad.fileformats.cad.CadImage, image)

entity_types = cad.fileformats.cad.cadconsts.CadEntityTypeName
matches = 0

# Search top-level text entities.
for entity in cad_image.entities:
    text_value = None

if entity.type_name == entity_types.TEXT:
        text_entity = cast(
            cad.fileformats.cad.cadobjects.CadText, entity
        )
        text_value = text_entity.default_value

elif entity.type_name == entity_types.MTEXT:
        mtext_entity = cast(
            cad.fileformats.cad.cadobjects.CadMText, entity
        )
        text_value = mtext_entity.full_clear_text

# Match a word or phrase without case sensitivity.
    if text_value and keyword.casefold() in text_value.casefold():
        matches += 1
        print(f"Match: {text_value}")
        print(f"Layer: {entity.layer_name}")
        print("---")

print(f"Total matches: {matches}")

نحوه کار کد

متد Image.load() فایل DWG را باز می‌کند. سپس کمک‌کننده cast() به شما دسترسی به اعضای CadImage، از جمله مجموعه entities آن را می‌دهد.

هر موجودیت یک type_name دارد که نوع شیء رسم را که نمایندگی می‌کند شناسایی می‌کند. وقتی آن نوع TEXT باشد، کد CadText.default_value را می‌خواند. وقتی نوع MTEXT باشد، از CadMText.full_clear_text برای دریافت مقدار چندخطی قابل خواندن استفاده می‌کند.

متد casefold() پایتون مقایسه را بدون در نظر گرفتن حروف بزرگ/کوچک انجام می‌دهد، بنابراین valve، Valve و VALVE همگی می‌توانند مطابقت داشته باشند. این شرط همچنین از تطبیق جزئی پشتیبانی می‌کند: جستجو برای valve با یک حاشیه‌نویسی مانند Main Valve مطابقت خواهد یافت.

در نهایت، entity.layer_name لایه CAD حاوی هر نتیجه را شناسایی می‌کند. این می‌تواند به شما کمک کند تا یادداشت مطابقت‌دار را زمانی که نقشه لایه‌های جداگانه‌ای برای تجهیزات، ابعاد و حاشیه‌نویسی دارد، پیدا کنید.

خروجی مورد انتظار

برای یک نقاشی نمونه با دو حاشیه‌نویسی مطابقت‌دار، خروجی می‌تواند به این شکل باشد:

Match: Main Valve
Layer: Plumbing
---
Match: VALVE CONTROL ROOM
Layer: Annotations
---
Total matches: 2

این یک خروجی نمونه‌ای است. نتایج شما به موجودیت‌های متنی واقعی در فایل DWG شما بستگی دارد. اگر جستجو موجودیت‌های سطح بالای TEXT یا MTTEXT مطابقی پیدا نکند، خط نهایی گزارش می‌دهد Total matches: 0.

جستجوی متن در لایه خاص DWG

برخی از نقشه‌ها محتوا را در لایه‌های اختصاصی سازماندهی می‌کنند، مانند Annotations، Equipment یا Plumbing. اگر قبلاً می‌دانید که لایه حاوی متنی که نیاز دارید کجاست، می‌توانید قبل از بررسی مقادیر، موجودیت‌ها را فیلتر کنید.

در مثال اصلی، لایه هدف را قبل از حلقه تعریف کنید:

target_layer = "Annotations"

سپس این شرط را بلافاصله پس از for entity in cad_image.entities: وارد کنید:

if entity.layer_name.casefold() != target_layer.casefold():
    continue

باقی‌ماندهٔ کد جستجو بدون تغییر می‌ماند. فقط موجودیت‌هایی که نام لایهٔ آن‌ها با Annotations مطابقت دارد، برای کلیدواژه بررسی می‌شوند. این مقایسه همچنین حروف بزرگ و کوچک در نام لایه را نادیده می‌گیرد.

فیلتر بر لایه اختصاص داده شده به هر موجودیت کار می‌کند؛ به‌تنهایی محتویات بلوک‌های تو در تو را گسترش نمی‌دهد یا به مراجع خارجی جستجو نمی‌کند.

یافتن متن دقیق یا استخراج متن از DWG

مثال اصلی از جستجوی زیررشته بدون حساسیت به حروف بزرگ و کوچک استفاده می‌کند. می‌توانید مقایسه را برای کار خود تنظیم کنید.

یک مقدار متنی دقیق پیدا کنید: شرط مطابقت را با عبارت زیر جایگزین کنید تا حاشیه‌نویسی‌های طولانی‌تری که فقط شامل کلیدواژه هستند، حذف شوند:

if text_value and text_value.casefold() == keyword.casefold():

از جستجوی حساس به حروف بزرگ و کوچک استفاده کنید: حفظ حروف بزرگ و کوچک اصلی در هر دو طرف مقایسه:

if text_value and keyword in text_value:

استخراج تمام مقادیر TEXT و MTEXT سطح بالا: کلیدواژه comparison را حذف کنید و هر text_value غیر خالی را پردازش کنید. به عنوان مثال، پس از بررسی‌های entity-type در حلقه اصلی، می‌توانید به جای تست کلیدواژه، متن را به یک لیست اضافه کنید:

if text_value:
    extracted_text.append(text_value)

قبل از حلقه، extracted_text = [] را مقداردهی اولیه کنید اگر از این نوع استفاده می‌کنید. سپس می‌توانید رشته‌های جمع‌آوری‌شده را در یک فایل متنی بنویسید یا از آن‌ها در یک جریان کاری جستجو یا ایندکس‌گذاری جداگانه استفاده کنید. این نوع همچنان فقط انواع موجودیتی را که توسط حلقه مدیریت می‌شوند، پوشش می‌دهد.

چرا ممکن است برخی از متن‌های DWG در نتایج جستجو ظاهر نشوند

یک نقشه DWG می‌تواند متن را در مکان‌های بیشتری نسبت به مجموعه سطح بالای TEXT و MTEXT داشته باشد. اگر کد تعداد نتایج کمتری نسبت به انتظار برگرداند، موارد زیر را بررسی کنید:

  • متن داخل بلوک‌ها: یک بلوک ممکن است موجودیت‌های خود را داشته باشد. برای بررسی آن موجودیت‌ها نیاز به پیمایش اضافی دارید.
  • ویژگی‌های بلوک: برخی مقادیر متنی در موجودیت‌های CadAttrib یا CadAttDef که به بلوک‌های درج‌شده مرتبط هستند، ذخیره می‌شوند. این‌ها در مثال اصلی گنجانده نشده‌اند.
  • مرجع‌های خارجی: متن در یک نقشه‌کش خارجی ممکن است نیاز به پردازش محتوای مرجع به‌صورت جداگانه داشته باشد.
  • محتوای رستر: حروفی که فقط به‌صورت پیکسل در یک تصویر پیوست‌شده ظاهر می‌شوند، موجودیت‌های متنی CAD نیستند. یافتن این کلمات نیاز به OCR دارد نه به‌کارگیری روش مبتنی بر موجودیت.
  • انواع حاشیه‌نویسی دیگر: ابعاد، راهنماها و اشیاء CAD تخصصی ممکن است متن را به‌صورت متفاوتی ذخیره یا تولید کنند و نیاز به پردازش جداگانه دارند.

مستندات Aspose.CAD درباره کار با متن CadText، CadMText، CadAttrib و CadAttDef را به عنوان انواع موجودیت‌های حاوی متن مرتبط شناسایی می‌کند. برای جستجوی گسترده‌تر، پیمایش را گسترش دهید تا آن اشیاء اضافی را شامل شود و آن را در ساختار نقشه‌های خود آزمایش کنید.

اگر Image.load() شکست خورد، ابتدا مسیر فایل را بررسی کنید، سپس تأیید کنید که فایل DWG معتبر است و از یک فرمت پشتیبانی‌شده استفاده می‌کند. برای نتایج غیرمنتظره، با یک نقشه کوچک شروع کنید که مقادیر حاشیه‌نویسی و لایه‌های آن را می‌توانید در یک نمایشگر CAD تأیید کنید.

سوالات متداول

آیا پایتون می‌تواند بدون AutoCAD متن داخل یک فایل DWG را جستجو کند؟

بله. با Aspose.CAD for Python via .NET می‌توانید یک فایل DWG پشتیبانی‌شده را باز کنید و موجودیت‌های متنی را به‌صورت برنامه‌نویسی بررسی کنید. برای این جریان کاری نیازی به نصب AutoCAD نیست.

چگونه می‌توانم یک کلمه خاص را در یک نقشه DWG با استفاده از پایتون پیدا کنم؟

فایل را به عنوان CadImage بارگذاری کنید، از موجودیت‌های آن عبور کنید، مقادیر TEXT و MTTEXT را بخوانید و هر مقدار را با کلیدواژهٔ خود مقایسه کنید. مثال بالا از casefold() و عملگر in پایتون برای یافتن تطابق‌های جزئی بدون حساسیت به حروف بزرگ و کوچک استفاده می‌کند.

آیا می‌توانم تمام متن را از یک فایل DWG با استفاده از پایتون استخراج کنم؟

می‌توانید متن را از انواع موجودیت‌های پشتیبانی‌شده، از جمله CadText و CadMText جمع‌آوری کنید. یک فرآیند استخراج جامع باید همچنین محتویات بلوک‌های مرتبط، ویژگی‌ها و سایر اشیای حاشیه‌نویسی را بررسی کند و نه فقط به حلقه موجودیت سطح بالا تکیه کند.

دریافت یک مجوز موقت رایگان

شما می‌توانید برای ارزیابی Aspose.CAD for Python via .NET بدون محدودیت‌های ارزیابی، یک مجوز موقت 30 روزه رایگان درخواست کنید. فرآیند درخواست مجوز موقت نیاز به یک آدرس ایمیل تجاری معتبر دارد.

برای اطلاعات دربارهٔ اعمال یک لایسنس در برنامهٔ Python خود، راهنمای مجوز Aspose.CAD را ببینید.

منابع آموزشی رایگان

برای اطلاعات بیشتر در مورد پردازش نقشه‌های DWG و کار با موجودیت‌های CAD در پایتون، این منابع را بررسی کنید:

نتیجه‌گیری

می‌توانید با استفاده از Python متن را در یک فایل DWG جستجو کنید با بارگذاری نقشه، بررسی موجودیت‌های TEXT و MTEXT آن، و مقایسه مقادیرشان با یک کلمه کلیدی. همان جریان کار می‌تواند لایه‌های مطابق را گزارش دهد، جستجوها را به یک لایه خاص محدود کند، یا متن را برای پردازش‌های بعدی جمع‌آوری کند. برای نقشه‌هایی که شامل ویژگی‌های بلوک یا حاشیه‌نویسی‌های تو در تو هستند، قبل از اعتماد به نتایج به عنوان یک فهرست کامل متن، پیمایش موجودیت‌ها را گسترش دهید.

موارد مرتبط