python快速绘制cad断面图

python绘制CAD断面

  1. 引用的python第三方库

pyautocad模块,官方文档讲解的并不多,最主要部分是连接CAD软件的讲解,示例代码极少。pyautocad是依赖于cad运行的第三方库。意味着运行代码运行时CAD必须处打开状态,否则程序就会BUG.

pyautocad 库由俄罗斯工程师 Roman Haritonov 开发,用于简化使用 Python 语言书写 AutoCAD ActiveX Automation 脚本。主要参考资料如下:

• PiPy: pyautocad 0.2.0 。

• GitHub: reclosedev/pyautocad 。

• Documentation: pyautocad’s documentation 。

math模块,python内置的标准库。主要提供了很多关于数学方面的函数。

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

  1. 绘制断面需要什么数据

          1.从CASS提取所需的高程点
          2.其他数据整理代码都可以实现,只需要填入相应的参数,处理完成后可以得到一个二维数组(第一点到个点之间的距离,高程*************)。

  1. 代码实现

"""主函数"""
import Data_collation
import Art_CAD

def main():
	pass # 自已调用相应的功能

if __name__ == "__main__":
    main()
"""数据分析模块"""
import math

def Read_Data():
    """
    排序,把点从河流的上游到下游,从左到右的方式进行排序
    原理主要根据X或Y的坐标大小进行分析
    :return: 返回正确排序的高程点
    """
    datas_list = []
    x_y = input("请输入需要按X轴或Y轴排序(输入其他字符则按Y轴处理):")
    x_y = x_y.upper()  # 将输入字母变为大写
    if x_y == "X":
        x_y = 2
    else:
        x_y = 1
    with open(r"C:\Users\n\Desktop\test\lxh.txt", "r", encoding="utf-8")as f:
        datas = f.readlines()
        for data in datas:
            data = data.strip("\n")
            data = data.split(",")
            data[2] = float(data[2])
            data[3] = float(data[3])
            data = tuple(data)
            datas_list.append(data)
        T_F = input("请输入排序方式:T或F")
        T_F = T_F.upper()
    if T_F == "T":
        new_datas_list = sorted(datas_list, key=lambda xy: xy[x_y], reverse=False)  # 排序函数
    else:
        new_datas_list = sorted(datas_list, key=lambda xy: xy[x_y], reverse=True)
    return new_datas_list  # 将正确高程点数据返回给主函数main()

def Calc_Distance(distance_datas):
    """
    计算各点与第一点的距离
    :param distance_datas: x,y的原始坐标
    :return: None
    """
    y1, x1 = distance_datas[0][2], distance_datas[0][3]
    for xy in distance_datas:
        y, x = xy[2], xy[3]
        distance = round(math.sqrt((x1 - x) ** 2 + (y - y1) ** 2), 2)  # 计算两点之间的距离公式
        with open(r"C:\Users\n\Desktop\test\S6666.txt", "a")as f:
            f.write("%s,%s,%s,%s\n" % (xy[0], distance, xy[4], xy[1]))  # 第四个是注记
"""绘图模块"""
"""
图层函数暂时还没有内容,断面图的整体框架已经出来了。
"""

from pyautocad import Autocad, aDouble, APoint

# 连接运行的cad程序,如果cad没有再运行则会自动运行并打开一个新的文件
pyacad = Autocad(create_if_not_exists=True)
# pyacad.prompt("连接CAD成功")

height_list = []  # 只含高程数据的列表

def Read_Starandtxt():
    """
    读取标准的断面数据文件*.dat
    :return: 含高程点数据的列表
    """
    with open(r"C:\Users\n\Desktop\test\aa.txt", "r")as f:
        point_data = f.readlines()
        for height_datas in point_data:
            height_datas = height_datas.strip("\n")
            height_datas = height_datas.split(",")
            height_list.append(float(height_datas[2]))  # 把高程数据增添进列表
        return point_data


def Handle1(textString, Height, Distance):
    """
    辅助注记函数,具体请可以参考pyautocad文档
    :param textString: 注记的文集信息
    :param Height: 高程
    :param Distance: 距离
    :return:
    """
    insertPnt = APoint(0, 0)
    height = 2.5
    textObj = pyacad.model.AddText(textString, insertPnt, height)
    AlignNum = 13
    textObj.Alignment = AlignNum
    insertPnt = APoint(Distance, Height)
    textObj.TextAlignmentPoint = insertPnt
    BasePoint = insertPnt
    textObj.ScaleEntity(BasePoint, 0.2)


