SPPID开发-开发简介及VB代码转C#

   PPID的开发方式在鹰图官方文档有很详细的介绍,在这里,我就不多叙述,秉承以往风格,直接上代码,另外令人吐槽的是都9102年,鹰图PID居然还用VB6.0进行开发课程培训,简直让人大跌眼镜,笔者当然不能忍,通过多年的编程经验,阅读相关文档,改用.net开发。目前SPPID开发的C#代码我在国内没有见过,以下所有C#代码都是摸索出来的,并且运行无误,大家可放心使用。
  1. 引用库
    在鹰图课程中介绍引用库位置位于 “…\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等引用库。

  2. 直接上代码

    我们直接以《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
    Next

    Debug.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来替代,估计后续的库还会再更新。

  1. 一种新的C#的数据类型
    使用C#开发SPPID的时候有个坑,新手往往无法避免,那就是FrameWork4.0以后提供的新的数据类型dynamic,笔者以前是搞C++开发,接触C#开发比较晚,所以没有避掉这个坑。在使用dynamic返回值的函数时是一定先进行判断,很有可能函数的返回值是一个DBNull。

欢迎关注微信公众号 数智化工

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值