最近几年,大有“三百六十行,行行转IT”之势,其中最火的语言,非Python莫属。
朋友圈里三天两头会出现“Python训练营”这样的广告,广告词是这样的:会Python的人,工作都不会太差。下面还有小伙伴们的神评论。姜工认为最亮的评论如下:会Python的人,头发都不会太多。。。
传说不想当程序猿的画图狗不是好攻城狮,姜工这两年从一本Head First Python开始读起,然后没刹住车。。。当能利用Python来解决日常结构设计工作中的问题时,特别是当看到一个for循环语句治好了我多年的。。。咳。咳。。重复性劳动时,姜工感动地内牛满面。
所以准备写一个系列博客,来介绍Python在结构工程中的应用,同时也希望有高手看到可以指点一二。
姜工准备尽量用简短的、易读懂的、稍加更改便可复用的代码,来展示问题的解决方案,争取让不了解Python的人也可以复制粘贴来解决类似的问题。但估计不可避免的还是会出现一些涉及Python语法、数据结构等的情况,所以有兴趣者可以读一读Head First Python这本书。P.S. 亲自鉴定,这本书不叫《Python从入门到放弃》
好,下面我们正式开始:
为什么是Python?Python近几年可谓炙手可热,从数据分析、科学计算,到爬虫、web开发,再到机器学习,各种应用层出不穷。
除了类似于numpy这种数值计算神库的助攻外,python有着:
简单、灵活、类似于英语的语法
庞大、活跃的开源社区
大量好用的标准库及不计其数的第三方库
完成同一个任务,C语言要写1000行代码,Java只需要写100行,而Python可能只要20行。对于大量非科班程序猿出身的人来说,Python无疑可以大幅降低入门门槛,提高解决问题的效率。至于语言性能带来的计算时间差,姜工相信C语言的0.001秒和Python的0.1秒,对于绝大部分人来说没有区别。
关于python在结构工程中的应用,姜工研究了CAD制图及数据提取、桩基批量计算、数据可视化、SAP2000/YJK后处理等。
下面简单罗列一些已开发的工具:
钢结构-平面线型转换自动化程序
主要功能:
如下图所示,可将平面线图,根据梁柱类型自动生成图纸
主要逻辑:
柱内的主次梁线会自动切掉
次梁遇到主梁会自动打断
主梁会增加两端刚接符号
次梁为两端铰接符号
效果如下:
等高线云图
桩基计算
结构攻城狮,每天都要和CAD打交道,AutoCAD虽然有很多好用的功能和命令,但仍然无法避免要手工做很多重复性的绘制工作。上面提到的钢结构梁平面图就是一个,需要手动画一根根pline线、再手动加刚铰接符号。而利用程序,只需简单的画一些支线,鼠标点一下,一张梁平面图就自动生成了。
今天姜工先从最简单的Python操纵CAD文件开始介绍,以后慢慢再介绍类似于生成梁平面图的那些复杂的算法和功能。
谈到CAD,大家默认的就是AutoDesk公司的AutoCAD,其文件格式是dwg。很可惜,dwg是AutoDesk公司私有的数据格式,其它软件理论上是不可以读取的(ODA公司对其进行了逆向工程,但这是后话),所以Python不借助AutoCAD软件是不能读取、操纵dwg文件的。利用pyautocad库,可以在AutoCAD软件的基础上操纵,但是AutoCAD体型巨大、且版本较多,编程体验相当不好。
令人欣喜的是,Manfred Moitzi大神编写了ezdxf这个第三方库,可以读取、操纵dxf格式的文件,且文档详细。大神本人也很nice,之前几次邮件请教,都是很快就给了回复。上面编写的钢结构梁平面程序就是基于这个库的实现。
下面简单介绍Python和第三方包的安装,及几个基于ezdxf库绘制CAD图纸的简单功能:
Python主要分为Python2和Python3两个版本,互相不兼容,姜工建议采用Pyhton3。在python.org下载安装包安装即可,考虑到兼容性,建议大家选择Python3.6,毕竟以后介绍的机器学习pytorch、TensorFlow等库对3.7和3.8可能还没有完全支持。
Python安装好以后,就要安装第三方库了,很抱歉,从现在开始大家要使用命令行了,Windows打开cmd,Mac打开Terminal,输入
pip install ezdxf
执行完毕后,ezdxf库就安装好了。
绘图任务是,在(0,0)(100,0) (200,0) (300,0)四个坐标上分别画5,10,15,20半径的四个圆。
好,我们开始码代码,请打开Python的IDlE,输入:
import ezdxfdwg = ezdxf.new()msp = dwg.modelspace()
这样图纸创建完毕了,dwg代表图纸,msp代表图纸空间。
下面开始画圆,输入:
msp.add_circle((0,0),radius=5)msp.add_circle((100,0),radius=10)msp.add_circle((200,0),radius=15)msp.add_circle((300,0),radius=20)
如果你对python语法熟悉的话,同样四个圆,甚至N个圆都可以两行代码解决:
for i in range(1,5): msp.add_circle((100 * i ,0),radius= 5 * i)
现在四个圆已经画好了,你肯定要问在哪?在内存里。。。好吧,让我们把图纸保存下载,命名为test.dxf好了,输入:
dwg.saveas('test.dxf')
然后看一下文件夹:
看,图纸已经在这了。
我们打开看一下。
四个圆,完美!
你肯定会说,我们多数的时候是改图或者是从图纸里获取信息。好的,那么我们再新写一段代码:
目标,把刚才的四个圆,半径大于12的改成红色,并在圆心处写上BIG,字高为5。
打开我们刚才的test.dxf
import ezdxfdwg = ezdxf.readfile('test.dxf') #这一步是读取msp = dwg.modelspace()
下面开始处理文件
circles = msp.query('CIRCLE') #找到所有圆for each in circles: #遍历circles,对每个元素执行 center = each.dxf.center #圆心坐标 if each.dxf.radius > 12: #如果半径大于12 each.dxf.color = 1 #把颜色设为1 text = msp.add_text('BIG').set_pos(center) #圆形处写上BIG text.dxf.height = 5 #字高定为半径 dwg.save() #保存文件
在打开test.dxf看一下:
完美!
好了,今天先介绍到这里,希望大家对ezdxf库有了初步的了解,大家如果有兴趣可以自己手敲一遍以上的代码,相信一定会有更深的理解。
未完待续。不定时更新。