# _*_ 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