刘 娜
(北京全路通信信号研究设计院集团有限公司,北京 100070)
当前最为广泛应用的AutoCAD二次开发语言有:LISP、C、VBA语言等。LISP语言因为可以直接调用AutoCAD的命令,因此在CAD辅助软件设计中被应用的最广泛。
但LISP语言的缺点也比较明显,大致列举如下:
1) 功能比较单一,综合处理能力差;
2) 解释执行,程序运行速度慢;
3) 缺乏很好的保护机制,源程序保密性差;
4) 不能直接访问硬件设备、进行二进制文件的读写。
由于集中监测系统所有采集内容都来自外部输入,具备采集内容灵活多样,输入数据庞大,数据处理复杂等特点,因此作为集中监测辅助工程设计工具的开发语言一定要在灵活性,以及处理庞大复杂数据方面具有绝对的优势。
基于这个考虑,寻找一种更为简洁,功能更全面,可读性更强的语言,可以调用AutoCAD的命令,从而实现CAD的辅助设计。
Python是面向对象的程序设计语言,比传统结构化的语言更适合于大型软件的开发,实现高度抽象的数据模型。作为脚本语言,它具有许多高级数据类型,如列表、字典、元组等,比系统语言更容易实现复杂的数据结构.由于脚本语言的胶合性,使它易于利用已有组件实现系统的功能。
得力于Python丰富的内建模块和三方模块,Python可通过在Unix或Windows上调用系统语言C/C++的扩展模块,或利用已有函数包来提高大量数据处理的运行速度。
综合分析,Python脚本语言在CAD二次开发方面有如下优势。
语法简洁:Python有相对较少的关键字,结构简单,有一个明确定义的语法,学习起来更加容易。
易于阅读:Python代码定义的更清晰,它采用强制缩进的方式使得代码具有极佳的可读性。
具有丰富的库:Python的最大优势是它具有丰富的库,且是跨平台的。Python标准库很庞大。它可以帮助你处理各种工作,包括文档生成、数据库、网页浏览器、电子邮件、XML、HTML、WAV文件、图形用户界面(GUI)和其他与系统有关的操作。当然,也包括调用AutoCAD的命令,实现辅助工具开发功能。
可扩展:如果需要一段关键代码运行得更快或者希望某些算法不公开,可以把部分程序用C或C++编写,然后在Python程序中使用。
面向对象:Python既支持面向过程的编程,也支持面向对象的编程。在“面向过程”的语言中,程序是由过程或仅仅是可重用代码的函数构建起来的。在“面向对象”的语言中,程序是由数据和功能组合而成的对象构建起来的。与其他主要的语言如C++和Java相比,Python以一种非常强大又简单的方式实现面向对象编程。
上文提到Python语言有着丰富的库,因此它也具有控制AutoCAD的库,即pyautocad模块。pyautocad包可以对任何版本的AutoCAD软件进行操作,实际上接口都是一样的。连接CAD的代码如下。
1.from pyautocad import APoint
2.
3.class AutoCadOperations(object):
4. def draw_text(self, point, text_content):
5. self.acad.model.AddText(text_content, p,font_size)
6. def open_acad_template(self, acad_ fi le):
7. self.acad.app.documents.open(join_path('acad_ fi les', acad_ fi le))
8. def close_current_acad_ fi le(self):
9. self.acad.doc.close()
作为AutoCAD的基本控制模块,AutoCadOperations定义了:
draw_text - 将文本写入到当前打开的Auto-CAD文件,输入参数写入的坐标、文本内容、对齐方式和文本大小。
open_acad_template - 打开AutoCAD文件,输入参数为要打开的文件路径。
get_all_text_dicts - 获取所有文本及其内容的字典。
close_current_acad_file - 关闭当前的AutoCAD文件。
该控制模块的基本调用如下所示。
1.def write_acad_file(self, source_content, out_fi le):
2. file_num = len(source_content) / one_file_column_num + 1
3. for fi le_index in range(0, fi le_num):
4. self.acad_operations.open_acad_template(self.acad_ fi le)
5. for table_index, first_start_point in
enumerate(self.table_start_points):
6. point_list = self.generate_point_lists(first_start_point)
7. for column_index in range(len(point_list)):
8. source_index = table_index * self.table_set_num + column_index + file_index *one_ fi le_column_num
9. self.acad_operations.save_acad_file(generate_ fi le_name(out_ fi le, fi le_index))
10. self.acad_operations.close_current_acad_if le()
采用模块化的设计思路,实现集中监测施工图辅助设计工具的开发,将软件系统划分为任务调度、数据提取、数据写入、数据分析、AutoCAD控制、车站配置等6个模块。
系统架构如图1所示。
图1 系统架构图Fig.1 System architecture diagram
1) 任务调度模块
任务调度模块主要负责根据软件处理流程,完成各模块间的调用。通过python中concurrent.futures库实现多张AutoCAD图的并行快速生成。
2) 车站配置模块
车站配置模块主要负责配置各车站基础情况,便于根据车站基础情况制定相应的采集内容,调用相应的CAD模板文件。如车站类型、信号机类型、转辙机类型、轨道电路类型、联锁制式、列控制式等,并根据采集内容合理分配机柜布置、组合柜布置等。
3)数据分析模块
数据分析模块定义了[需要写需要分析的类型]所需要进行的数据分析底层方法实现,包括读取txt数据内容,源数据处理,归并提取信息并写入python字典的功能。
4)AutoCAD控制模块
根据前面数据分析模块获得的各最终txt数据文件,选择打开各个CAD模板,利用Python文件调用CAD命令,将这些数据文件写入CAD模板,自动绘制集中监测施工设计图纸。
5)数据提取模块
数据提取模块主要负责根据车站配置通过AutoCAD控制模块来读取计算机联锁系统、列控系统、智能电源屏系统等外部输入信息,如分线盘的定义、组合架的分配等信息。这些信息决定了集中监测采集点的位置信息,因此是集中监测工程图纸的重要输入来源。数据提取模块的输出结果是相对应的txt源文件,主要用来作为数据写入模块的数据源和事后审查。
6) 数据写入模块
数据写入模块根据前面数据提取模块获得的源txt数据文件,调用AutoCAD控制模块。选择打开相应CAD模板,根据车站配置模块的信息,将这些数据文件写入CAD模板,完成自动绘制集中监测施工设计图纸。
根据上述模块定义,该软件的流程如图2所示。
软件流程可以概括为两个步骤。
首先,基于集中监测采集设计的输入图纸,如联锁图纸、区间列控图纸等,根据车站的配置信息,软件程序进行数据提取,再将提取出来的数据进行提炼和数据转换,从而得到监测采集需要的中间数据文件。
图2 软件流程图Fig.2 Software flow diagram
然后,读取这些数据文件,根据AutoCAD模版的格式需要,进一步调整数据内容,写入到python的列表。打开AutoCAD模板文件,进行写入操作,从而得到最终需要的成果文件,完成辅助设计流程。
利用面向对象的脚本语言Python对铁路信号工程计算机辅助设计CAD进行二次开发,在实现大型的、结构复杂、运算速度高的科学计算软件方面有较大的优势,利用Python语言作为集中监测系统施工图辅助设计工具的开发工具,可满足集中监测系统采集内容灵活多样、输入数据庞大,数据处理复杂的特点,可根据各站场基本情况不同,进行定制化分析处理,大大的提高了辅助设计工作的效率和准确性。