目录
- 一、装环境
- 1、下载 ODAFileConverter
- 2、安装 ODAFileConverter
- (1)、安装 gdebi 来处理依赖关系
- (2)、使用 gdebi 安装 DEB 包
- 3、解决 libxcb库问题
- (1)、安装依赖
- (2)、确认 libxcb-util.so.1 是否存在
- (3)、创建符号链接
- 4、安装python包
- 二、上代码
一、装环境
这里搞的人头疼,装了一大堆,各种报错,最后也不知道是靠哪个包运行成功的,反正成了
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 reclass file2geo:def __init__(self, filepath):self.filepath = filepath# self.layername = layernamedef dwg2txt(self):dxf_file = os.path.join(os.path.dirname(DWG_path), os.path.basename(DWG_path).split(".")[0] + ".dxf")# dwg文件转换为2000格式的dxf文件, 因为ogr不支持读取高版本dwgodafc.convert(self.filepath, dxf_file, version='R2000', replace=True) only_txt = dict()only_txt['TEXT'] = []# 打开DXF文件doc = ezdxf.readfile(dxf_file)# 获取所有TEXT类型的实体texts = doc.modelspace().query('TEXT')# 提取文本内容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)only_txt['TEXT'].append(decoded_str)print(decoded_str)self.save_to_json(only_txt)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 = []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_dataself.save_to_json(data)def save_to_json(self,dicts):output_path = os.path.join(os.path.dirname(DWG_path), os.path.basename(DWG_path).split(".")[0] + "_dwg" + ".json")with open(output_path, 'w', encoding='utf-8') as f:json.dump(dicts, f, ensure_ascii=False, indent=4)# 示例调用
if __name__ == "__main__":# DWG文件路径DWG_path = "/path/to/your/data.dwg"# 创建file2geo实例converter = file2geo(DWG_path)# 调用dwg2txt方法查看内容并保存converter.dwg2txt()# converter.dwg2data()