基于python的CAD路基横断面绘制

源代码

# _*_ coding:utf-8- _*_

from pyautocad import APoint, Autocad, aDouble
import win32com.client
import numpy as np
"""
设计高程:(2)1654.0m
填土边坡与路堑边坡坡率:(1)填方上部1:1.2(高度≤8m),填方下部1:1.4(高度≤12m) ;挖方1:0.9(高度≤20m)
路基宽度:(2) 路面宽7.0米,硬路肩宽0.75米,土路肩宽0.75米
以下数据单位:m
"""
design_height = 1654.0  # 设计高程
slop_fill_up = 1.2      # 坡率填方上部(高度≤8m)
slop_fill_down = 1.4    # 坡率填方下部(高度≤12m)
slop_cut = 0.9          # 坡率挖方(高度≤20m)
surface_width = 7.0     # 路面宽
hard_shoulder = 0.75    # 硬路肩宽
dirt_shoulder = 0.75    # 土路肩宽

ctfs = 10               # 出图坐标放缩倍数
distance_sections = 60  # 修改为出图时横断面桩号间距
# 连接excel读取数据

xlapp = win32com.client.Dispatch("Excel.Application")
wb = xlapp.ActiveWorkbook
ws = xlapp.ActiveWorkbook.ActiveSheet


# points是原始地面点高程
ground_points = []
row = 2
while row <= 20:
    i = 6               # 左侧数据
    j = 8               # 右侧数据

    # 桩号点绘图坐标
    x0 = 0 + (distance_sections * (row - 2))//3
    y0 = ws.cells(row, 7).value
    p0 = APoint(x0, y0)
    pts = []
    pts.append(p0)


    #  拾取左侧点数据
    while i >= 1:
        try:
            y_ = ws.cells(row, i).value
            x_ = - ws.cells(row + 1, i).value
            pti = pts[0] + (x_, y_, 0)
            pts.insert(0, pti)
        except:
            pass
        i -= 1
    #  拾取右侧点数据
    while ws.cells(row, j).value:
        y_ = ws.cells(row, j).value
        x_ = ws.cells(row + 1, j).value
        ptj = pts[-1] + (x_, y_, 0)
        pts.append(ptj)
        j += 1
    ground_points.append(pts)

    for i in pts:
        print(i)
    print("")
    row = row + 3



# 连接cad,并输出结果

acad = Autocad(create_if_not_exists=True)
acad.prompt("connect with the Autocad successfully.")
print("connect with the Autocad successfully.")

dwg = acad.ActiveDocument
"原始地面线"
# 定义原始地面线 图层
ysdmx = acad.doc.layers.add("原始地面线")
ysdmx.color = 7
ysdmx.LineWeight = 25
dwg.ActiveLayer = ysdmx
# 绘制原始地面线,使用多段线(PLine)
for line_pts in ground_points:
    pt = aDouble([j for i in line_pts  for j in i * ctfs])
    acad.model.AddPolyLine(pt).LineWeight = 25

"路基线"
# 绘制路基线,所有横断面路基线按一样绘制,手动修改
# 生成路基线关键点坐标
orginal_middl_pts = []
pt0 = APoint(0, design_height)
orginal_middl_pts.append(pt0)
rightpts = [(surface_width/2, 0), (hard_shoulder, 0), (dirt_shoulder, 0), (0.6, - 0.6), (0.6, 0), (0.6, 0.6), (1, 0), (20 * slop_cut, 20)]
leftpts = [(surface_width/2, 0), (hard_shoulder, 0), (dirt_shoulder, 0), (8 * slop_fill_up, 8), (2, 0), (12 * slop_fill_down, 12)]


for i in leftpts:
    pti = orginal_middl_pts[0] - (i[0], i[1], 0)
    orginal_middl_pts.insert(0, pti)
for j in rightpts:
    ptj = orginal_middl_pts[-1] + (j[0], j[1], 0)
    orginal_middl_pts.append(ptj)
# 定义路基线 图层
ljx = acad.doc.layers.add("路基线")
ljx.color = 1
ljx.LineWeight = 100
dwg.ActiveLayer = ljx
# 绘制路基,使用多段线(PLine)
pt = aDouble([i for j in orginal_middl_pts  for i in j * ctfs])
ljx_drawn = acad.model.AddPolyLine(pt)
ljx_drawn.LineWeight = 100




"道路中心线"
# 得到坐标

# 定义图层属性
zxj = acad.doc.layers.add("道路中心线")
zxj.color = 2
zxj.LineWeight = 25
try:
    acad.ActiveDocument.Linetypes.Load("ACAD_ISO10W100", "acadiso.lin")
except:
    pass
zxj.Linetype = "ACAD_ISO10W100"
dwg.ActiveLayer = zxj
# 绘制中线
zxj_drewn = acad.model.addline(ctfs * (pt0 - (0, 2, 0)), ctfs * (pt0 + (0, 2, 0)))
zxj_drewn.LineWeight = 25
# [中心线、路基线]向右复制6次
for i in range(6):
    _ = ljx_drawn.copy()
    _.Move(APoint(0, 0), APoint(distance_sections * (i + 1), 0) * ctfs)
    del _
    _ = zxj_drewn.copy()
    _.Move(APoint(0, 0), APoint(distance_sections * (i + 1), 0) * ctfs)

"添加桩号标注"
# 得到坐标
# 定义图层
zh = acad.doc.layers.add("桩号标注")
dwg.ActiveLayer = zh
# 添加注释
for i in range(7):
    text_string = "K58+%d" % (70 + 10 * i)
    insertpt = APoint((distance_sections * i), design_height - 7) * ctfs
    height = 2.5 * ctfs
    textobj = acad.model.addtext(text_string, insertpt, height)
    textobj.Alignment = 7
    textobj.textalignmentpoint = insertpt