跳转至

GED开发

约 1626 个字 221 行代码 预计阅读时间 8 分钟

概述

本文章旨在指导如何进行GED开发,以实现属性的获取,外部数据的导入与属性填写等操作。这是对属性的进一步高级操作,以实现批量快速设置一些具有特定规则的属性。

仔细观察通过项目的前处理和属性的设置之后,各属性的详情,尤其是焊点属性,会发现很多属性都是填写的默认值0,这是因为焊点的属性没有设置公式,也无法设置公式,因为数据源头不在焊点上,这些值无法获取。而如果通过人工一个一个处理,将是一件让人崩溃的事情,而GED(Get External Data)正是为了解决这一问题出现的。

GED不仅可以跨对象类型处理属性,还可以获取外部数据源,如Excel文件,mdb文件等,将属性值批量导入到指定的对象的指定属性上。

GED不同于其它的开发,它是Spoolgen中的特定语言,不需要很复杂的编程知识,只要有一点数据库基础知识就可独立完成开发工作,但通常需要反复调试。

有了前处理的ppc文件,有了项目属性设置里的公式,再加上GED对属性的处理,Spoolgen中涉及到的属性设置就全部完成。

基础知识

GED,全称为Get External Data,获取外部数据。开发过程实际上就是编写一个xml文件。该文件通常放置在$PROJECT$\Data\Get External Data\GetExternalData.xml,在该文件路径下,通常还会有一个配套的GetExternalData.xls,即使该文件上空白,但通常也要存在。文件名可修改,但xml中的引用也要随之修改。

GED文件整体格式如下:

<EXTERNAL-DATA Version="POD3" DiagnosticLevel="0">
    <!-- 管道信息 -->
    <PIPELINE>
        <XLS>$PROJECT$\Data\Get External Data\GetExternalData.xls </XLS>
        <EXECUTE>
            <SQL>
                SELECT '$P.ATTRIBUTE191$' AS ATTRIBUTE10,
                '$P.ATTRIBUTE193$' AS ATTRIBUTE12
            </SQL>
            <EXTERNAL-MAP Name="ATTRIBUTE10" ExternalName="ATTRIBUTE10"/>
            <EXTERNAL-MAP Name="ATTRIBUTE12" ExternalName="ATTRIBUTE12
        </EXECUTE>
    </PIPELINE>
    <!-- 管件Name -->
    <COMPONENT>
        <XLS> $PROJECT$\Data\Get External Data\GetExternalData.xls </XLS>
        <EXECUTE Criteria="'$M.Group$' &lt;&gt; 'Pipe' AND '$M.ComponentType$' &lt;&gt; 'Set-On-Tee'">
            <SQL>
                select '管件' as Name
            </SQL>
            <EXTERNAL-MAP Name="COMPONENT-ATTRIBUTE20" ExternalName="Name"/>
        </EXECUTE>
    </COMPONENT>
</EXTERNAL-DATA>

下面对xml文件进行详解:

根节点

固定写法,其中DiagnosticLevel的值可修改,不同值代表不同的调试日志详细程度。

0 - 简要日志,只报告关键错误。
1 - 结果日志,报告关键错误和设置成功的属性信息。
2 - 冗长输出,完整日志,显示每一步的运行过程变量及结果。

通常在管理员编写调试过程中,使用2,最终改为01,以避免在面向用户时展示过多中间过程。

1
2
3
<EXTERNAL-DATA Version="POD3" DiagnosticLevel="0">

</EXTERNAL-DATA>

对象节点

<PIPELINE></PIPELINE>包裹的节点,处理的就是Pipeline的属性,以<COMPONENT></COMPONENT>包裹的节点,处理的就是管件的属性。用对象类型来指定对象节点。

允许使用的节点为PIPELINE、COMPONENT、INFORMATION、MATERIAL、JOINT。GED循环处理整个POD文件中所有该对象类型的对象。其中JOINT节点最为特殊,可获取连接点前后的元件信息。

    <!-- 管道信息 -->
    <PIPELINE>
        <XLS>$PROJECT$\Data\Get External Data\GetExternalData.xls </XLS>
        <EXECUTE>
            <SQL>
                SELECT '$P.ATTRIBUTE191$' AS ATTRIBUTE10,
                '$P.ATTRIBUTE193$' AS ATTRIBUTE12
            </SQL>
            <EXTERNAL-MAP Name="ATTRIBUTE10" ExternalName="ATTRIBUTE10"/>
            <EXTERNAL-MAP Name="ATTRIBUTE12" ExternalName="ATTRIBUTE12
        </EXECUTE>
    </PIPELINE>

