การค้นหาป้ายหรือโน้ตเฉพาะในภาพวาด 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 product page ระบุว่า Python 3.9 หรือใหม่กว่าเป็นหนึ่งในข้อกำหนดของมัน.

ติดตั้งแพคเกจจาก PyPI:

pip install aspose-cad

คุณยังสามารถดู Aspose.CAD คู่มือการติดตั้ง สำหรับรายละเอียดการตั้งค่าแพ็กเกจ

สำหรับบทแนะนำนี้ ให้ใส่ไฟล์ชื่อ drawing.dwg ไว้ในไดเรกทอรีทำงานของคุณ โดยควรใช้ไฟล์ drawing ที่มีทั้งคำอธิบาย TEXT แบบบรรทัดเดียวและ MTEXT แบบหลายบรรทัด เพื่อให้คุณสามารถตรวจสอบทั้งสองกรณีได้

วิธีค้นหาข้อความในไฟล์ DWG ด้วย Python

ไฟล์ DWG เก็บเนื้อหาการวาดเป็นเอนทิตี สำหรับการค้นหาข้อความ มีประเภทเอนทิตีที่เป็นประโยชน์สองประเภทคือ:

  • TEXT (CadText): โดยทั่วไปแสดงถึงคำอธิบายบรรทัดเดียว คุณสมบัติ default_value ให้ค่าข้อความ
  • MTEXT (CadMText): แสดงข้อความหลายบรรทัด คุณสมบัติ full_clear_text คืนค่าข้อความโดยไม่มีรหัสรูปแบบ CAD

คุณสามารถค้นหาเอนทิตีเหล่านี้ได้โดยไม่ต้องแปลงภาพวาดเป็นรูปภาพหรือ PDF. กระบวนการทำงานนั้นตรงไปตรงมา:

  1. โหลดไฟล์ DWG ด้วย Image.load() และเข้าถึงเป็น CadImage.
  2. วนผ่านคอลเลกชัน entities ของภาพวาด.
  3. ระบุเอนทิตี้ TEXT และ MTEXT แล้วอ่านเนื้อหาของมัน.
  4. เปรียบเทียบค่าทั้งหมดกับคำค้นของคุณ.
  5. แสดงผลการจับคู่แต่ละรายการและเลเยอร์ที่เอนทิตี้นั้นอยู่.

ตัวอย่างต่อไปนี้ดำเนินการตามขั้นตอนเหล่านี้ มันค้นหา เอนทิตี TEXT และ MTEXT ระดับบน ของการวาด; ข้อความภายในบล็อกซ้อนและแอตทริบิวต์จะถูกอธิบายแยกต่างหากด้านล่าง.

ค้นหาข้อความในไฟล์ 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() method เปิดไฟล์ DWG. ตัวช่วย cast() จากนั้นให้คุณเข้าถึงสมาชิกของ CadImage รวมถึงคอลเลกชัน entities ของมัน.

แต่ละเอนทิตีมี type_name ที่ระบุว่ามันเป็นวัตถุการวาดประเภทใด เมื่อประเภทนั้นเป็น TEXT โค้ดจะอ่าน CadText.default_value เมื่อประเภทเป็น MTEXT จะใช้ CadMText.full_clear_text เพื่อรับค่าข้อความหลายบรรทัดที่อ่านได้

เมธอด casefold() ของ Python ทำให้การเปรียบเทียบไม่สนใจตัวพิมพ์ใหญ่/เล็ก ดังนั้น 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 หรือ MTEXT ระดับบนที่ตรงกัน, บรรทัดสุดท้ายจะรายงาน 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 ระดับบนทั้งหมด: ลบการเปรียบเทียบคีย์เวิร์ดและประมวลผล text_value ทุกค่าที่ไม่ว่างเปล่า. ตัวอย่างเช่น หลังจากตรวจสอบประเภทเอนทิตีในลูปหลัก คุณสามารถเพิ่มข้อความลงในรายการแทนการทดสอบคีย์เวิร์ดได้:

if text_value:
    extracted_text.append(text_value)

Initialize extracted_text = [] ก่อนลูปหากคุณใช้รูปแบบนี้ คุณสามารถเขียนสตริงที่รวบรวมได้ลงในไฟล์ข้อความหรือใช้ในกระบวนการค้นหา หรือทำดัชนีแยกต่างหาก รูปแบบนี้ยังคงครอบคลุมเฉพาะประเภทเอนทิตีที่ลูปจัดการเท่านั้น.

ทำไมข้อความ DWG บางส่วนอาจไม่ปรากฏในผลการค้นหา

