iCAx开思网

标题: 这里有人做CAA吗? [打印本页]

作者: hino    时间: 2006-10-11 18:30
标题: 这里有人做CAA吗?
有人做二次开发吗?想请教一下。

某个product里面的所有成员零件的part的文件被改名后,比如 abc.CATPart被改成了061011_abc.CATPart。于是,问题来了。

如果用一个macro来自动完成文件链接的自动修改?我弄了几天,查了好多,就是没弄出来。链接还可以用属性命令查到,但我无法用一个变量也得到这个丢失前的链接。如果找到了,就只要把链接按一定的规则修改一下,用置换命令完成最后的一步就可以了。。。

有思路,但一直没有成功。有高手能指点指点吗?

[ 本帖最后由 hino 于 2006-10-11 19:35 编辑 ]
作者: hino    时间: 2006-10-11 22:29
有人用过这种功能吗?
有人用过VBScript吗?

不要老是盯着几个命令,偶尔深入CATIA,直接自己搞点小命令啊

[ 本帖最后由 hino 于 2006-10-11 22:31 编辑 ]
作者: xacf    时间: 2006-10-12 08:26
为什么要改物理文件名呢?比较麻烦!改PART.NAME 能更好的进行简易PDM管理。
作者: xacf    时间: 2006-10-12 09:00
可以做,实现起来难到不难,比较麻烦!程序简单路线;SAVE-重构PRODUCT-替换
作者: hino    时间: 2006-10-12 18:09
其实我说的另外一件事。但如果但我的思路做的话,这两件事是同一件事。

所以我要的是直接的方法,就是有没有什么接口能让我访问到instance的link to reference。
作者: xacf    时间: 2006-10-17 09:13
听不明白!
作者: hino    时间: 2006-10-17 22:44
这样,其实我想要做的是这么一回事。

有一个product,里面有两个part,链到了不同的目录。反正由于某种原因,这两个part的文件被人弄了一下,那个UUID变掉了。于是CATIA不认他。可是明明形状是对的,只是因为UUID变了,就不认。于是,我要做的是用macro来自动强行替换成新的文件(其实文件名和原来的一样)。这样,问题就解决了。

现在的问题是,如果你打开CATIA,那个part没有load,显示链接已经断掉。但,如果你在那个项目上右键看属性,还是看得到这个东西原来是链向哪个目录下的哪个文件的。

我的思路是:
如何用程序得这个链接,然后用Replace的方法,管你UUID变不变,我强行替换了就是了。

现在明白了吗?
作者: xacf    时间: 2006-10-18 12:01
可能明白了。
其实我已回答了!CATIA关心的是PART.NAME 即使文件的连接是一个,但不同的part.name,会被认为是不同的PART!改被替换PART。NAME为替换的PART。NAME,在替换。
作者: hino    时间: 2006-10-18 21:26
可是,这样的话,我就不知道一一对应关系了呀。其实有好几百个这样的零件。所以才想用macro一口气搞定。不然就两三个,我手工做做就是了。

你能不能贴一段示范的代码给我?用vbs代码好了。

问题的情况,我给你再详细说一下。

有A1.CATProduct和A2.CATProduct。接着,两者的内容是一样的。假定各都含有C.CATPart和D.CATPart两个零件。

现在,你做这么一步:同时打开这两个Product文件,然后把A1和A2都转换格式,去掉参数,这个用法你应该知道的吧?就是去掉参数,只保存结果形状。于是,你在保存新的A1的非参格式文件和A2的非参格式文件时,就会遇到这么一个问题:保存了一个,就无法保存另一个。到第二个时,你被逼作个选择:是overwrite,还是abort。如果是overwrite。第二个文件A2-non-parameter.CATProduct不会有问题,但第一个A1-non-parameter.CATProduct就会发生链接丢失,虽然文件明明在那里。这是因为UUID不一样的原因。如果当时的操作选择abort,则结果是第二个文件的链接丢失。

