一、界面显示
如下图,MoveAndRotate,XIn,YIn,RIn,结果显示区的XOut,YOut,ROut都是自定义字符串,显示的也都是原始字符。
图
1 配置输入订阅
图
2 运行结果
如果需要将上述字符串显示变成中文,需要在字符翻译文件里添加翻译项。在VisionMaster.exe的同级目录Lang文件夹下,有个LanguageTool.exe。双击打开如下图:
图
3 语言资源工具
在Key文本框中输入要翻译的字符串,在中文值文本框中输入要显示的中文名称,在英文值文本框中输入要显示的英文名称,点后面的增加/编辑按钮,即可完成添加。修改同理。
将VM主界面关闭,重新打开。即可看到翻译后的中文名。如下图:
图
4 添加了语言资源的显示效果
可按此方法加入其它XIn,YIn,RIn,XOut,YOut,ROut的翻译对照。
二、结果显示
在模块运行之后,得到了计算结果,但在图像上没有相应的显示,如下图:
图
5 无结果显示
打开自定义的模块目录,找到xxxDisplay.xml,打开,如下图所示:
图
6 显示XML
默认情况下只显示了输入,输出图片,ROI,当前结果,历史结果这几项。在里面添加点的显示即可,可以到其它模块的Display.xml里去复制点的XML定义,进行调整。如下图:
图
7 添加点,文字显示
添加了point、text的Object,即点的显示与文字的显示,注意划红线的部分,点与文字的数据来源都要与MoveAndRotate.xml里的Output对应上。显示如下:
图
8 显示点与文字
如果不能正常显示,要看看底层C++库里是否输出了Modustatus。可参考开发自己的VM模块(二)里关于模块输出的部分。
如果要在显示TAB页,加开关控制点是否显示,加文字的配置。如下:
图
9 显示配置页
图
10 添加点与文字配置
注意,红线部分需要与Display里的Object Name保持一致。而文本显示的TextDisplayGroup是固定的,不用调整名称。添加完成后,显示TAB页变成如下:
图
11 显示TAB页有点和文字的配置
三、开发自定义配置控件
如果模块非常复杂,类似VM自带的特征匹配,需要做复杂的配置建模,这样的配置界面是无法通过XML直接配置出来的,这时就需要自己开发配置控件。需要一些的WPF开发功底。
而在生成器生成的C#工程里,已经附送了自定义配置控件的示例代码,以上面的MoveAndRotate为例,C#工程在MoveAndRotate_CsProj\MoveAndRotateCs里,里面有MoveAndRotateCs和MoveAndRotateControl两个目录,打开MoveAndRotateCs.sln(使用VS2013打开),如下图:
图
12 控件工程
里面的MoveAndRotateControl项目就是控件。从截图可以看到,已经做了一个新建模型,编辑模型的界面,点击新建模型按钮,就会弹出另一个界面ModelConfigDialog.xaml,做具体的模型生成工作。这两个界面可以按需修改成任何想自定义的界面内容。那如何使用到这个自定义的XXXControl呢?
看XmlData,如下图:
图
13 自定义Item
自定义了一个ModelPanel继承自NameValueItem(Tab XML里的Items的基类),扩展出了一个新的Item。再看DataTemplate下的ParamUserControlDataTemplate.xaml。
图
14 自定义数据模板
定义了一个数据模板ModelPanel,里面包含了自定义的配置界面ModelPanelControl。即:在Tab XML的Items下可以添加一个新的ModelPanel的Item,框架会把它实例化成图13的ModelPanel类的对象,并且尝试用同名的数据模板来做呈现。
在Tab Xml中做修改,加入一个新的Tab Lang_ModelSet,并在这个新Tab的Items下添加了新定义的ModelPanel,如下图:
图
15 TAB XML中加入自定义控件
打开VM,拖入移动旋转模块,双击打开配置,可以看到如下图的新自定义TAB页:
图
16 自定义配置控件
有了控件,可以做各种各样自定义的界面展现,但如何与模块底层通信,将两者联系起来,达到真正的配置效果?
连接自定义配置控件与配置TAB页的桥梁是ParamUserControlDataTemplate.xaml,仔细看
把ModelPanelControl的ParentNode绑定到了ModelPanel这个Tab Item的身上,而顺着Item的父节点往上找,找到最顶层节点,就是Tab Xml里的根节点AlgorithmTabRoot。而与模块底层通信的出入口,就在AlgorithmTabRoot的public IParamsConfig UserStringData这个属性上。所以示例代码中有拿通信出入口的代码如下:
图
17 通信接口
获得通信接口之后,从底层获取数据的方式如下:
设置数据到底层方式如下:
相应的,在底层GetParam,SetParam里要添加GetImageWidth,GetImageHeight,GetImageData,SetImageWidth,SetImageHeight,SetImageData的处理逻辑,如下图:
图
18 GetParam里加入获取数据示例代码
图
19 在SetParam里加入设置数据示例代码
至此,自定义控件的界面及数据传递就全部打通,基本框架已搭建,可以根据业务需求随意发挥了。
自定义模块的所有内容讲解完毕。