摘要:PKPM是结构设计中最为常用的软件。对PKPM的深层次研究在帮助我们理解软件意图的同时,也可以为我们的设计工作带来很大的便利。本文通过对PKPM软件中通用的*.t文件格式图形的原始数据进行研究,初步掌握了T文件的二进制数据结构。以此,我们可以直接对T文件进行编辑和打印输出而不借助PKPM软件平台。进一步作为应用举例,本文介绍了如何利用以上二进制数据进行打印的思想原理,并编写了T文件的通用批量打印程序,大大简化了打印结构计算书时原本繁复的操作流程。

关键字:PKPM,T文件,数据格式,打印

中图分类号:C37文献标识码:A

0概述

在PKPM中,二维模型与结果图形默认以*.t格式的文件保存(下称T文件)。该文件为二进制格式,只可以通过PKPM软件中本身集成的程序进行编辑和打印输出操作。T文件缺乏广泛的第三方支持。同时,官方的*.t、*.dwg格式图形的单向转换程序功能单一,并不满足大批量打印的操作需求。PKPM曾提供Modify模块的二次开发接口[1],然而由于软件强制,市面上以此开发的应用难觅踪迹,现在PKPM技术热线也基本停止了对二次开发的支持。

结构设计中,生成计算书需要对T文件的图形结果进行打印输出。对此,常规操作是在PMCAD、SATWE模块中依次打开各层结果逐一进行打印。网上另有两种批量打印计算书的方法:1)用PKPM自带功能将T文件逐一转换成*.dwg文件,经过统一设置后,寻求非专用的批量打印DWG图形的软件进行打印。这种方法要求本机必须安装PKPM,该功能会由于调用库和第三方控件的问题无法做到绿色化,故而无法在移植的计算机上使用;2)采用基于AutoCAD环境的ARX程序,转化成DWG图形后进行打印。这些ARX程序可能是探索者等基于CAD开发的的软件抽取出来的,因此采用这种方法就要求安装指定版本的AutoCAD环境,也比较麻烦。

本文旨在直接对T文件的二进制数据进行识别,分析出其中暗含的图元对象和相关属性,以便于后续直接进行编辑和打印输出。这种思路的优点是,可以省去转化为DWG图形的中间步骤,避免中间转化过程中不同格式图形所预定义的语义偏差造成的误差;同时,可以完全不依赖PKPM软件和AutoCAD环境,即可以在没有PKPM授权和AutoCAD的电脑上直接对*.t文件进行编辑和打印输出。通过这种思路,我们可以编写第三方打印程序和可视化编辑器,并提供T图转化为任意可行的图形格式的接口函数。由于PKPM集成自带的编辑器足以够用,而且编写第三方编辑器较为复杂,实用性可行性不强。本文仅示例编写T文件的直接打印程序。

1数据结构分析

1.1文件结构

T文件是基于二进制格式存储的数据文件。通过WinHex初步分析所有数据都是明文存储,并未采用算法进行加密,否则对T文件的分析将会极其困难。文件不存在文件头,并未指定文件格式版本、打开所需的应用程序最低版本、哈希校验等信息。文件是大量记录的顺序堆放,即:

............

经过完整分析并没有一个集中数据区块是供跳转查询用的堆栈。每一条记录代表一个图元或者一条设置指令,都依循着固定的格式。顺序堆放的指令记录只对后续的其他指令和图元有效,同时,文件中存在相当数量的已然失效的指令记录,这两点类似命令流语句。依据这种数据存储结构,T文件图形实现撤销(UNDO)操作不难。

1.2版本控制

前一节指出,T文件中并不存在文件头以定义版本信息。进一步分析发现,T文件的版本是通过各记录本身格式实现定义的。通用的单个记录结构为:

{[结构标识][数据实体][结构标识]}

PKPM2010中,SATWE模块生成的T文件中,所有记录的结构标识均为{xxxxFCFF},其中xxxx字段标示了该记录的类型编号,部分记录类型编号如表1所示。TCAD中生成的记录均为{xxxx34FF},PMCAD模块中生成的两种版本的记录均有。在更老版本的PKPM中,结构标识均为{xxxx}。

表1部分类型编号定义

不同版本的记录后续数据实体的格式有所不同,但是有共性的属性和字段定义。对于常用的以{xxxx34FF}和{xxxxFCFF}标示的记录,后续的数据实体主要包含如下几部分定义:1)全局索引;2)分组;3)标识码;4)保留位;5)数据区。下文将举例介绍部分图元与指令实体的详细数据结构。