这就是我问这个问题的原因。我的想法是,无论是哪个,只要能找到原来的链接,强行替换,就OK了。我现在的问题是根本无法找到丢失的零件的fullname,即path+filename。

而且显然这只是一个sample。真实的CATProduct中重复的零件是有好几十个,或百个的。

所以,在我看来,这个macro非常必要,完成了也非常实用。

朋友,烦请多多帮助,谢谢!

[ 本帖最后由 hino 于 2006-10-18 21:30 编辑 ]
作者: amdufhvk    时间: 2006-10-18 21:58
支持
我也一直想知道怎么获取已断掉连接的instance对应的document
在CATIA下明明可以看到,可就是没找到怎么用程序得到
作者: hino    时间: 2006-10-18 22:35
看来你应该和我有同样的因惑,来,大家一起努力吧!
作者: xacf    时间: 2006-10-19 16:33
try this

Language="VBSCRIPT"

Sub CATMain()

Set productDocument1 = CATIA.ActiveDocument

Set product1 = productDocument1.Product

Set products1 = product1.Products

Set product2 = products1.Item("Part1.1")

Set Nothing1 = products1.ReplaceComponent(product2, "K:\ls\Part1.CATPart", True)

End Sub
作者: xacf    时间: 2006-10-19 16:49
原帖由 xacf 于 2006-10-19 16:33 发表
try this

Language="VBSCRIPT"

Sub CATMain()

Set productDocument1 = CATIA.ActiveDocument

Set product1 = productDocument1.Product

Set products1 = product1.Products

Set prod ...

注意:组件替换
作者: hino    时间: 2006-10-19 20:26
Set Nothing1 = products1.ReplaceComponent(product2, "K:\ls\Part1.CATPart", True)

你这个明显是CATIA自己录制的宏吧。这一步我也做过。

现在要问你,这个 K:\ls\Part1.CATPart 从何而来,你为什么知道是这个路径?

我的问题就在于这个,这个路径在CATIA的instance的property里有,能看到。但无法用属性或方法得到这个值。
作者: amdufhvk    时间: 2006-10-19 21:28
由于文件名改了,或者文件存储位置变了,打开CATIA就会出现零件找不到
同时,零件的原始位置和名字都是给出的,问题是怎么通过程序获取零件的原始位置和名字
作者: xacf    时间: 2006-10-20 08:37
原帖由 hino 于 2006-10-19 20:26 发表
Set Nothing1 = products1.ReplaceComponent(product2, "K:\ls\Part1.CATPart", True)

你这个明显是CATIA自己录制的宏吧。这一步我也做过。

现在要问你,这个 K:\ls\Part1.CATPart 从何而来,你为 ...

fullname
fullname是只读的,因为为牵扯关联关系,不能直接改的,通过替换改变它。

扯远一点。。。
其实这些“问题”,是CATIA严谨的软件工程的设计思想带来的,不建立PDM环境,解决单一数据源问题你不大可能“头痛医头”的方法解决所有问题。类似的如果在二个PRODUCT 在不同位置引用相同的PART,而不用关系约束,那么,很有可能其中一个位置不正确,会“跑”.我目前的工作就是试图设计一种mini pdm,解决这些问题。
作者: amdufhvk    时间: 2006-10-20 14:51
原帖由 xacf 于 2006-10-20 08:37 发表

fullname
fullname是只读的,因为为牵扯关联关系,不能直接改的,通过替换改变它。

扯远一点。。。
其实这些“问题”,是CATIA严谨的软件工程的设计思想带来的,不建立PDM环境,解决单一数据源问题你不大可 ...

