- 积分
- 1379
- 明经币
- 个
- 注册时间
- 2023-2-2
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
[ 本帖最后由 箭头_Row 于 2023-2-25 21:56 编辑 ]\n\n[ 本帖最后由 箭头_Row 于 2023-2-25 21:54 编辑 ]\n\n[ 本帖最后由 箭头_Row 于 2023-2-25 15:04 编辑 ]\n\n人生苦短,学点Python:
代码逻辑如下:
STEP 1:在dwg图中框选图元过滤出多段线。
STEP 2:获取多段线的起点坐标、长度,然后排序、编号。
STEP 3:选定的多段线起点处画图且插入文字提示编号及多段线的长度。
STEP 4:在指定dwg中绘制出文字
STEP 5:将编号、长度、坐标信息输出到EXCEL表格。
[code]
# env Python = 3.11.1 AutoCAD 2022(一定要指定具体的ProgramID)
# pip package: pywin32 = 305 pyautocad = 0.2.0 xlwings = 0.29.1
# -*- coding: utf-8 -*-
"""
=============================
Author: Meditation/箭头
Email: 1191101855@qq.com
Last Update: 2023.02.23 20:22
=============================
"""
import win32com.client as win32
import pythoncom
# Autocad 2022的ProgramID
ProgramID = "AutoCAD.Application.24.1"
# 获取CAD程序
Acadapp = win32.Dispatch(ProgramID)
# 指定当前活动文档
doc = Acadapp.ActiveDocument
msp = doc.ModelSpace
print(doc.Path, '\\', doc.Name, sep='')
# 数据转换
def vtpnt(x, y, z=0):
"""坐标点转化为浮点数"""
return win32.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, (x, y, z))
def vtobj(obj):
"""转化为对象数组"""
return win32.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_DISPATCH, obj)
def vtlstf(lst):
"""列表转化为浮点数"""
return win32.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, lst)
def vtlsti(lst):
"""列表转化为整数"""
return win32.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_I2, lst)
def vtlstvariant(lst):
"""列表转化为变体"""
return win32.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_VARIANT, lst)
from AutoCAD13坐标取整_new import My_Select
# 图中框选选择集
slt = My_Select()
entity_Length_list = []
first_point_lst = []
# 记数多段线
count = 0
# 遍历选择集
for entity in slt:
if entity.objectname == 'AcDbPolyline':
entity_Coor = entity.Coordinates
entity_Length = round(entity.Length,2)
entity_Length_list.append(entity_Length)
first_point = entity_Coor[0:2]
first_point_lst.append(first_point)
# 记数多段线
count += 1
print(entity_Length_list)
print(first_point_lst)
doc.Utility.Prompt(f'已编号{count}条!')
"""以下是对坐标列表排序和对长度排序"""
coordinates_list = []
for i, pline in enumerate(first_point_lst):
coordinates_list.append([pline[0], pline[1], i])
print('多段线起点排序前', coordinates_list)
# 对坐标列表进行排序,按照第一项(即y坐标)从大到小排序,第二项(即x坐标)从小到大排序,即从左到右,从上到下排列
sorted_coordinates_list = sorted(coordinates_list, key=lambda x: (-x[1], x[0]))
print('多段线起点排序后', sorted_coordinates_list, '排序方式为:从左到右,从上到下')
# 获取排序后索引号列表
index_list = [item[2] for item in sorted_coordinates_list]
print('多段线排序索引号',index_list)
print('多段线长度排序前',entity_Length_list)
# 根据多段线起点排序索引列表排序多段线长度列表
sorted_length_list = []
for i in index_list:
sorted_length_list.append(entity_Length_list[i])
print('多段线长度排序后',sorted_length_list)
""" 遍历坐标,Z轴设为0,dwg中添加圆、文字注释"""
for i, pline_star in enumerate(sorted_coordinates_list):
pline_star[2] = 0
new_Coor = vtlstf(pline_star)
# 画圆及加文字
entityobj01 = doc.ModelSpace.AddCircle(new_Coor, 0.5)
entityobj02 = doc.ModelSpace.AddText(f'编号:{i+1} 长度:{sorted_length_list[i]}米', new_Coor, 0.3)
# 文字对齐方式、对齐坐标点
entityobj02.Alignment = 2
entityobj02.TextAlignmentPoint = new_Coor
print('多段线起点排序后', sorted_coordinates_list)
"""以下是EXCEL代码"""
import xlwings as xw
# 导入xlwings模块,打开Excel程序,默认设置:程序可见,只打开不新建工作薄,屏幕更新关闭
app=xw.App(visible=True,add_book=False)
# 新建 Excel 文档
wb=app.books.add()
# 输出编号
wb.sheets['sheet1'].range('A1').value = '编号'
for i in range(len(sorted_length_list)):
wb.sheets['sheet1'].range(f'A{i+2}').value = i + 1
# 输出出长度
wb.sheets['sheet1'].range('B1').value = '长度'
for i in range(len(sorted_length_list)):
wb.sheets['sheet1'].range(f'B{i+2}').value = sorted_length_list[i]
# 将元组转换为字符串,用","作为分隔符。备注:避免tuple自动换行。
sorted_coordinates_list = [",".join(map(str, tpl)) for tpl in sorted_coordinates_list]
# 输出坐标点
wb.sheets['sheet1'].range('C1').value = '起点坐标(可复制)'
for i in range(len(sorted_coordinates_list)):
wb.sheets['sheet1'].range(f'C{i+2}').value = sorted_coordinates_list[i]
# 自動調整第C列的列寬
wb.sheets['sheet1'].range('C:C').autofit()
[/code]
这个代码有一个BUG,没有对多段线中的坐标点进行排序,如果绘制的多段线起点一会左一会右,会导致编号后的多段线显示的不美观。
另上述代码没有写函数,操作一步到底,仅只对选择集进行了封装。因本人初学,想知道上述代码还有哪些地方可以改善加快运行速度,因本人测试发现确实以上代码读取速度太慢了。故分享出来望大佬们指导修正下。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
x
|