Api CreateBodyFromBox3 boxAxis矢量问题

Api CreateBodyFromBox3 boxAxis矢量问题,api,macros,solidworks,Api,Macros,Solidworks,我正在使用CreateBodyFromBox3为宏特征创建一组实体,其中一个需要放置在与z轴成一定角度的位置。我可以设置拉伸向量,使其与X或Y成一定角度,没有任何问题,但如果是关于Z,则垂直于拉伸检测的向量显然有一个Z分量。形状是正确的,因此我知道数组中的所有其他值都是正确的,并且创建的实体没有任何错误 有什么解决办法吗?我曾尝试使用转换,我能够将转换数组数据转换为变量,但当我尝试使转换数组数据等于变量时,它只是将变量重置回原始数组数据 (显示的坐标系与模型空间坐标系相同) dblData(

我正在使用CreateBodyFromBox3为宏特征创建一组实体,其中一个需要放置在与z轴成一定角度的位置。我可以设置拉伸向量,使其与X或Y成一定角度,没有任何问题,但如果是关于Z,则垂直于拉伸检测的向量显然有一个Z分量。形状是正确的,因此我知道数组中的所有其他值都是正确的,并且创建的实体没有任何错误

有什么解决办法吗?我曾尝试使用转换,我能够将转换数组数据转换为变量,但当我尝试使转换数组数据等于变量时,它只是将变量重置回原始数组数据

(显示的坐标系与模型空间坐标系相同)


dblData(3)=0
dblData(4)=0.5
dblData(5)=-0.866


dblData(3)=0.5
dblData(4)=-0.866

dblData(5)=0
好的,所以我从来没有让数组的向量部分工作过,只是使用了转换,API帮助在实体和特征组件上的使用方面不是非常清楚,但它似乎是一样的

(其中一些内容可能看起来不符合犹太教,但此处的格式给我带来了麻烦,因此我不得不将一些内容混在一起。)

公共子CreateBody(bInsert为布尔值)
将swWorkBody尺寸标注为SldWorks.Body2,swToolBody1尺寸标注为SldWorks.Body2
将swToolBody2的尺寸标注为SldWorks.Body2
将swTempBody_1的尺寸标注为SldWorks.body 2,将swTempBody_2的尺寸标注为SldWorks.body 2
作为SldWorks.Modeler的Dim swModeler
将swFaultEnt设置为SldWorks.FaultEntity
将swTransform设置为SldWorks.MathTransform
将swMathUtil设置为SldWorks.MathUtility,将vTransform设置为Variant
将swMoveBody作为SldWorks.MoveCopyBodyFeatureData进行调整
将dblData(8)调为双精度
作为变体的Dim vBody
暗长
暗Y为双精度,θ为双精度,π为双精度
作为布尔函数的Dim-bRet
Dim-bReRet为布尔型
关于错误转到错误
如果bInsert=True,则GetMetric
pi=4*Atn(1)
θ=Atn(mRoofSlope/(12*m))*(π/180)
Y=(mWidth-(2*(mExtWallDepth+mIntWallDepth)))*Tan(θ)
设置swap=Application.SldWorks
设置swModel=swap.ActiveDoc
设置swModeler=swap.GetModeler
设置swMathUtil=swap.GetMathUtility
dblData(0)=0'X中心
dblData(1)=0'Y中心
dblData(2)=0'Z中心
dblData(3)=0'X方向向量
dblData(4)=1'Y方向向量
dblData(5)=0'Z方向向量
dblData(8)=mHight+Y'沿Y方向的拉伸高度
“挖空外墙
"做工具体",
dblData(6)=mWidth-(2*(mExtWallDepth+mIntWallDepth))“沿X轴拉伸的宽度
dblData(7)=沿Z方向拉伸的最大长度-(2*(mExtWallDepth+mIntWallDepth))'
设置swToolBody1=swModeler.CreateBodyFromBox3(dblData)
设置swFaultEnt=swToolBody1.Check3
ProcessFaultEntity交换,swModel,swFaultEnt
“让工作成为你的身体
dblData(6)=沿X的拉伸宽度
dblData(7)=沿Z的拉伸长度
设置swWorkBody=swModeler.CreateBodyFromBox3(dblData)
设置swFaultEnt=swWorkBody.Check3
ProcessFaultEntity交换,swModel,swFaultEnt
vBody=swWorkBody.Operations2(SWBODYCUT,SWToolbody 1,lngErr)
设置swTempBody_1=vBody(0)
'创建低侧墙
"做工具体",
dblData(0)=(mWidth/2)-(mExtWallDepth+mIntWallDepth)/2)X中心
dblData(1)=dblData(8)-Y'中心
dblData(6)=mExtWallDepth+mIntWallDepth'沿X的拉伸宽度
dblData(8)=Y'沿Y的拉伸高度
设置swToolBody1=swModeler.CreateBodyFromBox3(dblData)
设置swFaultEnt=swToolBody1.Check3
ProcessFaultEntity交换,swModel,swFaultEnt
vBody=swTempBody_1.操作2(SWBODYCUT、SWToolBody 1、lngErr)
设置swTempBody_2=vBody(0)
'创建B&D墙坡
dblData(0)=0'X中心
dblData(1)=0'Y中心
dblData(2)=0'Z中心
“=========================这是我试图使用向量方法的原因==========
’=====================我刚刚用了30度,所以我可以看到它===============
dblData(3)=0.5
dblData(4)=-0.866
dblData(5)=0
'========================================================================
dblData(6)=mWidth-2*(mExtWallDepth+mIntWallDepth)+(Y*Tan(θ))/2'沿X方向的拉伸宽度
dblData(7)=沿Z的拉伸长度
设置swToolBody2=swModeler.CreateBodyFromBox3(dblData)
设置swFaultEnt=swToolBody2.Check3
ProcessFaultEntity交换,swModel,swFaultEnt
’==================================这是修复程序========================
bRet=swToolBody2.GetConcurrenceTransform2(swToolBody2,swTransform)
vTransform=swTransform.ArrayData
v变换(0)=Cos(θ)
v变换(1)=-Sin(θ)
vTransform(2)=0
v变换(3)=正弦(θ)
v变换(4)=Cos(θ)
vTransform(5)=0
vTransform(6)=0
vTransform(7)=0
v变换(8)=1
vTransform(9)=0
V变换(10)=(mHight+Y/2)
vTransform(11)=0
swTransform.ArrayData=vTransform
vTransform=swTransform.ArrayData
bReRet=swToolBody2.ApplyTransform(swTransform)
vBody=swTempBody_2.操作2(SWBODYCUT、SWToolBody 2、lngErr)
'========================================================================    
'设置为宏体
将swHouseBody=vBody(0)设置为最终实体
如果状态为0,则swHouseBody.Display3 swModel,255,0
swModel.ViewZoomtofit
出口接头
呃:
调试。打印“lngErr:&lngErr
调试。打印“错误号:”&错误号
调试。打印“错误说明:”&错误说明
呃,明白了
设置swFaultEnt=Nothing
设置swWorkBody_1=无
Public Sub CreateBody(bInsert As Boolean)
Dim swWorkBody As SldWorks.Body2, swToolBody1 As SldWorks.Body2
Dim swToolBody2 As SldWorks.Body2
Dim swTempBody_1 As SldWorks.Body2, swTempBody_2 As SldWorks.Body2
Dim swModeler As SldWorks.Modeler
Dim swFaultEnt As SldWorks.FaultEntity
Dim swTransform As SldWorks.MathTransform
Dim swMathUtil As SldWorks.MathUtility, vTransform As Variant
Dim swMoveBody As SldWorks.MoveCopyBodyFeatureData

