Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中以编程方式更改AutoCAD对象的特性_Python_Win32com_Autocad_Dxf_Dwg - Fatal编程技术网

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

如何在Python中以编程方式更改AutoCAD对象的特性,python,win32com,autocad,dxf,dwg,Python,Win32com,Autocad,Dxf,Dwg,我想使用Python自动处理一组AutoCAD图形。为此,我需要以编程方式更改图形图元的属性。我已经挣扎了一段时间,但毫无结果 这是我用来读取.dxf并打开.dwg文件的代码: 导入win32com.client 导入dxfgrabber 导入操作系统 folder=r'C:\path\to\my\folder' 文件名='我的文件' dwg_path=os.path.join(文件夹,文件名+'.dwg') dxf_path=os.path.join(文件夹,文件名+'.dxf') acad=

我想使用Python自动处理一组AutoCAD图形。为此,我需要以编程方式更改图形图元的属性。我已经挣扎了一段时间,但毫无结果

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

导入win32com.client
导入dxfgrabber
导入操作系统
folder=r'C:\path\to\my\folder'
文件名='我的文件'
dwg_path=os.path.join(文件夹,文件名+'.dwg')
dxf_path=os.path.join(文件夹,文件名+'.dxf')
acad=win32com.client.dynamic.Dispatch(“AutoCAD.Application”)
doc=acad.Documents.Open(图纸路径)
acad.Visible=True
dxf=dxfgrabber.readfile(dxf\u路径)
然后我迭代放置在名为
FirstLayer
的层中的对象,并选择其中一个:

item=[如果obj.layer=='FirstLayer',则dxf.entities中的obj对应于obj][0]
此特定实体是一个文本对象:

[1122]中的
:类型(项)
Out[1122]:dxfgrabber.dxfentities.Text
在[1123]中:item.insert
Out[1123]:(4022.7639569047453518.3718771351910.0)
在[1124]中:item.layer
Out[1124]:“第一层”
在[1125]中:item.handle
Out[1125]:“298”
我的目标是更改属性,例如
颜色
图层
,等等。这是我尝试将文本对象移动到另一个名为
第二层
的图层的一次尝试:

doc.SendCommand(f'CHPROP{item.insert[0]},{item.insert[1]}LA\n第二层\n')
我想问题在于,无法通过插入点的坐标选择对象。我还尝试(未成功)使用以下脚本通过其句柄选择对象:

_CHPROP (handent 298) _LA SecondLayer 
关于如何解决这个问题有什么想法吗


编辑
在@Lee Mac发布其出色答案之前,我提出了以下解决方案:

doc.SendCommand(f'CHPROP(handent“{item.handle}”)\n\u LA SecondLayer\n')

DXF文件中的句柄存储为十六进制字符串,可能AutoCAD需要一个整数值,但我不是AutoCAD专家(@LeeMac)。在Python中通过
int('298',16)
将十六进制字符串转换为int在发出
CHPROP
命令后,后续的对象选择提示将要求您提供一个或多个实体名称(可通过使用AutoLISP
handent
函数转换句柄获得),或提供一个选择集(可使用AutoLISP函数获得)

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

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

_$ (handent "3B8")
<Entity name: 7ffff706880>

谢谢你,曼弗雷德:-)我必须在列表后添加一个换行符,代码才能开始工作
doc.SendCommand(f'CHPROP(ssget“x”(list(cons 8“FirstLayer”))\n LA\n SecondLayer\n')
成功了。在等待答案时,我想出了一个解决方案(请参阅我编辑的问题)。非常感谢。
doc.SendCommand(f'CHPROP (ssget "_x" (list (cons 8 "FirstLayer"))) LA\n SecondLayer\n ')