iCAx开思工具箱

标题: 用一个命令实现操作的两次变换 [打印本页]

作者: hello_icax    时间: 2010-5-20 13:43
标题: 用一个命令实现操作的两次变换
请看如下代码.
代码的功能是:将输入的原始操作,经过两次变化后生成目标操作。(先旋转,后缩放。)
此功能在GRIP内可用一条命令直接完成.

请教在VB.NET内或 VC++内该如何实现?

Option Strict Off
Imports System
Imports NXOpen
Imports NXOpen.UF
Imports NXOpen.UI
Imports NXOpen.Utilities

Module M_Trns
    Sub Main1()
        TranformOneOper("CONTOUR_AREA", "NewOper")
    End Sub
    '将输入的原始操作,经过两次变化后生成目标操作。(先旋转,后缩放。)
    Sub TranformOneOper(ByVal stOperName As String, ByVal stName As String)
        Dim theSession As Session = Session.GetSession()
        Dim workPart As Part = theSession.Parts.Work
        Dim displayPart As Part = theSession.Parts.Display
        Dim operationTransformBuilder1 As CAM.OperationTransformBuilder
        Dim operationTransformBuilder2 As CAM.OperationTransformBuilder
        Dim objectsToTransform1(0) As CAM.CAMObject
        Dim sp As Point3d
        Dim ep As Point3d
        Dim line1 As Line
        Dim point1 As Point3d
        Dim nXObject1 As NXObject
        Dim rp As Point
        sp.X = 0 : sp.Y = 0 : sp.Z = 0 : ep.X = 0 : ep.Y = 10 : ep.Z = 0
        line1 = workPart.Curves.CreateLine(sp, ep)
        point1 = New Point3d(0.0, 0.0, 0.0)

        '绕直线旋转
        objectsToTransform1(0) = workPart.CAMSetup.CAMOperationCollection.FindObject(stOperName)
        operationTransformBuilder1 = workPart.CAMSetup.CreateOperationTransformBuilder(objectsToTransform1)
        With operationTransformBuilder1
            '.TransformType = CAM.OperationTransformBuilder.Transform.Translate
            .TransformType = CAM.OperationTransformBuilder.Transform.RotateAboutLine    '绕直线旋转
            .MoveCopyInstance = CAM.OperationTransformBuilder.Result.Copy               '复制
            .LineMethod = CAM.OperationTransformBuilder.Line.Specify
            .LineSelection.SetValue(line1, workPart.ModelingViews.WorkView, point1)     '基准直线,当然,也可用两点方式。
            .AngleValue = 13.0                                                          '旋转角度。
            nXObject1 = .Commit()
            .Destroy()
        End With
        '以WCS原点为基点比例放大。
        rp = workPart.Points.CreatePoint(sp)    'WCS原点
        objectsToTransform1(0) = workPart.CAMSetup.CAMOperationCollection.FindObject(stOperName + "_COPY") '当原始操作名较长时,此句会失败。
        operationTransformBuilder2 = workPart.CAMSetup.CreateOperationTransformBuilder(objectsToTransform1)
        With operationTransformBuilder2
            .TransformType = CAM.OperationTransformBuilder.Transform.Scale  '比例变换
            .ScaleFactor = 1.2  '比例值
            .ReferencePoint = rp    '参考点
            .MoveCopyInstance = CAM.OperationTransformBuilder.Result.Move   '移动
            nXObject1 = .Commit()
            .Destroy()
        End With
        objectsToTransform1(0).SetName(stName)  '因为是移动,所以该变量引用的就是目标操作。
        MsgBox("ok")
    End Sub
    Public Function GetUnloadOption(ByVal dummy As String) As Integer
        GetUnloadOption = Session.LibraryUnloadOption.Immediately
    End Function
End Module


GRIP如下:
MAT1=MATRIX/SCALE,nScaleX,nScaleY,nScaleZ
MAT2=MATRIX/ZXROT,ANG
MAT=MATRIX/MAT1,MAT2
OPTRAN/MAT,ST1,INSTNC,ST2,1,IFERR,END1:

相信在VC++内应该也有此功能,可惜找了N次都没找到..
没有次功能?还是要自己编制子程序实现?
作者: codedatou    时间: 2010-5-23 21:50
试试函数uf5942-uf5947,祝你成功
作者: hello_icax    时间: 2010-5-24 09:39
谢谢,指点.
但是,事实上我早就用过uf5947,结果是:
好像只有几何对象(如实体,片体,曲线等)才有效.
对于刀路对象就出错.  status返回值时3.
该问题我发过另外一个求助帖.但是无人回应!
作者: UG是我的饭碗    时间: 2012-10-22 23:14
好像没有这么一个函数,我以前也找过




欢迎光临 iCAx开思工具箱 (https://t.icax.org/) Powered by Discuz! X3.3