明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1352|回复: 2

关于获取多段线编号.长度.坐标输出到EXCEL表格,且在指定dwg中绘制出文字

[复制链接]
发表于 2023-2-25 13:32:49 | 显示全部楼层 |阅读模式
[ 本帖最后由 箭头_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
 楼主| 发表于 2023-2-25 14:51:45 | 显示全部楼层
[ 本帖最后由 箭头_Row 于 2023-2-25 14:58 编辑 ]\n\n# 根据多段线起点排序索引列表排序多段线长度列表
sorted_length_list = []
for i in index_list:
    sorted_length_list.append(entity_Length_list)
print('多段线长度排序后',sorted_length_list)

这一段代码的第三行复制粘贴上去丢失了,修改了好几次不知道为什么发贴时添加不上去。

已经上传附件了。貌似是换行符问题。
发表于 2023-2-25 16:14:09 | 显示全部楼层
关注备用         
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-17 21:16 , Processed in 0.140571 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表