在上一篇《SAP2000二次开发初探之C#环境搭建》中,作者介绍了如何使用Mirosoft Visual Studio配置C#编程的环境,添加SAP2000库的引用和开发完成后的SAP插件添加。这篇文章会简单介绍完成上述准备工作之后如何使用C#进行插件开发,并给出了一个具体样例~
一、添加插件窗口
在像上一篇文章一样操作之后,我们就可以开始写插件了。现在我们已将Class.cs修改为cPlugin,并添加了引用(using SAP2000v1),还在这个类里添加了Main方法。这个Main方法需要满足以下要求:1、需要用public void修饰语;2、传入2个参数:SapModel类的一个实例和cPluginCallback类的一个实例(这两个参数是由SAP2000主程序调用时提供)。当我们在SAP2000中点击插件时,就是让SAP主程序调用cPlugin类的Main方法。
我们使用SAP2000插件的用户操作流程基本上是依次点击:工具——插件——出现插件窗口——对窗口进行编辑——点击确认——插件执行命令;这对应于我们开发时的流程是:调用cPlugin.Main——呈现一个窗口(Form)——对窗口(Form)进行编辑——点击按键(button)时触发函数,实现插件功能。
要注意的是,虽然主程序直接调用cPlugin.Main,但是我们的实现思路是先从Main中呈现窗口,再在窗口中实现插件实际功能。因此Main函数只需要负责生成窗口就好了,具体的插件代码只需在Form中编写。接下来我们先向项目中添加一个窗口项。
而窗体本质上也是一个类,而要产生窗口的一个实例,我们需要在cPlugin.Main中添加如下代码。其中的Info方法用于在SAP主程序中呈现插件信息,在这里稍作呈现。
其中,为了在Form类中继续进行开发,我们需要把实例(model和plug)进行传参;而为了能成功传递,我们也要在Form类中编写相应的构造函数,并在类中加入一些局部变量。这样就可以让Form读取到传递进来的参数(model和plugin),随后在调用SAP2000库中的函数时就是调用model这个实例的方法。注意,打开Form1的代码窗口需要在Form1的设计窗口下按一次F7。
为了让这个窗口可以对按键作出反应,我们对窗口进行一些可视化编辑。此时我们回到Form1的设计窗口,然后利用左侧工具箱编辑这个窗口,添加若干个公共控件:
接下来双击右边窗口里的button1,然后会发现在Form1的代码窗口中自动生成了一个叫按键反应函数。在这个函数下编写的命令会在我们点击这个Button的时候开始执行。当点击了对应的button1,插件将执行该函数。
之后,我们就能在这个button附带的函数中愉快地编写命令啦。因为大部分插件的运行过程是先让用户选择对象或者输入一些数值,然后再点击按钮运行插件功能,因此插件的功能大多要在这个按钮的函数下进行编写。有些插件需要用户输入数值,所以我们此前进行窗口设计时,已将文本框textBox拖入窗口中。
用户在这些文本框输入的数值可以被代码读取,每一个文本框有自己的编号:例如第一个是textBox1,后续依次为textBox2,textBox3,以此类推;也可以设计者自行确定名称。这些文本框的本质是textBox的一个实例,可以用其中的Text方法获得值,但需要注意该值是string类型,需要进行转换。
二、SAP2000库函数简介
在button_click函数中编写命令时,我们需要大量使用SAP2000附带的函数,以便插件能对SAP2000进行正确操作。这些函数在调用时能够在SAP2000中完成各种功能,包括实例的创建,对象的选取和相关信息的修改与获取。而为了能够正确调用这些函数,我们需要查阅SAP2000附带的OAPI文档,从中找到函数的功能。
打开OAPI文档(文档在SAP2000安装根目录下,文件名CSI_OAPI_Documentation.chm),点击左边索引菜单中的CSi OAPI Functions栏可以看到各类可供使用的函数,比如Object Model栏中可以查到跟对象操作有关的函数,Select栏中可以查到跟对象的选取有关的函数。在实际使用时就根据需要在左侧索引栏中一层一层找到自己想要的函数。
图 10 函数一览在文档中的位置
点击某个具体的函数后,在右侧会显示出这个函数有关的信息。Procedure栏中显示函数调用时会输入/获得的变量,Parameters是针对这些变量的解释,Remarks是有关这个函数的说明。以图中选择的SapObject.SapModel.PointObj.GetCoordCartesian为例,这个函数会根据你输入的点的名称(ByVal Name As String),告诉你这个点的三个坐标(x,y,z),图中第五个变量是指要得到这个点在哪个坐标系下的坐标,一般默认在是全局坐标系下的坐标。值得注意的是,OAPI文档里的使用信息都以VBA为例所写,在语法上与C#略有差异。
在使用SAP2000库中函数时其函数基本通过传参的方式返回信息。具体来说就是在调用函数时在函数传入参数前加上一个ref。以上述函数为例,在实际使用时其语句为ret=SapModel.PointObj.GetCoordCartesian ( Name ,ref x ,ref y ,ref z , “Globbal” );
句中的这个“ret=”用于返回一个int类型的值以判断函数是否调用成功,成功为0,否则非0。调用函数时的四个变量,第一个Name是传递值,后面三个为传递引用,一般只有需要返回的变量前才需要添加ref。
图 11 OAPI文档中对于函数的说明
三、举个栗子
为了方便理解相关功能的使用,这里举一个简单的例子来进行说明
该段代码实现用户在点击按钮之后对所选点的坐标进行任意比例的缩放。其中第36行调用OAPI函数获得选择的对象。可以看到虽然之前我们在定义NumberItems,ObjectType_int和ObjectName_string时随意地声明了数组的大小,但是在调用OAPI方法后,API会自动根据结果修改数组并返回结果。在第44行调用函数获得的点坐标直接储存在变量x,y,z中,所以在46行就能直接利用函数获得的坐标值x,y,z和放大系数Ratio_X,Y,Z来进行缩放,而无需额外操作。
需要注意的是,该例子的图示仅包含了Form类中button_click的函数,完整的插件开发仍需包含上一篇《SAP2000二次开发初探之C#环境搭建》的铺垫以及本篇前面对cPlugin类、Form1类的操作步骤。
最后以下图的框架结构为例,用户选择红圈内的点并启动插件,试图对该点坐标进行缩放操作,最后的效果如图所示:
图 13 插件中输入比例系数
以上就是这一次介绍的一些SAP2000二次开发的入门操作啦,希望大家以后能够用上这些小知识进行愉快的二次开发~