Windchill 开发 判断图纸关联类型

Windchill 开发 判断图纸关联类型

本文使用 windchill 11.0 M030 开发环境。

在Windchill系统中,图纸和部件的关联类型,最常见的有 所有者、图像 等,例如:
关联类型
每种关联类型之间有什么区别呢?先看PTC官方帮助文档的解释。

当前,Windchill 仍支持部件及其可交付结果之间的被动链接。现在,也可以将之称为“内容关联”。然而,根据关联执行以下一项操作还是多项操作,从前的活动链接现在被分为几种功能类型。
• 驱动部件使用关系链接 (结构链接) 的创建,它们用于创建部件的产品结构。
• 将属性传递给部件 (属性链接)。
• 提供结构中给定部件的 CAD 模型表示 (表示链接)。
关联类型比较

上面只截取了重要的一部分,感兴趣的小伙伴可以通过帮助菜单查找本地帮助文档阅读全文。下面我根据自己的使用经验和理解,用大白话讲一遍,不一定全面,欢迎留言补充。
关联类型首先分为两大类:活动链接 和 被动链接。
活动链接包括 所有者、图像 等,当关联关系产生后,图纸和部件就要当一个整体看,升高图纸小版本,会自动升高部件小版本。其中用到最多的就是所有者关联,可以通过三维图之间的结构来驱动部件生成BOM,可以传递属性,通常是 solidworks、creo 等三维设计软件出的三维图,才使用所有者关联。
被动链接也就是内容关联,逻辑相对简单,通过内容关联的图纸,就相当于一个说明文档,升高图纸小版本不影响部件,部件自动关联图纸当前的最新小版本。


那么问题来了:部件与EPM对象首次产生关联时,默认使用所有者关联,这符合PTC推荐的设计规范;但是对于我们研发体系不怎么规范的公司而言,这不太符合业务场景。部件首次关联的图纸大部分是 dwg图,存在大量所有者关联将被 dwg图占用,可能影响后面模型驱动设计。且 dwg图变更频繁,会导致部件版本过快升高。

能否通过修改配置,使编辑关联时“关联类型”下拉框的默认值改成“内容”?
这个问题还在探索中。

基于上述业务场景,提出如下开发需求:在适当位置触发校验,判断图纸关联类型,如果dwg图纸占用了所有者关联,则警告用户。

为了实现这个目的,我先研究了部件和EPM对象之间的Link对象及数据库结构。发现:活动链接使用 EPMBuildRule 和 EPMBuildHistory 表存储;被动链接使用 EPMDescribeLink 表存储。

开发思路就是,获得 WTPart 和 EPMDocument 对象后,去查询 EPMDescribeLink 表,如果存在Link对象,就可以确定他们是内容关联。

顺着这个思路,只需要在代码中用高级查询,去读取数据库就可以。实现过程中,我又发现 PTC提供了一个工具类,可以很方便的查询 Link 关系两端的对象。这样实现起来就更简洁了。

有更好的判方式,或PTC提供了接口来判断,欢迎留言讨论。

工具使用如下:

import org.apache.log4j.Logger;
import wt.epm.EPMDocument;
import wt.epm.structure.EPMDescribeLink;
import wt.fc.PersistenceHelper;
import wt.fc.QueryResult;
import wt.part.WTPart;
import wt.util.WTException;
/**
 * @author 彭秉浪 PengBingLang@dingtalk.com
 */
public class TestUtil {
	public static final Logger logger = Logger.getLogger(TestUtil.class.getName());
	/**
	 * 校验:部件与dwg图纸只能使用“内容”关联
	 * @return 校验是否通过
	 */
	private static boolean checkEPMLinkType(WTPart part, EPMDocument epm) {
		if (!epm.getNumber().toUpperCase().endsWith(".DWG")) {
			return true;
		}
		try {
			// 查询epm对象通过“内容”类型关联的所有部件
			QueryResult qr = PersistenceHelper.manager.navigate(epm, EPMDescribeLink.DESCRIBES_ROLE, EPMDescribeLink.class, true);
			// 参数含义:roleA, roleB角色, link.class, true返回roleB对象/false返回link对象
			if (qr == null || qr.size() == 0) {
				return true;
			}
			while (qr.hasMoreElements()) {
				WTPart part1 = (WTPart) qr.nextElement();
				logger.debug(part1.getNumber());
				if (part1.getNumber().equals(part.getNumber())) {
					return true;
				}
			}
		} catch (WTException e) {
			e.printStackTrace();
		}
		return false;
	}
}
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值