<XLS></XLS>用来指定外部数据源的文件路径,除了使用XLS指定xls文件外,还支持常用的MDB和CSV,要使用对应的节点指定对应的文件格式。<MDB>MDB文件路径\XXX.mdb</MDB>,CSV指定的是文件夹,文件名为表名。<CSV>CSV文件夹路径</CSV>

EXECUTE节点

该节点是执行节点,用于处理数据。

  • Criteria属性用于筛选,类似于过滤器的作用。
    <!-- 管件Name -->
    <COMPONENT>
        <XLS> $PROJECT$\Data\Get External Data\GetExternalData.xls </XLS>
        <EXECUTE Criteria="'$M.Group$' &lt;&gt; 'Pipe' AND '$M.ComponentType$' &lt;&gt; 'Set-On-Tee'">
            <SQL>
                select '管件' as Name
            </SQL>
            <EXTERNAL-MAP Name="COMPONENT-ATTRIBUTE20" ExternalName="Name"/>
        </EXECUTE>
    </COMPONENT>

官方案例:

<EXECUTE Criteria = "'$M.ComponentType$' = 'Pipe'"></EXECUTE>
<EXECUTE Criteria = "Instr(1,'$M.ItemCode$','ABC')>0 AND '$M.ComponentType$' = 'Flange-Weld-Neck'"></EXECUTE>

如果Criteria中要使用不等于,不能直接像=一样直接输入,要使用&lt;&gt;<>进行转译,因为这是xml文件,而<>是会引起文件结构混乱的。

  • SQL节点进行数据处理并将处理后的数据存储到变量中,语法就是SQL查询语法,如果是外部数据,就是查表,如果是属性,就是常量。

  • EXTERNAL-MAP节点用于将数据写入属性。Name填Spoolgen中的内部属性名,ExternalName填SQL语句查询出来的列名。

SQL查询一定要注意标点,多个列用英文逗号,分隔,最后不要加标点

特殊对象节点JOINT

JOINT 节点存在特殊的语法用来指代构成 joint 部分的多个组件 – C0、C1和C2。

C0是连接件,如垫片或焊缝。C1和C2指代两个相连的元件,如法兰、管子和Olet等。

    <!-- 焊点信息 -->
    <JOINT Type="Welded">
        <XLS> $PROJECT$\Data\Get External Data\GetExternalData.xls </XLS>
        <EXECUTE>
            <SQL>
                SELECT '$C1.COMPONENT-ATTRIBUTE17$' AS MIAOSHU1,
                '$C2.COMPONENT-ATTRIBUTE17$' AS MIAOSHU2
            </SQL>
            <C0>
                <EXTERNAL-MAP Name="WELD-ATTRIBUTE11" ExternalName="MIAOSHU1"/>
                <EXTERNAL-MAP Name="WELD-ATTRIBUTE12" ExternalName="MIAOSHU2"/>
            </C0>
        </EXECUTE>
    </JOINT>

JOINT需要指明Type类型,不同的JOINT类型有不同的含义。上述例子就可以将焊点前后的两个元件的描述写入焊点的属性中。最常用的Type当然是Welded

Joint 类型字段 定义 连接件 (C0)
Welded Weld connected to a non-weld. No multiple welds at same point generate one connection per weld. Weld
Flanged Flange connected to gasket or flange connected to flange (no gasket). Gasket (optional)
Wafer Wafer component (XW) between two flanges or two flange / gaskets . Gasket (optional)
Screwed Screwed to Screwed or Screwed to Pipe Empty
Compression Compression/Compression or Compression/Pipe Empty
Clamped Clamped/Clamped or Clamped/Pipe Clamp
Glued Glued/Glued or Glued/Pipe Empty
PushFit Pushfit/Pushfit or Pushfit/Pipe Empty
BallAndSocket Ball and Socket/Ball and Socket or Ball and Socket/Pipe Empty
Flared Flared/Flared or Flared/Pipe Empty
Lap Joint Clamped/Clamped or Clamped/Pipe Empty
Hygienic LN-/LC-/LR-/ MP = one of group or XP Empty
PulledBend PulledBend component PulledBend
Unknown Any unrecognized connection Empty

案例

