PPID的开发方式在鹰图官方文档有很详细的介绍,在这里,我就不多叙述,秉承以往风格,直接上代码,另外令人吐槽的是都9102年,鹰图PID居然还用VB6.0进行开发课程培训,简直让人大跌眼镜,笔者当然不能忍,通过多年的编程经验,阅读相关文档,改用.net开发。目前SPPID开发的C#代码我在国内没有见过,以下所有C#代码都是摸索出来的,并且运行无误,大家可放心使用。
-
引用库
在鹰图课程中介绍引用库位置位于 “…\SmartPlant\P&ID Workstation\bin”下,主要有以下四个
(1) Intergraph SmartPlant P&ID Logical Model Automation – LLAMA.DLL
(2) Intergraph SmartPlant P&ID Placement Automation – Plaice.DLL
(3) Intergraph SmartPlant P&ID Automation – PIDAuto.DLL
(4) Intergraph SmartPlant PID Foreign Calculation Adapter - LMForeignCalc.DLL
如果我们用C#开发,就不能调用这些引用库了,应该调用interopLLAMA.DLL、interopPlaice.DLL等引用库。 -
直接上代码
我们直接以《SPAutomationCourseLabsV2014R1.pdf》课程中第20课为例,内容是已知一个modelItem的ID,获取其 Case data,课程里给的VB代码如下:
Dim datasource As LMADataSource
Set datasource = New LMADataSource
Dim objModelItem As LMModelItem
Set objModelItem = datasource.GetModelItem(id)
Dim objCase As LMCase
Dim objCases As LMCases
Set objCases = objModelItem.Cases
Debug.Print objCases.Count
Dim objAttribute As LMAAttribute
Dim objCaseProcess As LMCaseProcess
Dim objCaseControl As LMCaseControl
For Each objCase In objCases
For Each objAttribute In objCase.Attributes
Debug.Print "Name: " & objAttribute.name & Space(30 - Len(objAttribute.name)) & "Value: " & objAttribute.Value
NextDebug.Print objCase.CaseProcesses.Count
For Each objCaseProcess In objCase.CaseProcesses
For Each objAttribute In objCaseProcess.Attributes
Debug.Print "Name: " & objAttribute.name & Space(30 - Len(objAttribute.name)) & "Value: " & objAttribute.Value
Next
Next
Debug.Print objCase.CaseControls.Count
For Each objCaseControl In objCase.CaseControls
For Each objAttribute In objCaseControl.Attributes
Debug.Print "Name: " & objAttribute.name & Space(20 - Len(objAttribute.name)) & "Value: " & objAttribute.Value
Next
Next
Next
Set datasource = Nothing
Set objModelItem = Nothing
Set objCase = Nothing
Set objCases = Nothing
Set objAttribute = Nothing
Set objCaseProcess = Nothing
Set objCaseControl = Nothing
VB代码非常的臃肿,改为C#代码如下:
LMADataSource datasource = new LMADataSource();
LMModelItem objModelItem = datasource.GetModelItem(id);
LMCases objCases = objModelItem.Cases;
MessageBox.Show(objCases.Count.ToString());
foreach (LMCase objCase in objCases)
{
foreach (LMAAttribute objAttribute in objCase.Attributes)
MessageBox.Show("Name: " + objAttribute.Name + "Value: " + objAttribute.get_Value());
MessageBox.Show(objCase.CaseProcesses.Count.ToString());
foreach (LMCaseProcess objCaseProcess in objCase.CaseProcesses)
{
foreach (LMAAttribute objAttribute in objCaseProcess.Attributes)
MessageBox.Show("Name: " + objAttribute.Name + "Value: " + objAttribute.get_Value());
}
MessageBox.Show(objCase.CaseControls.Count.ToString());
foreach (LMCaseControl objCaseControl in objCase.CaseControls)
{
foreach (LMAAttribute objAttribute in objCaseControl.Attributes)
MessageBox.Show("Name: " + objAttribute.Name + "Value: " & objAttribute.get_Value());
}
}
顿时清爽多了,从代码可见目前的SPPID提供给开发者的引用库还不是非常完善,有一些函数比如objAttribute.get_Value(),完全可以使用objAttribute.Value来替代,估计后续的库还会再更新。
- 一种新的C#的数据类型
使用C#开发SPPID的时候有个坑,新手往往无法避免,那就是FrameWork4.0以后提供的新的数据类型dynamic,笔者以前是搞C++开发,接触C#开发比较晚,所以没有避掉这个坑。在使用dynamic返回值的函数时是一定先进行判断,很有可能函数的返回值是一个DBNull。
欢迎关注微信公众号 数智化工