基本上,我正在处理Blender上保存在.dxf文件中的一组2D实体。我需要从Blender中的.dxf文件中读取一些点,以便稍后测量它们之间的距离(它们通常是polyline的转折点),而且它们似乎没有一个特定的名称来帮助我识别它们。
我读过关于dxf解析器的文章,但它暗示了Node.js的使用和知识,因此我需要用Python来完成它。最后,我还会接受一些关于如何在python中执行Node.js脚本的建议,这些脚本将把我的.dxf文件转换成json。
发布于 2022-02-25 07:15:34
要回答您的问题: Node.js是一个使用来自任何地方的包的框架,包括python。您永远不会直接使用Node.js来完成这样的转换工作,因为此类工作应该属于特定的包(不管是已经开发它的人还是您正在开发的东西),比如python。
我也在做同样的项目,做同样的转换,这是相当直观和直接的。我的做法是:
创建一个python包,作为一个整体完成转换工作,从https://ezdxf.readthedocs.io/en/stable/introduction.html
)提供了您所需的属性。
我有一个代码片段,它简要地告诉您如何提取.dxf文件的层,您可以参考这些代码片段:
from datetime import datetime
import json
import sys
from typing import Optional, Tuple
from unittest.mock import _ANY
from ezdxf.filemanagement import readfile
class Scanner:
__filename: str = ''
__version: str = ''
__output: dict = {}
__layer: dict = {}
__current_layer: dict = {}
def print(self):
print(self.__output)
def __init__(self):
return
def read_file(self, file: str):
# read the name of the file as string
# & update it for the private variable
self.__filename = file
self.__output['name'] = self.__filename
try:
# store the dxf file as 'Drawing' class into __content
# self.__content = readfile('%s.dxf' % file, errors='ignore')
self.__content = readfile(file)
except IOError:
# print('Not a DXF file or a generic I/O error.')
print(IOError.strerror)
sys.exit(1)
except UnicodeDecodeError:
print('Illegal sequence of str characters')
sys.exit(2)
def analyze(self):
print('analyzing...')
self.__output['Date'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
self.__output['Unit'] = str(self.__content.units)
self.analyze_layers()
# self.analyze_entities()
# print(self.__output.get('Date'))
print('analyze finished')
def analyze_layers(self):
handle: _ANY
owner: str
name: str
flags: str
color: str
true_color: str
line_type: str
plot: str
line_weight: str
plotstyle_handle: str
material_handle: str
rgb: Optional[Tuple[int, int, int]]
description: str
transparency: float
print('analyzing layers...')
doc = self.__content
# extract information within layers &
# store them within a dict
for layer in doc.layers:
self.__current_layer['handle'] = layer.dxf.handle
self.__current_layer['owner'] = str(layer.dxf.owner)
# name_binary = layer.dxf.name
# name_utf8 = name_binary.encode('ascii').decode('utf-8')
# self.__current_layer['name'] = str(name_utf8)
self.__current_layer['name'] = layer.dxf.name
self.__current_layer['flags'] = str(layer.dxf.flags)
self.__current_layer['color'] = str(layer.color)
self.__current_layer['true_color'] = str(layer.dxf.true_color)
self.__current_layer['line_type'] = str(layer.dxf.linetype)
self.__current_layer['plot'] = str(layer.dxf.plot)
self.__current_layer['line_weight'] = str(layer.dxf.lineweight)
self.__current_layer['plotstyle_handle'] = str(
layer.dxf.plotstyle_handle)
self.__current_layer['material_handle'] = str(
layer.dxf.material_handle)
self.__current_layer['rgb'] = layer.rgb
self.__current_layer['description'] = layer.description
self.__current_layer['transparency'] = layer.transparency
# store __current_layer dict to self.__current_layer
self.__layer[str(layer.dxf.name)] = self.__current_layer
# reset self.__current_layer
self.__current_layer = {}
self.__output['layers'] = self.__layer
print('layer analyze finished')
def analyze_entities(self):
def analyze_images(self):
def tojson(self):
# Serializing json
json_object = json.dumps(self.__output, indent=4, ensure_ascii=False)
with open("sample.json", "w", encoding='utf-8') as outfile:
outfile.write(json_object)
print(json_object)
https://stackoverflow.com/questions/69440436
复制相似问题