"""
铁塔计算小工具 (Tower Calculation Tool)
=====================================
输入抗风级别、塔高、塔型、材质等参数,
自动生成铁塔计算书(Word文档)和铁塔图纸(PNG图片)。
使用方法:
命令行模式:
python main.py --wind-level 10 --height 30 --type 自立塔 --material Q345
交互模式:
python main.py -i
默认参数:
python main.py
依赖: matplotlib, python-docx, numpy
"""
import argparse
import os
import sys
from tower_calc import TowerCalculator, WIND_LEVEL_TABLE, MATERIAL_PROPS, VOLTAGE_PARAMS, WIRE_TABLE
from tower_draw import TowerDrawer
from report_gen import ReportGenerator
def parse_args():
parser = argparse.ArgumentParser(
description="铁塔计算小工具 - 输入参数自动生成铁塔计算书和图纸",
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog="""
示例:
python main.py --wind-level 10 --height 30 --type 自立塔 --material Q345
python main.py --wind-level 12 --height 45 --type 自立塔 --material Q345 --voltage 220kV
python main.py -i (交互模式)
""")
parser.add_argument("--wind-level", type=int, default=10,
help="抗风级别 (8-17级),默认10级")
parser.add_argument("--height", type=float, default=30,
help="塔高(m),默认30m")
parser.add_argument("--type", dest="tower_type", default="自立塔",
choices=["自立塔", "拉线塔", "单杆塔"],
help="塔型:自立塔/拉线塔/单杆塔,默认自立塔")
parser.add_argument("--material", default="Q345",
choices=list(MATERIAL_PROPS.keys()),
help="材质:Q235/Q345/Q390/Q420,默认Q345")
parser.add_argument("--voltage", default="110kV",
choices=list(VOLTAGE_PARAMS.keys()),
help="电压等级,默认110kV")
parser.add_argument("--wire", default="LGJ-240/30",
choices=list(WIRE_TABLE.keys()),
help="导线型号,默认LGJ-240/30")
parser.add_argument("--wire-count", type=int, default=3,
help="导线根数,默认3")
parser.add_argument("--terrain", default="B",
choices=["A", "B", "C", "D"],
help="地形类别:A/B/C/D,默认B")
parser.add_argument("--safety-level", type=int, default=2,
choices=[1, 2, 3],
help="安全等级:1/2/3,默认2")
parser.add_argument("-i", "--interactive", action="store_true",
help="交互输入模式")
parser.add_argument("--output-dir", default="output",
help="输出目录,默认output")
return parser.parse_args()
def interactive_input():
"""交互式输入参数"""
print("=" * 50)
print(" 铁塔计算小工具 - 参数输入")
print("=" * 50)
print(f"\n可选抗风级别: {sorted(WIND_LEVEL_TABLE.keys())}")
wind_level = int(input("请输入抗风级别 [默认10]: ") or "10")
height = float(input("请输入塔高(m) [默认30]: ") or "30")
print("可选塔型: 自立塔, 拉线塔, 单杆塔")
tower_type = input("请输入塔型 [默认自立塔]: ") or "自立塔"
print(f"可选材质: {list(MATERIAL_PROPS.keys())}")
material = input("请输入材质 [默认Q345]: ") or "Q345"
print(f"可选电压等级: {list(VOLTAGE_PARAMS.keys())}")
voltage = input("请输入电压等级 [默认110kV]: ") or "110kV"
print(f"可选导线: {list(WIRE_TABLE.keys())}")
wire = input("请输入导线型号 [默认LGJ-240/30]: ") or "LGJ-240/30"
wire_count = int(input("请输入导线根数 [默认3]: ") or "3")
print("可选地形: A, B, C, D")
terrain = input("请输入地形类别 [默认B]: ") or "B"
safety = int(input("请输入安全等级(1/2/3) [默认2]: ") or "2")
return {
"wind_level": wind_level,
"tower_height": height,
"tower_type": tower_type,
"material": material,
"voltage": voltage,
"wire_type": wire,
"wire_count": wire_count,
"terrain_type": terrain,
"safety_level": safety,
}
def run_calculation(params, output_dir="output"):
"""执行完整计算流程"""
os.makedirs(output_dir, exist_ok=True)
print("\n" + "=" * 60)
print(" 铁塔结构计算")
print("=" * 60)
print("\n【输入参数】")
for k, v in params.items():
print(f" {k:20s}: {v}")
print("\n[1/3] 正在执行结构计算...")
calc = TowerCalculator(**params)
results = calc.run_all()
print(" ✓ 计算完成")
print("\n【计算结果摘要】")
print(f" 设计风速 : {results.get('设计风速', 0):.1f} m/s")
print(f" 基本风压 : {results.get('基本风压_w0', 0):.4f} kN/m²")
print(f" 塔身总风荷载 : {results.get('塔身总风荷载', 0):.2f} kN")
print(f" 导线风荷载 : {results.get('导线风荷载', 0):.2f} kN")
print(f" 基底弯矩 : {results.get('基底弯矩', 0):.2f} kN·m")
print(f" 基底剪力 : {results.get('基底剪力', 0):.2f} kN")
print(f" 基底轴力 : {results.get('基底轴力', 0):.2f} kN")
print(f" 主材规格 : {results.get('主材规格', 'N/A')}")
print(f" 主材应力比 : {results.get('应力比', 0):.3f}")
print(f" 基础边长 : {results.get('基础边长', 0):.2f} m")
print(f" 抗倾覆系数 : {results.get('整体抗倾覆系数', 0):.3f}")
print(f" 抗滑移系数 : {results.get('整体抗滑移系数', 0):.3f}")
member_ok = "✓通过" if results.get('主材验算通过') else "✗不通过"
found_ok = "✓通过" if results.get('基础验算通过') else "✗不通过"
stab_ok = "✓通过" if results.get('整体稳定验算通过') else "✗不通过"
print(f"\n 主材验算: {member_ok} 基础验算: {found_ok} 整体稳定: {stab_ok}")
print("\n[2/3] 正在绘制铁塔图纸...")
drawer = TowerDrawer(results, params)
img_paths = drawer.draw_all(output_dir)
print(f" ✓ 立面图: {img_paths.get('立面图', '')}")
print(f" ✓ 截面图: {img_paths.get('截面图', '')}")
print(f" ✓ 内力图: {img_paths.get('内力图', '')}")
print("\n[3/3] 正在生成计算书(Word文档)...")
report = ReportGenerator(results, params)
report_path = os.path.join(output_dir, "tower_calc_report.docx")
report.generate(report_path)
print(f" ✓ 计算书: {report_path}")
print("\n" + "=" * 60)
print(" 全部完成!输出文件在:", output_dir)
print("=" * 60)
return results, img_paths, report_path
def main():
args = parse_args()
if args.interactive:
params = interactive_input()
else:
params = {
"wind_level": args.wind_level,
"tower_height": args.height,
"tower_type": args.tower_type,
"material": args.material,
"voltage": args.voltage,
"wire_type": args.wire,
"wire_count": args.wire_count,
"terrain_type": args.terrain,
"safety_level": args.safety_level,
}
run_calculation(params, args.output_dir)
if __name__ == "__main__":
main()