说到严谨,如果大家都严谨,不随便移动零件;当改变文件的存储位置的时候,都使用send to或者save management,当然就可以避免此类情况
问题是,鉴于目前的水平,很多人根本不知道CATIA的链接是怎么回事,甚至有人只给别人CATProduct文件,以为这样就能看到产品。
比如,PRD.CATProduct,Part.CATProduct,很简单的装配关系。有人装配完了,直接把Part.CATPart的文件名字加了一个前缀,比如是amdufhvk_Part.CATPart
这个时候,只有首先找到原始的路径和名字,才能根据它找到新的零件的位置和名字(统一加前缀),再进一步使用替换组件
作者: amdufhvk    时间: 2006-10-20 19:24
其实,上面只是我假设的一个场景
我的目的就是要得到已经丢失连接关系的instance对应的document的原始路径和名字
作者: hino    时间: 2006-10-20 19:35
唉,你们俩呀,说得越来越乱。

有这么复杂吗?

问题很简单,就是这么一回事。

上面正好 amdufhvk 也发了图,从上面可以看到,即便文件链接丢失,手工操作时,是可以得到原来的链接的。现在的问题是,为什么用CAA时,就无法得到这个链接的字串值?
作者: hino    时间: 2006-10-20 21:08
原帖由 xacf 于 2006-10-20 08:37 发表

fullname
fullname是只读的,因为为牵扯关联关系,不能直接改的,通过替换改变它。

扯远一点。。。
其实这些“问题”,是CATIA严谨的软件工程的设计思想带来的,不建立PDM环境,解决单一数据源问题你不大可 ...


你的fullname对正常的零件是存在的,当链接错误时,这个fullname是得不到的.我已经试过n次了.
前个星期我已经试过各种方法了,无奈我的修行还不错,所以才上来请教各位的
作者: hino    时间: 2006-10-27 18:23
上面两位高手,有什么好的方法了吗?
作者: hino    时间: 2006-11-7 22:28
顶一下吧。
作者: acoka    时间: 2006-12-11 19:10
CATXDocLinkInterfaces
CATxPDMInterfaces
应该有些可以用的I/F吧,不过好像要PX1
作者: amdufhvk    时间: 2006-12-12 12:03
无论链接是否已经断开,以下的语句都能得到子文档; 只是得到的只有一级; 要得到所有的,可以递归
目前之进行到这个地步,待续(或者说,待他人续)
//pDoc 为打开的PRODUCT文档
CATIxPDMItem_var spRootPDMItem = pDoc;
spRootPDMItem->GetChildren(oCList,oPList);
for(int i=1;i<=oCList.Size();i++)
{
        CATBaseUnknown_var spChild = oCList; //取oCList的内容,不知道为什么,显示不出中括号i
        CATIxPDMItem_var spPDMChild = spChild;
        CATUnicodeString ChildFileName;
        spPDMChild->GetDocFileName(ChildFileName);
        Cout<<ChildFileName<<endl;
}

[ 本帖最后由 amdufhvk 于 2006-12-12 19:09 编辑 ]
作者: acoka    时间: 2006-12-12 14:23
你可以等R17的SP3看看有没有什么新的东西
DS在SP3应该添加了一些新的I/F
作者: amdufhvk    时间: 2006-12-12 15:24
想了个笨办法
得到ChildFileName以后,有C++自身的函数,判断一下ChildFileName代表的那个文件是否存在
作者: amdufhvk    时间: 2006-12-12 17:21
用CAA CATIA的API获取相关文件的完整路径
用C的函数,判断文件是否存在

以上思路笨是笨了点,不过我已经操作成功了.

下面的问题,就是怎么把丢失的文件和相应的Instance对应起来了

[ 本帖最后由 amdufhvk 于 2006-12-12 20:12 编辑 ]
作者: hino    时间: 2006-12-12 21:40
你已经得到了呀?还有,你怎么用C的?我只和知道用VBS或VBA。
作者: amdufhvk    时间: 2006-12-13 15:03
automation 里面没找到合适的API, 只好用C了
至于怎么用C, 一时半会可就说不明白了
作者: hino    时间: 2006-12-13 21:56
有个叫CATIADUA的东西,你研究过吗?
还有,我不明白你是如何得到各个已经载入的文档的.是用哪个object访问的?




欢迎光临 iCAx开思网 (https://www.icax.org/) Powered by Discuz! X3.3