如何在Python中以编程方式更改AutoCAD对象的属性

问题描述 投票:1回答:2

我想使用Python自动处理一堆AutoCAD图形。为此,我需要以编程方式更改图形实体的属性。我挣扎了一段时间,无济于事。

这是我用来读取.dxf并打开.dwg文件的代码:

import win32com.client
import dxfgrabber
import os

folder = r'C:\path\to\my\folder'
filename = 'my_file'

dwg_path = os.path.join(folder, filename + '.dwg')
dxf_path = os.path.join(folder, filename + '.dxf')

acad = win32com.client.dynamic.Dispatch("AutoCAD.Application")
doc = acad.Documents.Open(dwg_path)
acad.Visible = True

dxf = dxfgrabber.readfile(dxf_path)

然后我遍历放置在名为FirstLayer的图层中的对象,然后选择其中之一:

item = [obj for obj in dxf.entities if obj.layer == 'FirstLayer'][0]

此特定实体是文本对象:

In [1122]: type(item)
Out[1122]: dxfgrabber.dxfentities.Text

In [1123]: item.insert
Out[1123]: (4022.763956904745, 3518.371877135191, 0.0)

In [1124]: item.layer
Out[1124]: 'FirstLayer'

In [1125]: item.handle
Out[1125]: '298'

我的目标是更改colorlayer等属性。这是我尝试将文本对象移动到另一个名为SecondLayer的层的尝试之一。

doc.SendCommand(f'CHPROP {item.insert[0]},{item.insert[1]} LA\n SecondLayer\n ')

我想问题是无法通过插入点的坐标选择对象。我还尝试使用以下脚本(未成功)通过其句柄选择对象:

_CHPROP (handent 298) _LA SecondLayer 

关于如何解决此问题的任何想法?

python win32com autocad dxf dwg
2个回答
1
投票

发出CHPROP命令后,随后的对象选择提示将要求您提供一个或多个实体名称(可以通过使用AutoLISP handent函数转换句柄来获得),或提供选择集(可以使用AutoLISP ssget功能获得)。

您与ssget的使用非常接近,但是AutoCAD中的实体句柄由十六进制字符串表示,因此您需要为handent函数提供一个带有双引号括起来的字符串参数,例如:

handent

如果提供的句柄有效,则(handent "298") 将返回实体名称指针:

handent

但是,由于_$ (handent "3B8") <Entity name: 7ffff706880> 接受选择集参数,因此您不必遍历每个实体,而只需向CHPROP提供一个过滤器选择集,例如:

CHPROP

0
投票

DXF文件中的句柄存储为十六进制字符串,也许AutoCAD需要一个整数值,但我不是AutoCAD专家(@LeeMac)。通过doc.SendCommand(f'CHPROP (ssget "_x" (list (cons 8 "FirstLayer"))) LA\n SecondLayer\n ') 在Python中将HEX字符串转换为int。

© www.soinside.com 2019 - 2024. All rights reserved.