UG二次开发NXOpen-Python(十三)内螺纹滚道干涉磨砂轮截形计算

发布时间 2023-06-13 13:07:46作者: hustmse0510

  滚珠螺母内螺纹滚道在加工时,砂轮接杆偏摆角度为滚道螺旋升角,砂轮截形为滚道法向截形。当螺母导程较大时,比如说1616、2020等规格,螺旋升角较大,若按螺旋升角的大小调整砂轮接杆角度,则砂轮接杆会和螺母内孔产生干涉,此时就需要采用其它加工方法,比如说“以车代磨”、“软轴磨”、“干涉磨”等等。

  所谓的干涉磨,指的是以小于螺旋升角的角度调整砂轮接杆角度,来对滚道进行磨削,此时,砂轮的截形就不能以滚道的法向截形来修整,需要通过计算来确定。螺纹滚道的螺旋铣也是这个道理(相当于砂轮角度为0°的干涉磨)。

  常规磨削时,砂轮角度与滚道螺旋升角相同,砂轮与螺母滚道的接触线为滚道法向截面,该接触线在绕机床主轴旋转的同时Z向进给,从而形成了螺旋滚道面。对于干涉磨来讲,由于砂轮偏摆的角度与螺旋升角不同,所以砂轮与滚道的接触线不是滚道法向截面,但可以确定的是,螺旋滚道面也是由该接触线在绕机床主轴旋转的同时Z向进给形成的,所以,我们只要求出了接触线(或者说接触线上的多个点)就能求出砂轮截形。

  内螺纹滚道面和砂轮回转面在接触线处相切,切点的公法线必然通过砂轮的回转轴线,所以,螺旋滚道曲面上法线通过刀具轴线的点就是接触线上的点,只要找到这些点可以了。

import NXOpen
import NXOpen_UF

theSession: NXOpen.Session = NXOpen.Session.GetSession()
theUFSession: NXOpen_UF.UFSession = NXOpen_UF.UFSession.GetUFSession()
modling: NXOpen_UF.Modeling = theUFSession.Modeling
v3: NXOpen_UF.Vec3 = theUFSession.Vec3
workPart: NXOpen.Part = theSession.Parts.Work
lw: NXOpen.ListingWindow = theSession.ListingWindow
lw.Open()


# 计算空间两直线的距离,用于判定公法线是否在砂轮轴线上
def getDis(p1, v1, p2, v2):
    mn = [p1[0] - p2[0], p1[1] - p2[1], p1[2] - p2[2]]
    return abs(v3.Dot(v3.Cross(v1, v2), mn) / v3.Mag(v3.Cross(v1, v2)))


# 砂轮轴线位置
t = 11
for body in workPart.Bodies:
    for face in body.GetFaces():
        # 遍历螺旋曲面u参数
        for i in range(50):
            u = 0.02 * i
            # 遍历v参数,正常情况这里用迭代法,为了简单起见,这里直接暴力循环
            for j in range(100000):
                v = 0.00001 * j
                # 获取[u,v]下的点和法向量
                result = modling.EvaluateFace(face.Tag, 10, [u, v])
                # 求法向量和砂轮轴线的距离
                dis_1 = getDis(result.SrfPos, result.SrfUnormal, [t, 0.0, 0.0],
                               [0.0, 0.0, 1.0])
                # 设置距离精度,如果<此精度,则认为法向量穿过砂轮轴线
                if dis_1 < 0.0001:
                    lw.WriteLine(str([result.SrfPos[0] - t, result.SrfPos[1],
                                      result.SrfPos[2]]))
                    lw.WriteLine(
                        f"u={u};v={v}:{result.SrfPos},{result.SrfUnormal},{dis_1}")
                    point = workPart.Points.CreatePoint(
                        NXOpen.Point3d(result.SrfPos[0], result.SrfPos[1],
                                       result.SrfPos[2]))
                    point.SetVisibility(
                        NXOpen.SmartObjectVisibilityOption.Visible)
                    workPart.Datums.CreateFixedDatumAxis(
                        NXOpen.Point3d(*result.SrfPos),
                        NXOpen.Point3d(result.SrfPos[0] + result.SrfUnormal[0],
                                       result.SrfPos[1] + result.SrfUnormal[1],
                                       result.SrfPos[2] + result.SrfUnormal[2]))
                    break

  如上图,可以求出各个接触点的坐标和该点的法向量,测量法向量和砂轮轴线的距离,可以看到<0.0001,也就是可以认为该法向量通过砂轮轴线。然后在砂轮坐标系中对接触点进行处理,就可以求的砂轮截形,在此不再赘述。