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文件整体格式如下:
下面对xml文件进行详解:
根节点
固定写法,其中DiagnosticLevel的值可修改,不同值代表不同的调试日志详细程度。
0 - 简要日志,只报告关键错误。
1 - 结果日志,报告关键错误和设置成功的属性信息。
2 - 冗长输出,完整日志,显示每一步的运行过程变量及结果。
通常在管理员编写调试过程中,使用2,最终改为0或1,以避免在面向用户时展示过多中间过程。
对象节点
以<PIPELINE></PIPELINE>包裹的节点,处理的就是Pipeline的属性,以<COMPONENT></COMPONENT>包裹的节点,处理的就是管件的属性。用对象类型来指定对象节点。
允许使用的节点为PIPELINE、COMPONENT、INFORMATION、MATERIAL、JOINT。GED循环处理整个POD文件中所有该对象类型的对象。其中JOINT节点最为特殊,可获取连接点前后的元件信息。
<XLS></XLS>用来指定外部数据源的文件路径,除了使用XLS指定xls文件外,还支持常用的MDB和CSV,要使用对应的节点指定对应的文件格式。<MDB>MDB文件路径\XXX.mdb</MDB>,CSV指定的是文件夹,文件名为表名。<CSV>CSV文件夹路径</CSV>。
EXECUTE节点
该节点是执行节点,用于处理数据。
- Criteria属性用于筛选,类似于过滤器的作用。
官方案例:
如果Criteria中要使用不等于,不能直接像=一样直接输入,要使用<>对<>进行转译,因为这是xml文件,而<或>是会引起文件结构混乱的。
-
SQL节点进行数据处理并将处理后的数据存储到变量中,语法就是SQL查询语法,如果是外部数据,就是查表,如果是属性,就是常量。
-
EXTERNAL-MAP节点用于将数据写入属性。Name填Spoolgen中的内部属性名,ExternalName填SQL语句查询出来的列名。
SQL查询一定要注意标点,多个列用英文逗号,分隔,最后不要加标点
特殊对象节点JOINT
JOINT 节点存在特殊的语法用来指代构成 joint 部分的多个组件 – C0、C1和C2。
C0是连接件,如垫片或焊缝。C1和C2指代两个相连的元件,如法兰、管子和Olet等。
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$' <> 'Pipe' AND '$M.ComponentType$' <> '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(字段)
注意
- GED文件中引用的所有文件必须真实存在且为可打开文件。如引用了DeliveryDataSource.mdb,必须存在一个真正的DeliveryDataSource.mdb,创建一个txt改名是不行的,创建一个空mdb文件改名可以。
- 所有外部文件字段都要是文本格式,数字格式无法识别。
excel:
mdb:


