应用场景
紧固件是一类用于紧固连接两个或多个零件的机械零件,在许多领域都有用到,比如船舶、车辆,在生产相应产品过程中,产品工程师往往要先将产品对应的数模制作好,数模包括产品主体部分以及大量紧固件,要将这些紧固件移动到对应位置,往往需要通过使用NX中的移动组件命令来实现,如果存在以下情景:现存在一组已经移动到对应位置的紧固件,需要将一组还未移动的紧固件移动到相同位置,则可以使用下面的方法,当然,这种方法不限于紧固件,这里只是举个例子,具体还能否在别处使用,只要符合移动的原理就都可以,下面我将详细讲一下。
绝对显示坐标系与绝对工作坐标系
首先我要讲一下绝对显示坐标系和绝对工作坐标系以便大家理解哈,在刚将组件装配进来后,其绝对工作坐标系和绝对显示坐标系是重合的,如下图:可以通过创建点来判断绝对工作坐标系和绝对显示坐标系的位置,左图为绝对显示坐标系原点,右图为绝对工作坐标系原点:
然后,我通过移动组件命令将该正方体块进行移动,可以发现其绝对工作坐标系原点和绝对显示坐标系原点已不在一个位置,如下图:
可以发现,在移动组件后,其绝对显示坐标系并未改变,但其绝对工作坐标系却随着块体一起进行了移动,那么如果现在有两个一模一样的组件,只是它们的位置不一样,是不是我将要移动组件的绝对工作坐标系跟已经移动好的组件的绝对工作坐标系对上,就相当于完成了一个组件移动,因此我将使用下面的函数进行实现。
相关函数介绍
AskInstOfPartOcc
简单介绍一下这个函数,这个函数实现的功能为:通过输入组件的occurrence tag从而得到其instance tag,帮助文档如下,这俩tag具体是啥意思就不过多解释了,大家在网络上都能查到哈。
大家可以在装配导航器中右键选择属性,在信息窗口中观看该组件的occurrence tag以及instance tag,如下图:
然后可以通过如下代码进行简单验证该函数的功能,输入51620,然后在信息窗口打印输出:
import NXOpen.UF as UF
uf_session=UF.UFSession.GetUFSession()
t=uf_session.Assem.AskInstOfPartOcc(51620)
uf_session.Ui.OpenListingWindow()
uf_session.Ui.WriteListingWindow('{}'.format(t))
效果如下:
AskComponentData
这个函数实现的功能为:通过输入组件的occurrence tag或者instance tag得到相关信息,如矩阵信息,位置信息,部件名称等等,帮助文档如下:
代码如下:
import NXOpen.UF as UF
uf_session=UF.UFSession.GetUFSession()
t=uf_session.Assem.AskComponentData(51620)
uf_session.Ui.OpenListingWindow()
uf_session.Ui.WriteListingWindow('{}'.format(t))
实现的效果如下:
RepositionInstance2
这个函数实现的功能为:通过输入要移动组件的instance tag,要移动到位置的原点以及坐标系矩阵,从而实现组件移动,帮助文档如下:
实现一键移动组件
接下来就可以结合以上函数实现一键移动组件了,这里可以用到UI块来创建一个选择对象界面,从而实现用户在先后选择准备移动的组件和已经移动好的组件后,实现批量移动组件到相应位置,这里生成的dlx文件的内容就不放了,直接放实现功能的py文件中的ok回调函数中的内容,代码如下:
def ok_cb(self):
errorCode = 0
try:
errorCode = self.apply_cb()
if errorCode==0:
t_list=[]
instance_tag0_list=[]
self.selected_objects0=self.selection0.GetSelectedObjects()
self.selected_objects1=self.selection01.GetSelectedObjects()
for occur_tag1 in self.selected_objects1:
instance_tag1=self.uf_session.Assem.AskInstOfPartOcc(occur_tag1.Tag)
t=self.uf_session.Assem.AskComponentData(instance_tag1)
t_list.append(t)
for occur_tag0 in self.selected_objects0:
instance_tag0=self.uf_session.Assem.AskInstOfPartOcc(occur_tag0.Tag)
instance_tag0_list.append(instance_tag0)
for i in range(len(t_list)):
self.uf_session.Assem.RepositionInstance2(instance_tag0_list[i],t_list[i][3],t_list[i][4])
except Exception as ex:
errorCode = 1
self.theUI.NXMessageBox.Show("Block Styler", NXOpen.NXMessageBox.DialogType.Error, str(ex))
return errorCode
实现的效果如下,我是直接用操作记录编辑器打开运行该文件实现的,也可以挂在到自定义菜单下,这里就不演示了: