Python解析.dwg格式文件信息提取

一、装环境

这里搞的人头疼,装了一大堆,各种报错,最后也不知道是靠哪个包运行成功的,反正成了

1、下载 ODAFileConverter

从Open Design Alliance官网(ODA文件转换器下载页面)下载适用于Ubuntu的DEB包。

2、安装 ODAFileConverter

(1)、安装 gdebi 来处理依赖关系

sudo apt update
sudo apt install gdebi-core

(2)、使用 gdebi 安装 DEB 包

gdebi ODAFileConverter_QT6_lnxX64_8.3dll_25.4.deb

3、解决 libxcb库问题

现代的Ubuntu版本(例如22.04)可能缺少 libxcb-util.so.0 库。可以通过创建符号链接来解决这个问题:

(1)、安装依赖

sudo apt-get update
sudo apt-get -f install
sudo apt install libxcb-xinerama0 libxcb-util1 libxkbcommon-x11-0 libglu1-mesa libxrender1 libxi6 libxrandr2 xvfb gdal-bin

安装qt

apt-get install aptitude
sudo aptitude install qt5-default qtbase5-dev qtbase5-dev-tools
echo 'export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/lib/x86_64-linux-gnu/qt5/plugins/platforms' >> ~/.bashrc
echo 'export QT_QPA_PLATFORM=xcb' >> ~/.bashrc
source ~/.bashrc

(2)、确认 libxcb-util.so.1 是否存在

ls /usr/lib/x86_64-linux-gnu/libxcb-util.so.1

(3)、创建符号链接

cd /usr/lib/x86_64-linux-gnu
sudo ln -s libxcb-util.so.1 libxcb-util.so.0

4、安装python包

conda install -c conda-forge gdal
pip install ezdxf

二、上代码

from ezdxf.addons import odafc
import ezdxf
from osgeo import ogr
import sys
import os
import json
import re

class dwg_analysis:
    def __init__(self, filepath, format):
        self.filepath = filepath
        self.format = format

    def dwg2data(self):
        dxf_file = os.path.join(os.path.dirname(self.filepath), os.path.basename(self.filepath).split(".")[0] + ".dxf")
        odafc.convert(self.filepath, dxf_file, version='R2000', replace=True)  
        
        doc = ezdxf.readfile(dxf_file)
        msp = doc.modelspace()

        data = {}
                 # 获取TEXT实体
        texts = msp.query('TEXT')
        text_data = []
        if format == "dwg_txt":
            for text in texts:
                decoded_str = re.sub(r'\\U\+([0-9A-Fa-f]{4})', lambda m: chr(int(m.group(1), 16)), text.dxf.text)
                text_data.append(decoded_str)
            filtered_list = [item for item in text_data if not (isinstance(item, (int, float)) or (isinstance(item, str) and str.isdigit(item)) or (isinstance(item, str) and item.isdigit()))]
            data['TEXT'] = self.remove_duplicates(filtered_list)
            return data

        for text in texts:
            decoded_str = re.sub(r'\\U\+([0-9A-Fa-f]{4})', lambda m: chr(int(m.group(1), 16)), text.dxf.text)
            text_info = {
                'text': decoded_str,
                'insert': (text.dxf.insert[0], text.dxf.insert[1]),
                'height': text.dxf.height,
                'rotation': text.dxf.rotation,
                'style': text.dxf.style,
                'layer': text.dxf.layer
            }
            text_data.append(text_info)

        data['TEXT'] = text_data
                # 获取LINE实体
        lines = msp.query('LINE')
        line_data = []
        for line in lines:
            line_data.append({
                'start': (line.dxf.start[0], line.dxf.start[1]),
                'end': (line.dxf.end[0], line.dxf.end[1])
            })
        data['LINE'] = line_data

        # 获取POLYLINE实体
        polylines = msp.query('POLYLINE')
        polyline_data = []
        for polyline in polylines:
            points = []
            for point in polyline.points():
                points.append((point[0], point[1]))
            polyline_data.append(points)
        data['POLYLINE'] = polyline_data

        # 获取CIRCLE实体
        circles = msp.query('CIRCLE')
        circle_data = []
        for circle in circles:
            circle_data.append({
                'center': (circle.dxf.center[0], circle.dxf.center[1]),
                'radius': circle.dxf.radius
            })
        data['CIRCLE'] = circle_data

        # 获取ARC实体
        arcs = msp.query('ARC')
        arc_data = []
        for arc in arcs:
            arc_data.append({
                'center': (arc.dxf.center[0], arc.dxf.center[1]),
                'radius': arc.dxf.radius,
                'start_angle': arc.dxf.start_angle,
                'end_angle': arc.dxf.end_angle
            })
        data['ARC'] = arc_data

        # 获取ELLIPSE实体
        ellipses = msp.query('ELLIPSE')
        ellipse_data = []
        for ellipse in ellipses:
            ellipse_data.append({
                'center': (ellipse.dxf.center[0], ellipse.dxf.center[1]),
                'major_axis': (ellipse.dxf.major_axis[0], ellipse.dxf.major_axis[1]),
                'ratio': ellipse.dxf.ratio,
                'start_param': ellipse.dxf.start_param,
                'end_param': ellipse.dxf.end_param
            })
        data['ELLIPSE'] = ellipse_data

        return data
    def remove_duplicates(self,lst):
        res = []
        seen = {}
        for i in lst:
            if i not in seen:
                seen[i] = 1
                res.append(i)
        return res