1.3图元详细结构解析

下面简单举例介绍不同类型的图元对象的详细数据结构

1.直线(0x0002)

2.字符(0x0008,0x0009)

1.4指令详细结构解析

2打印原理

打印的基本思想就是指示打印机如何正确地把所有可视化对象绘制到打印纸的合理位置。本文利用C#语言编写程序对前一节获取的图元进行打印。我们利用打印类封装的System.Drawing.Printing.PrintPageEventArgs

类型的参数进行配置,可获取以及指定打印纸张、页面布局等基本信息。此处需要注意的是,默认的纸张尺寸单位是1/100英寸,图元的绘制时绘图空间须进行比例换算。随后利用封装参数获取Graphics对象,匹配合理的画笔、图刷、线型等信息进行绘图。

打印绘图中需要注意的主要过程:

1)读取二进制的t图,进行数据识别,对图元进行定位,界定最大边界范围。

2)根据纸张尺寸,对t图中所有的对象的定位和尺寸大小确定缩放比例。几何图形按实际比例缩放确定,对于文字,有两种思路,方法一,同几何图形按照实际定义的大小进行绘制,方法二,模仿CAD中设置有绘图和打印两种比例以保证真实纸张上的字体不会显得太小。由于计算书为A3或A4白图,本文采用第一种方法。对于宋体等非等宽字体,须在内存中预先绘制文字以测量其实际尺寸,同时须修改最大边界;而等宽字体如CourierNew等不需要进行预先绘制。如此,就建立了从图纸到实际白纸上的单位换算问题。

3)坐标换算。这个问题需要考虑如下几个部分:

a)基于纸张横版竖版自适应的思想,若纸张长宽方向与图形不一致,则应当旋转该图形以获得更加美观的打印布局。由于原理上竖向打印需要通过分解成横向常规打印进行,所以我们不建议对可视图元进行90度旋转。所以需要对图纸本身进行旋转,当打印完成后再归位。

b)图形坐标系和打印空间坐标系不同,如图1所示。对前文已经配置好缩放比例的图纸空间与打印空间进行映射,需要对坐标进行转换。

c)旋转文字的绘制。绘制非常规文字唯一的思路是,以文字插入点为局部坐标系原点,旋转图纸空间,绘制文字,然后旋转归位。此处需要注意文字水平对齐和竖向对齐方式,否则插入原点位置不正确会导致文字飘失。

d)文字的拉伸。SATWE结果中在狭窄处经常有压缩变形的文字。对于这部分文字,同样不存在对扭曲的文字的直接绘制方法,只可以通过对图纸空间的扭曲、复位达到此类效果。

以上具体问题的处理均可以转化为对图纸空间的二维变换,通过适时建立平移、旋转、拉伸矩阵进一步转化为数学问题。

平移矩阵变形矩阵二维旋转矩阵

解决了最为复杂的图形绘制问题,剩余的打印页数控制、目录、页眉页脚以及打印整本计算书所需的文字计算书部分都较为容易解决,相关资料也较多,此处不再赘述。

3打印结果

依据上文方法,利用C#编程直接读取某任意T文件二进制数据,选择AdobePDF虚拟打印机进行打印,打印效果如图3所示。与PKPM自带的打印功能相比较,本文程序打印效果无论图形真实度还是颜色笔刷均毫不逊色。

图3实际打印效果以及细部效果

4结论

通过本文中对PKPM软件T文件数据格式的研究和简单应用,我们不借助于PKPM、AutoCAD运行环境,对T文件直接编程打印进行了实践。由于打印图形结果是整个打印计算书过程中的核心和难点,文本计算书部分的编程打印难度很小,于是,进一步我们即可轻松实现对整本计算书的一键打印,由此打印PKPM计算书的工作量将大大减轻。另外,基于本文对T文件数据结构的研究,可以编写T文件转任何其他可行图形格式(例如DXF,DWG)的接口程序。未来BIM是主流,而PKPM仍然是结构计算的基础工具。本文的研究思路对于如何实现Revit软件和PKPM实现数据交互的可能性将会有一定的启示作用。

参考文献

[1]中国建筑科学研究院建筑工程软件研究所,面向工程应用的图形平台TCAD-PKPM建筑工程软件系统的通用图形平台[M].中国建筑工业出版社,200