ไฟล์ DWG สามารถมีข้อความอยู่ในหลายตำแหน่งมากกว่าคอลเลกชันระดับบนสุด TEXT และ MTEXT หากโค้ดส่งคืนจำนวนการจับคู่ที่น้อยกว่าที่คาดไว้ ให้ตรวจสอบความเป็นไปได้ต่อไปนี้:

  • Text inside blocks: บล็อกอาจมีเอนทิตี้ของตนเอง คุณต้องทำการเดินทางเพิ่มเติมเพื่อตรวจสอบเอนทิตี้เหล่านั้น.
  • Block attributes: ค่าข้อความบางส่วนถูกจัดเก็บในเอนทิตี้ CadAttrib หรือ CadAttDef ที่เชื่อมโยงกับบล็อกที่แทรกเข้ามา ซึ่งไม่ได้รวมอยู่ในตัวอย่างหลัก.
  • External references: ข้อความในภาพวาดที่อ้างอิงจากภายนอกอาจต้องการการประมวลผลเนื้อหาที่อ้างอิงแยกต่างหาก.
  • Raster content: ตัวอักษรที่ปรากฏเป็นพิกเซลเท่านั้นในภาพที่แนบมานั้นไม่ใช่เอนทิตี้ข้อความของ CAD การค้นหาคำเหล่านั้นต้องใช้ OCR แทนวิธีการที่อิงเอนทิตี้นี้.
  • Other annotation types: มิติ, ลูกศรนำ, และอ็อบเจกต์ CAD พิเศษอาจจัดเก็บหรือสร้างข้อความในรูปแบบที่แตกต่างกันและต้องการการจัดการแยกต่างหาก.

The เอกสาร Aspose.CAD เกี่ยวกับการทำงานกับข้อความ ระบุ CadText, CadMText, CadAttrib, และ CadAttDef เป็นประเภทเอนทิตีที่มีข้อความที่เกี่ยวข้อง. สำหรับการค้นหาที่กว้างขึ้น, ขยายการสำรวจเพื่อรวมวัตถุเพิ่มเติมเหล่านั้นและทดสอบกับโครงสร้างของแบบวาดของคุณ.

หาก Image.load() ล้มเหลว ให้ตรวจสอบเส้นทางไฟล์ก่อน แล้วยืนยันว่าไฟล์ DWG ถูกต้องและใช้ รูปแบบที่รองรับ. สำหรับผลลัพธ์ที่ไม่คาดคิด ให้เริ่มต้นด้วยการวาดแบบเล็ก ๆ ที่คุณสามารถตรวจสอบค่าการอธิบายและเลเยอร์ในโปรแกรมดู CAD ได้.

คำถามที่พบบ่อย

Python สามารถค้นหาข้อความภายในไฟล์ DWG ได้โดยไม่ใช้ AutoCAD หรือไม่?

ใช่. ด้วย Aspose.CAD for Python via .NET, คุณสามารถเปิดไฟล์ DWG ที่รองรับและตรวจสอบเอนทิตีข้อความโดยโปรแกรมได้. AutoCAD ไม่จำเป็นต้องติดตั้งสำหรับเวิร์กโฟลว์นี้.

ฉันจะค้นหาคำเฉพาะในไฟล์ DWG ด้วย Python ได้อย่างไร?

โหลดไฟล์เป็น CadImage แล้ววนซ้ำผ่านเอนทิตีของมัน อ่านค่า TEXT และ MTEXT จากนั้นเปรียบเทียบแต่ละค่ากับคีย์เวิร์ดของคุณ ตัวอย่างข้างต้นใช้ casefold() และตัวดำเนินการ in ของ Python เพื่อค้นหาการจับคู่บางส่วนที่ไม่สนใจตัวพิมพ์ใหญ่/เล็ก.

ฉันสามารถดึงข้อความทั้งหมดจากไฟล์ DWG ด้วย Python ได้หรือไม่?

คุณสามารถรวบรวมข้อความจากประเภทเอนทิตี้ที่รองรับได้ รวมถึง CadText และ CadMText. กระบวนการสกัดที่ครอบคลุมควรตรวจสอบเนื้อหา block ที่เกี่ยวข้อง, แอตทริบิวต์, และอ็อบเจ็กต์ annotation อื่น ๆ แทนการพึ่งพาเพียงลูปเอนทิตี้ระดับบนเท่านั้น.

รับใบอนุญาตชั่วคราวฟรี

คุณสามารถ ขอรับใบอนุญาตชั่วคราวฟรี 30 วัน เพื่อประเมิน Aspose.CAD for Python via .NET โดยไม่มีข้อจำกัดในการประเมินผล กระบวนการขอใบอนุญาตชั่วคราวต้องใช้ที่อยู่อีเมลธุรกิจที่มีคุณสมบัติเหมาะสม.

ดู Aspose.CAD คู่มือการให้สิทธิ์ สำหรับข้อมูลเกี่ยวกับการใช้ใบอนุญาตในแอปพลิเคชัน Python ของคุณ.

แหล่งเรียนรู้ฟรี

สำรวจแหล่งข้อมูลเหล่านี้เพื่อรับข้อมูลเพิ่มเติมเกี่ยวกับการประมวลผลไฟล์ DWG และการทำงานกับเอนทิตี้ CAD ใน Python:

สรุป

คุณสามารถค้นหาข้อความในไฟล์ DWG ด้วย Python โดยการโหลดแบบร่าง ตรวจสอบเอนทิตี TEXT และ MTEXT ของมัน และเปรียบเทียบค่าของพวกมันกับคีย์เวิร์ดเดียวกัน กระบวนการทำงานเดียวกันนี้สามารถรายงานเลเยอร์ที่ตรงกัน จำกัดการค้นหาให้เฉพาะเลเยอร์หนึ่ง หรือรวบรวมข้อความสำหรับการประมวลผลต่อไป สำหรับแบบร่างที่มีแอตทริบิวต์บล็อกหรือคำอธิบายที่ซ้อนกัน ให้ขยายการเดินทางของเอนทิตีก่อนพึ่งพาผลลัพธ์เป็นรายการข้อความที่ครบถ้วน.

ดูเพิ่มเติม