Dim dblData(8) As Double
Dim vBody As Variant
Dim lngErr As Long
Dim Y As Double, theta As Double, pi As Double
Dim bRet As Boolean
Dim bReRet As Boolean

On Error GoTo errH
If bInsert = True Then GetMetric 
pi = 4 * Atn(1)
theta = Atn(mRoofSlope / (12 * m)) ' * (pi / 180)
Y = (mWidth - (2 * (mExtWallDepth + mIntWallDepth))) * Tan(theta)

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swModeler = swApp.GetModeler
Set swMathUtil = swApp.GetMathUtility

dblData(0) = 0  'X Center
dblData(1) = 0  'Y Center
dblData(2) = 0  'Z Center
dblData(3) = 0  'X Direction Vector
dblData(4) = 1  'Y Direction Vector
dblData(5) = 0  'Z Direction Vector
dblData(8) = mHight + Y  'Hight of Extrution along Y

'Hollow Out Ext Walls
    'Make Tool Body
        dblData(6) = mWidth - (2 * (mExtWallDepth + mIntWallDepth))   'Width of Extrution along X
        dblData(7) = mLength - (2 * (mExtWallDepth + mIntWallDepth))  'Length of Extrution along Z

        Set swToolBody1 = swModeler.CreateBodyFromBox3(dblData)
        Set swFaultEnt = swToolBody1.Check3
        ProcessFaultEntity swApp, swModel, swFaultEnt

    'Make Work Pice Body
        dblData(6) = mWidth   'Width of Extrution along X
        dblData(7) = mLength  'Length of Extrution along Z

        Set swWorkBody = swModeler.CreateBodyFromBox3(dblData)
        Set swFaultEnt = swWorkBody.Check3
        ProcessFaultEntity swApp, swModel, swFaultEnt

        vBody = swWorkBody.Operations2(SWBODYCUT, swToolBody1, lngErr)
        Set swTempBody_1 = vBody(0)

