查看: 2946|回复: 0

[原创] NX二次开发和teamcenter集成环境下文件的操作常见处理方法

[复制链接]

4

主题

3

回帖

44

积分

管理员

积分
44
发表于 2020-1-5 12:08:59 | 显示全部楼层 |阅读模式

请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!

您需要 登录 才可以下载或查看,没有账号?注册

×
% p& }/ p& I& l* m; B
NX二次开发中涉及到文件的时候,我们需要区分单机版本NX环境和集成版本NX Manager环境,分别要对文件进行处理。基于windows本地文件路径(此处讨论未涉及到Linux系统路径,如果需要这方面也可以在PLM之家上面发帖咨询)和Teamcenter数据库存储文件名称的不同,我们需要单独进行处理。此处提供些许常见方法,希望起到抛砖引玉。

/ B" C/ p# Y# R6 h9 `% [' _
1 NX单机版本二次开发文件处理方法
    ​NX单机版本二次开发通过获取当前文件名通常是当前文件本地的存储路径包含.prt后缀的路径名,对于整个路径的字符串处理,可以用字符串快速进行获取想要的文件名,文件路径等。
    ​NX的ufun函数 uf_cfi函数库也提供了相关的ufun函数,可以使用常见的方法uc4575(),uc4576(),uc4578(),可以快速通过当前的partname得到路径,得到文件名,合并和处理相关路径。
    ​使用获取的路径C:\temp\plmhome.prt 举例说明:
7 A3 [' D) |4 m! |1 k% G* l8 l
uc4576主要功能将当前的文件名进行拆解,生成dspec: C:\temp\ 和 fname: plmhome.prt (注意这里有后缀.prt),可以通过
6 j5 ]& K0 J0 d5 M0 ?
if (strrchr(temp_name, '.')) strcpy(strrchr(temp_name, '.'), "");
快速进行去除.prt 后缀,这样就可以获取到plmhome整个文件名了。
(也可以配合uc4578()去除后缀的方法);使用uc4575()属于路径合并功能和uc4576()正好相反。
int uc4576(const char * fspec,int ftype,char dspec [ MAX_FSPEC_BUFSIZE ] ,char fname [ UF_CFI_MAX_FILE_NAME_BUFSIZE ])
int uc4578(const char * fspec,int ftype,char dspec [ MAX_FSPEC_BUFSIZE ])
int uc4575(const char * dspec,int ftype,const char * fname,char fspec [ MAX_FSPEC_BUFSIZE ])
    ​这里面NX提供了filetype的参数,基本上常见的类型都可以通过filetype自动生成相关的后缀或者通过filetype移除后缀名​。
    ​譬如,.prt的filetype的值是2,bat的filetype类型是243等。这里面比较有趣的是文件夹类型,也作为filetype进行处理定义,值为100,这样的话我们其实不需要区分文件,文件夹都可以使用这些方法进行处理,确实很好用。
当然如果使用NX Open C++的相关方法的话,也可以很快获取到全路径通过
FullPath()可以获取整个全路径,通过leaf()可以直接获取带后缀的文件名。通常情况我们可能需要通过同名的文件名去创建同名的log文件,因此比较常用这些分解和合并的方法。
4 N# U7 j% L$ S5 G8 @
3 B$ S( \9 o( Q5 Q8 e% z+ J. k8 H
2 关于和Teamcenter集成NX Manager文件的处理方法
* ?) x9 I3 x' |/ a6 M4 p; a
NX集成环境下,数据全部存储在TC数据库中的,内部数据库的方法可以使用UF_PART_ask_part_name()方法获取文件名,但是此时的文件名是数据库内部的文件名长成这个样子:
"%UGMGR=V3.2 PH=itemUid PRH= itemRevUid PN= item_id PRN=item_revision_id AN="dataset name" RT="relation type" AT="Dataset type" AUID=appuid"
如何得到我们想要的文件名呢,这里针对常见我们需要用到的情况来处理下。
7 {0 c' C: F! m5 ?% L
(1)只是想获取文件编码,文件描述,文件版本等信息,通过0 J" N2 V0 ]/ r! N
UF_UGMGR_decode_part_filename()就可以完成对这个字符串的分解
int UF_UGMGR_decode_part_file_name
4 A4 U. g8 [& s) ](( U0 u  C' ?1 \7 M" H" N
const char * encoded_name,
  t0 G: v4 R' |+ S2 ?8 jchar part_number [ UF_UGMGR_PARTNO_BUFSIZE ] ,
3 _; ?. U/ D6 f# P' d3 V5 _) a* `2 Cchar part_revision [ UF_UGMGR_PARTREV_BUFSIZE ] ,
, G+ b/ W; F2 E6 N0 e7 |char part_file_type [ UF_UGMGR_FTYPE_BUFSIZE ] ,  N5 u! @; k, }+ u3 \8 f8 ]
char part_file_name [ UF_UGMGR_FNAME_BUFSIZE ]8 r" o4 `& `3 X' x
)
(2)我们需要处理外部程序,输入@DB/PartName/Rev这种格式,完成相关外部命令的输入参数处理,这个时候我们可以使用UF_UGMGR_convert_file_name_to_cli()将上面的一串内部命令字符串转换成外部参数模式
int UF_UGMGR_convert_file_name_to_cli
# {  @; {8 F6 F4 [(
% c! M; W6 o  g" C
const char * internal_name,3 s7 M2 W6 J# T* x; [
char * * cli_name, o! Z$ L2 x  ^1 K1 D
)
简单的实现例子如下:

6 Y4 }! G2 {# j1 {9 ]9 b8 x                               
登录/注册后可看大图

# [2 v4 x7 _5 b  i                               
登录/注册后可看大图

3 y# i, z5 g& O' l1 m# R: l3 U                               
登录/注册后可看大图
代码部分:
" y1 U7 \9 t. b3 L/ O" H
                               
登录/注册后可看大图
​3 关于NX集成环境的判断
5 l8 n, p# _5 S+ @+ E  ~7 P
这地方比较简单了,通过UF_is_ugmanager_active()就可以进行环境的判断。
logical is_ugmgr;
UF_CALL(UF_is_ugmanager_active(&is_ugmgr));
if (!is_ugmgr)
{
    //本地版本NX( \0 |4 f2 B$ G2 k8 j5 p
}
' M/ r; I: J% }9 a. m6 r
else
{
    //集成环境
}3 k' e- A8 e) J; |6 Y# y

, D- K3 L+ \, A8 `7 h7 _3 K- D# i/ H) n, `$ d9 k# e% C
. z3 p  [+ S" q
4 {5 p& U8 q5 p: o' W- L0 I
                               
登录/注册后可看大图
6 W( X- B+ r8 E; Q+ c6 p
+ x7 ^; J* O) ~/ Y  j: O5 s
                               
登录/注册后可看大图
END
PLM之家plmhome

% Q7 ~  i2 w- U2 w& N2 {1 B                               
登录/注册后可看大图

! i1 g# x7 P* }5 N/ Y6 [▲长按二维码“识别”关注
; A7 j' ]) ~1 ]4 `/ \% Z$ r

7 X9 N$ X3 o5 {! M2 ~1 v4 I
* g, ~2 G( U) a: B/ W$ z( r
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.doteam.tech
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

在本版发帖
关注公众号
QQ客服返回顶部