def Point_And_Line():
    """
    画断面线和点
    :return: 没有返回值
    """
    Point_List = []  # 点坐标数据
    datas = Read_Starandtxt()  # 调用读取标准断面数据函数
    for point in datas:
        point = point.strip("\n")
        point = point.split(",")
        distance, height = float(point[1]), float(point[2])
        pyacad.ActiveDocument.SendCommand(
            "point" + chr(13) + "{}".format(distance) + "," + "{}".format(height) + chr(13))  # 发送"point"命令给cad画点
        Point_List.append(distance)  # 距离Y
        Point_List.append(height)  # 高程X
        Point_List.append(0)  # 可以为任何数字
    Point_List = aDouble(Point_List)  # 转换数据类型然后画复合线
    pyacad.model.AddPolyLine(Point_List)


def Notes():
    """
    注记信息(距离,高程,代码)
    :return: 没有返回值
    """
    datas = Read_Starandtxt()
    for point in datas:
        point = point.strip("\n")
        point = point.split(",")
        textString = point[3]
        Distance = float(point[1])
        Height = float(point[2])
        Handle1(textString, Height - 0.8, Distance)
        Handle1(Height, Height, Distance)
        Handle1(Distance, Height + 0.8, Distance)


def Outer_Frame():
    """
    画断面图的外围方框
    :return: 没有返回值
    """
    max_height = max(height_list)  # 高程的最大值和最小值
    min_heighe = min(height_list)
    point1 = [0, min_heighe - 3, 0]
    point2 = [0, max_height + 73, 0]
    point4 = [300, max_height + 73, 0]
    point3 = [300, min_heighe - 3, 0]
    point5 = [150, max_height + 73, 0]
    point6 = [150, min_heighe - 3, 0]
    frame_line = point1 + point2 + point4 + point3 + point1
    center_line = point5 + point6
    frame_line = aDouble(frame_line)
    pyacad.model.AddPolyLine(frame_line)
    center_line = aDouble(center_line)
    pyacad.model.AddPolyLine(center_line)


def Ruler():
    """
    画高程标尺
    :return: 没有返回值
    """
    max_height = max(height_list)
    min_heighe = min(height_list)
    line_start = (30, min_heighe - 3, 0, 31.5, min_heighe - 3, 0)
    line_end = (30, max_height + 3, 0, 31.5, max_height + 3, 0)
    line_start = aDouble(line_start)
    pyacad.model.AddPolyLine(line_start)
    line_end = aDouble(line_end)
    pyacad.model.AddPolyLine(line_end)
    longitudinal_line = (30, min_heighe - 3, 0, 30, max_height + 3, 0)
    longitudinal_line = aDouble(longitudinal_line)
    pyacad.model.AddPolyLine(longitudinal_line)
    TwoLine_to_point = int(min_heighe - 2)
    while True:
        line = (30, TwoLine_to_point, 0, 30.8, TwoLine_to_point, 0)
        line = aDouble(line)
        pyacad.model.AddPolyLine(line)
        insertPnt = APoint(30.8, TwoLine_to_point - 0.2)
        height = 2.5
        textObj = pyacad.model.AddText(TwoLine_to_point, insertPnt, height)
        BasePoint = insertPnt
        textObj.ScaleEntity(BasePoint, 0.2)
        TwoLine_to_point += 1
        if TwoLine_to_point >= max_height + 3:
            break


def water_line():
    """
    画水压线
    :return: 没有返回值
    """
    water_line_xy = []
    datas = Read_Starandtxt()
    for point in datas:
        point = point.strip("\n")
        point = point.split(",")
        if point[3] == "水边":
            water_line_xy.append(float(point[1]))
            water_line_xy.append(float(point[2]))
            water_line_xy.append(0)
    midpoint = (water_line_xy[0] + water_line_xy[3]) / 2
    height = water_line_xy[1]
    water_line_xy = aDouble(water_line_xy)
    pyacad.model.AddPolyLine(water_line_xy)
    Handle1("2020年12月8日", height, midpoint)


# 图层
def Layer():
    """
    增添图层,指定样式,美化断面图。
    :return:
    """
    pass


如有疑问或需数据请联系作者可留言博客或+
qq:1769190045

文章内容只供参考学习阅读,不可他用(特别商用)。侵权必追究其法律责任

————————部分内容参考他人博客文章————————

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值