# 示例调用
if __name__ == "__main__":
    # DWG文件路径
    DWG_path = "/home/hyh/data/Maintenance_test_data/AIN.dwg"
    format = "dwg_txt"
    dwf = dwg_analysis(DWG_path,format)
    dwf_txt = dwf.dwg2data()
    output_path = os.path.join(os.path.dirname(DWG_path), os.path.basename(DWG_path).split(".")[0] + "_" +format+ ".json")
    with open(output_path, 'w', encoding='utf-8') as f:
        json.dump(dwf_txt, f, ensure_ascii=False, indent=4)



  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ODA (Open Dialogflow API) 是一种基于谷歌 Dialogflow 的开源对话接口框架。ODA 解析 demo 是指使用 ODA 框架来解析对话的演示示例。 ODA 解析 demo 演示了如何使用 ODA 框架对自然语言进行解析和理解。通过该演示,开发者可以了解如何将用户的语句转换为结构化的数据,以便更好地理解用户的意图并提供相关响应。 ODA 提供了强大的语义解析功能,支持多种自然语言处理技术,如实体识别、意图识别和对话管理。它可以将用户的输入分类为不同的意图,并提取出关键信息和实体,从而帮助开发者更好地理解用户的要求。 ODA 解析 demo 还提供了一些示例对话场景,例如预订餐厅、查询天气等。通过这些示例,开发者可以了解如何使用 ODA 框架来构建自己的对话应用程序,并根据实际需要进行定制和扩展。 ODA 解析 demo 的目的是帮助开发者更好地理解和使用 ODA 框架,以便构建出更智能、交互性更强的对话应用程序。它为开发者提供了一个简单、直观的入门方式,使他们能够快速上手并进行开发。 总而言之,ODA 解析 demo 是一个展示如何使用 ODA 框架解析对话的示例,旨在帮助开发者理解和掌握使用 ODA 框架构建对话应用程序的技巧和方法。 ### 回答2: ODA 解析 demo 是指使用 ODA(Oracle Digital Assistant)平台进行解析的演示示例。ODA 是甲骨文(Oracle)公司开发的一款多渠道语音助手平台,它可以将人类语言转化为计算机可理解的指令,并通过多种渠道交互。 ODA 解析 demo 旨在展示 ODA 平台的解析能力。在这个演示中,用户可以输入文本或语音指令,ODA 会将其解析,并尽可能准确地理解用户的意图和需求。ODA 解析 demo 可以用于多种场景,例如电子商务网站、酒店预订平台、客户服务等。通过演示,用户可以了解 ODA 平台的解析技术和其在实际应用中的效果。 ODA 解析 demo 主要包括以下步骤: 1. 用户输入:用户可以通过键盘输入文本或通过麦克风输入语音指令。 2. 语音或文本解析:ODA 平台会分析用户输入的语音或文本,并解析出其中的关键信息,如操作类型、实体信息等。 3. 意图理解:ODA 会根据用户输入的内容,确定用户的意图是什么,比如查询商品信息、预定酒店等。 4. 意图处理:ODA 根据用户的意图,执行相应的操作,比如查询数据库、调用其他服务等。 5. 操作结果返回:ODA 将操作结果返回给用户,并展示在演示界面上。 ODA 解析 demo 的目的是展示 ODA 平台的核心功能和技术特点,帮助用户了解 ODA 的解析能力和应用场景。通过这个演示,用户可以更好地理解 ODA 平台,并决定是否将其应用于自己的业务领域。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值