这是从一个真实的项目中摘过来的,基本上包含了绝大部分常用的GED用法,需求包括:

  • 从外部文件获取装置名的中文写入指定属性中(实际项目中可以覆盖原属性ATTRIBUTE23,这里为了看效果,新增了一个属性ATTRIBUTE24【PBS(装置名)】)。
  • 仔细观察PCF文件,所有元件都有COMPONENT-ATTRIBUTE95(端面1壁厚值),但一些非变径元件没有COMPONENT-ATTRIBUTE94,需要根据COMPONENT-ATTRIBUTE95获取。
  • 元件长度获取
  • 元件分类中文名(管子/管件/支吊架)
  • 支吊架的IC码和描述获取(COMPONENT不包含支吊架)
  • 焊点两端元件信息获取到焊点属性中
  • 焊点坐标信息获取
  • 焊点的现场信息返回到项目,导入焊点属性后用于交工资料生成(数据来自焊接管理系统导出的mdb文件)
<EXTERNAL-DATA Version="POD3" DiagnosticLevel="2">
    <!-- 管道信息 -->

    <!-- PCF属性规划,当前版本已经在ppc中处理,之前是用GED处理的 -->
    <!--<PIPELINE> 
        <XLS>$PROJECT$\Data\Get External Data\GetExternalData.xls </XLS>
        <EXECUTE>
            <SQL>
                SELECT '$P.ATTRIBUTE191$' AS ATTRIBUTE10,
                '$P.ATTRIBUTE193$' AS ATTRIBUTE12,
                '$P.ATTRIBUTE189$' AS ATTRIBUTE27,
                '$P.ATTRIBUTE185$' AS ATTRIBUTE28,
                '$P.ATTRIBUTE187$' AS ATTRIBUTE29,
                '$P.ATTRIBUTE186$' AS ATTRIBUTE30,
                '$P.ATTRIBUTE188$' AS ATTRIBUTE31,
                '$P.ATTRIBUTE184$' AS ATTRIBUTE32,
                '$P.ATTRIBUTE183$' AS ATTRIBUTE33
            </SQL>
            <EXTERNAL-MAP Name="ATTRIBUTE10" ExternalName="ATTRIBUTE10"/>
            <EXTERNAL-MAP Name="ATTRIBUTE12" ExternalName="ATTRIBUTE12"/>
            <EXTERNAL-MAP Name="ATTRIBUTE27" ExternalName="ATTRIBUTE27"/>
            <EXTERNAL-MAP Name="ATTRIBUTE28" ExternalName="ATTRIBUTE28"/>
            <EXTERNAL-MAP Name="ATTRIBUTE29" ExternalName="ATTRIBUTE29"/>
            <EXTERNAL-MAP Name="ATTRIBUTE30" ExternalName="ATTRIBUTE30"/>
            <EXTERNAL-MAP Name="ATTRIBUTE31" ExternalName="ATTRIBUTE31"/>
            <EXTERNAL-MAP Name="ATTRIBUTE32" ExternalName="ATTRIBUTE32"/>
            <EXTERNAL-MAP Name="ATTRIBUTE33" ExternalName="ATTRIBUTE33"/>
        </EXECUTE>
    </PIPELINE> -->

    <!-- 从外部文件获取装置名的中文写入指定属性中 -->
    <PIPELINE>
        <XLS> $PROJECT$\Data\Get External Data\GetExternalData.xls </XLS>
        <SQL>
            SELECT * FROM AreaName WHERE [PBSArea] = '$P.ATTRIBUTE13$'
        </SQL>
        <EXTERNAL-MAP Name="ATTRIBUTE24" ExternalName="AreaNameCn"/>
    </PIPELINE>
    <!-- 管子与管件 -->
    <COMPONENT>
        <XLS> $PROJECT$\Data\Get External Data\GetExternalData.xls </XLS>
        <EXECUTE>
            <SQL>
                <!-- 注释部分也在ppc中处理了 -->
                SELECT <!-- '$C.COMPONENT-ATTRIBUTE100$' AS COMPONENTATTRIBUTE11,
                '$C.COMPONENT-ATTRIBUTE99$' AS COMPONENTATTRIBUTE12,
                '$C.COMPONENT-ATTRIBUTE95$' AS COMPONENTATTRIBUTE13, -->
                IIF('$C.COMPONENT-ATTRIBUTE19$' = '0','$C.COMPONENT-ATTRIBUTE13$', '$C.COMPONENT-ATTRIBUTE19$') AS COMPONENTATTRIBUTE19,
                <!-- '$C.COMPONENT-ATTRIBUTE84$' AS COMPONENTATTRIBUTE15,
                '$C.COMPONENT-ATTRIBUTE83$' AS COMPONENTATTRIBUTE16,
                '$C.COMPONENT-ATTRIBUTE90$' AS COMPONENTATTRIBUTE18, -->
                IIF('$CL[Leg_1].Length$' = '','0','$CL[Leg_1].Length$') AS LENGTH1,
                IIF('$CL[Leg_2].Length$' = '','0','$CL[Leg_2].Length$') AS LENGTH2,
                IIF('$CL[Leg_3].Length$' = '','0','$CL[Leg_3].Length$') AS LENGTH3,
                IIF('$CL[Leg_4].Length$' = '','0','$CL[Leg_4].Length$') AS LENGTH4,
                IIF(LENGTH1 = '','$C.COMPONENT-ATTRIBUTE14$',CDbl(LENGTH1)+CDbl(LENGTH2)+CDbl(LENGTH3)+CDbl(LENGTH4)) AS COMPONENTATTRIBUTE14,
                '管子' AS COMPONENTATTRIBUTE20
            </SQL>
            <!-- <EXTERNAL-MAP Name="COMPONENT-ATTRIBUTE11" ExternalName="COMPONENTATTRIBUTE11"/>
            <EXTERNAL-MAP Name="COMPONENT-ATTRIBUTE12" ExternalName="COMPONENTATTRIBUTE12"/>
            <EXTERNAL-MAP Name="COMPONENT-ATTRIBUTE13" ExternalName="COMPONENTATTRIBUTE13"/> -->
            <EXTERNAL-MAP Name="COMPONENT-ATTRIBUTE19" ExternalName="COMPONENTATTRIBUTE19"/>
            <EXTERNAL-MAP Name="COMPONENT-ATTRIBUTE14" ExternalName="COMPONENTATTRIBUTE14"/>
            <!-- <EXTERNAL-MAP Name="COMPONENT-ATTRIBUTE15" ExternalName="COMPONENTATTRIBUTE15"/>
            <EXTERNAL-MAP Name="COMPONENT-ATTRIBUTE16" ExternalName="COMPONENTATTRIBUTE16"/>
            <EXTERNAL-MAP Name="COMPONENT-ATTRIBUTE18" ExternalName="COMPONENTATTRIBUTE18"/> -->
            <EXTERNAL-MAP Name="COMPONENT-ATTRIBUTE20" ExternalName="COMPONENTATTRIBUTE20"/>
        </EXECUTE>
    </COMPONENT>
    <!-- 管件Name -->
    <COMPONENT>
        <XLS> $PROJECT$\Data\Get External Data\GetExternalData.xls </XLS>
        <EXECUTE Criteria="'$M.Group$' &lt;&gt; 'Pipe' AND '$M.ComponentType$' &lt;&gt; 'Set-On-Tee'">
            <SQL>
                select '管件' as Name
            </SQL>
            <EXTERNAL-MAP Name="COMPONENT-ATTRIBUTE20" ExternalName="Name"/>
        </EXECUTE>
    </COMPONENT>
    <!-- 支吊架 -->
    <COMPONENT>
        <XLS> $PROJECT$\Data\Get External Data\GetExternalData.xls </XLS>
        <EXECUTE Criteria="'$M.Group$'='Supports'">
            <SQL>
                select '支吊架' as Name,
                '$M.Description$' as ItemDescription,
                '$M.ItemCode$' as ItemCode
            </SQL>
            <EXTERNAL-MAP Name="COMPONENT-ATTRIBUTE20" ExternalName="Name"/>
            <EXTERNAL-MAP Name="ITEM-DESCRIPTION" ExternalName="ItemDescription"/>
            <EXTERNAL-MAP Name="COMPONENT-ATTRIBUTE18" ExternalName="ItemCode"/>
        </EXECUTE>
    </COMPONENT>
    <!-- 焊点信息 -->
    <JOINT Type="Welded">
        <XLS> $PROJECT$\Data\Get External Data\GetExternalData.xls </XLS>
        <EXECUTE>
            <SQL>
                SELECT '$C1.COMPONENT-ATTRIBUTE17$' AS MIAOSHU1,
                '$C2.COMPONENT-ATTRIBUTE17$' AS MIAOSHU2,
                '$C1.REPEAT-PART-NUMBER$' AS BIANHAO1,
                '$C2.REPEAT-PART-NUMBER$' AS BIANHAO2,
                IIF('$C1.COMPONENT-ATTRIBUTE12$'='','','$C1.COMPONENT-ATTRIBUTE12$'+'X'+'$C1.COMPONENT-ATTRIBUTE19$') AS GUIGE1,
                IIF('$C2.COMPONENT-ATTRIBUTE11$'='','','$C2.COMPONENT-ATTRIBUTE11$'+'X'+'$C2.COMPONENT-ATTRIBUTE13$') AS GUIGE2,
                '$C1.COMPONENT-ATTRIBUTE21$' AS CAIZHI1,
                '$C2.COMPONENT-ATTRIBUTE21$' AS CAIZHI2,
                IIF('$C0.WELD-ATTRIBUTE2$'='','$C1.COMPONENT-ATTRIBUTE100$','$C0.WELD-ATTRIBUTE2$'+'mm') AS HANJING
            </SQL>
            <C0>
                <EXTERNAL-MAP Name="WELD-ATTRIBUTE11" ExternalName="MIAOSHU1"/>
                <EXTERNAL-MAP Name="WELD-ATTRIBUTE12" ExternalName="MIAOSHU2"/>
                <EXTERNAL-MAP Name="WELD-ATTRIBUTE14" ExternalName="HANJING"/>
                <EXTERNAL-MAP Name="WELD-ATTRIBUTE21" ExternalName="BIANHAO1"/>
                <EXTERNAL-MAP Name="WELD-ATTRIBUTE22" ExternalName="BIANHAO2"/>
                <EXTERNAL-MAP Name="WELD-ATTRIBUTE23" ExternalName="GUIGE1"/>
                <EXTERNAL-MAP Name="WELD-ATTRIBUTE24" ExternalName="GUIGE2"/>
                <EXTERNAL-MAP Name="WELD-ATTRIBUTE25" ExternalName="CAIZHI1"/>
                <EXTERNAL-MAP Name="WELD-ATTRIBUTE26" ExternalName="CAIZHI2"/>
            </C0>
        </EXECUTE>
    </JOINT>
    <!-- 焊点坐标信息 -->
    <COMPONENT>
        <XLS> $PROJECT$\Data\Get External Data\GetExternalData.xls </XLS>
        <EXECUTE>
            <SQL>
                Select format($CKP[Run_1].X$,'0.00') as XcoordRun1, format($CKP[Run_1].Y$,'0.00') as YcoordRun1, format($CKP[Run_1].Z$,'0.00') as ZcoordRun1
            </SQL>
            <EXTERNAL-MAP Name="WELD-ATTRIBUTE18" ExternalName="XcoordRun1" />
            <EXTERNAL-MAP Name="WELD-ATTRIBUTE19" ExternalName="YcoordRun1" />
            <EXTERNAL-MAP Name="WELD-ATTRIBUTE20" ExternalName="ZcoordRun1" />
        </EXECUTE>
    </COMPONENT>
    <!-- 现场信息 -->
    <COMPONENT>
        <MDB> $PROJECT$\Data\Get External Data\DeliveryDataSource.mdb </MDB>
        <EXECUTE Criteria="'$M.Group$'='Welds'">
            <SQL>
                select * from 焊缝明细 where [单线号] = '$P.PIPELINE-REFERENCE$' and [焊口编号] = '$C.REPEAT-WELD-IDENTIFIER$'
            </SQL>
            <EXTERNAL-MAP Name="WELD-ATTRIBUTE15" ExternalName="焊工编号"/>
            <EXTERNAL-MAP Name="WELD-ATTRIBUTE13" ExternalName="固定口(是/否)"/>
        </EXECUTE>
    </COMPONENT>
    <COMPONENT>
        <MDB> $PROJECT$\Data\Get External Data\DeliveryDataSource.mdb </MDB>
        <EXECUTE Criteria="'$M.Group$'='Welds'">
            <SQL>
                select IIF('$C.WELD-ATTRIBUTE13$'='是','固定口',' ') as Lockport1
            </SQL>
            <EXTERNAL-MAP Name="WELD-ATTRIBUTE28" ExternalName="Lockport1"/>
        </EXECUTE>
    </COMPONENT>
</EXTERNAL-DATA>

公式函数

判断语句:IIF(真?是:,否:)
数字圆整:format(内容,'0.00')
SQL查询:如果来自Excel,Select * from 表名;如果来自Excel,Select * from Range名(通过名称管理器管理管理,切记不是Sheet名)
字符串转数字:CDbl(字段)

注意

  1. GED文件中引用的所有文件必须真实存在且为可打开文件。如引用了DeliveryDataSource.mdb,必须存在一个真正的DeliveryDataSource.mdb,创建一个txt改名是不行的,创建一个空mdb文件改名可以。
  2. 所有外部文件字段都要是文本格式,数字格式无法识别。

excel:

image.png

mdb:

image.png