'Create Low Side Walls
    'Make Tool Body
        dblData(0) = (mWidth / 2) - ((mExtWallDepth + mIntWallDepth) / 2)   'X Center
        dblData(1) = dblData(8) - Y                                         'Y Center
        dblData(6) = mExtWallDepth + mIntWallDepth                          'Width of Extrution along X
        dblData(8) = Y                                                      'Hight of Extrution along Y

        Set swToolBody1 = swModeler.CreateBodyFromBox3(dblData)
        Set swFaultEnt = swToolBody1.Check3
        ProcessFaultEntity swApp, swModel, swFaultEnt

        vBody = swTempBody_1.Operations2(SWBODYCUT, swToolBody1, lngErr)
        Set swTempBody_2 = vBody(0)

    'Create B&D Wall Slop
        dblData(0) = 0  'X Center
        dblData(1) = 0  'Y Center
        dblData(2) = 0  'Z Center
    '=============== This is were I was trying to use the vector method ==========
    '=============== I was just using 30 degrees so i could see it ===============
        dblData(3) = 0.5
        dblData(4) = -0.866
        dblData(5) = 0
    '========================================================================
        dblData(6) = mWidth - 2 * (mExtWallDepth + mIntWallDepth) + (Y * Tan(theta)) / 2 'Width of Extrution along X
        dblData(7) = mLength     'Length of Extrution along Z

        Set swToolBody2 = swModeler.CreateBodyFromBox3(dblData)
        Set swFaultEnt = swToolBody2.Check3
        ProcessFaultEntity swApp, swModel, swFaultEnt

  '======================== This is the fix ========================
        bRet = swToolBody2.GetCoincidenceTransform2(swToolBody2, swTransform)
        vTransform = swTransform.ArrayData

        vTransform(0) = Cos(theta)
        vTransform(1) = -Sin(theta)
        vTransform(2) = 0
        vTransform(3) = Sin(theta)
        vTransform(4) = Cos(theta)
        vTransform(5) = 0
        vTransform(6) = 0
        vTransform(7) = 0
        vTransform(8) = 1
        vTransform(9) = 0
        vTransform(10) = (mHight + Y / 2)
        vTransform(11) = 0

        swTransform.ArrayData = vTransform
        vTransform = swTransform.ArrayData
        bReRet = swToolBody2.ApplyTransform(swTransform)
        vBody = swTempBody_2.Operations2(SWBODYCUT, swToolBody2, lngErr)
'========================================================================    
'Set to Macro Body
Set swHouseBody = vBody(0)   'Set to Final Body

If STATE <> 0 Then swHouseBody.Display3 swModel, 255, 0
swModel.ViewZoomtofit

Exit Sub
errH:
Debug.Print "lngErr: " & lngErr
Debug.Print "Err Number: " & Err.Number
Debug.Print "Err Description: " & Err.Description
Err.Clear
Set swFaultEnt = Nothing
Set swWorkBody_1 = Nothing
Set swWorkBody_2 = Nothing
Set swToolBody1 = Nothing
Set swToolBody2 = Nothing
Set swHouseBody = Nothing
End Sub

Private Sub ProcessFaultEntity(swApp As SldWorks.SldWorks, swModel As             SldWorks.ModelDoc2, swFaultEnt As SldWorks.FaultEntity)
Dim nCount As Long
Dim swEnt As SldWorks.Entity
Dim bRet As Boolean
Dim i  As Long
nCount = swFaultEnt.Count: If 0 = nCount Then Exit Sub 'Else print the error code for each fault
For i = 0 To nCount - 1
    Set swEnt = swFaultEnt.Entity(i)
    If Not swEnt Is Nothing Then
        bRet = swEnt.Select4(True, Nothing): Debug.Assert bRet
    End If
    Debug.Print "    Fault[" & i & "] = " & swFaultEnt.ErrorCode(i)
Next i
End Sub