三维曲面板材成型设备的成型模具是一组由mxn个基本体组成的矩阵如图1。
图1
在板材成型粗加工时,需要得到对应模具基本体位置上投影的高度值。在使用solidwords软件采集曲面上对应点坐标数据时,在软件现有条件下,通过草图绘制,曲线投影可以得到点,但是只能通过测量能显示测量数据却无法同时把上千个点的数据导出,如果一个点一个点的记录,会带来工作量大、数据记录不准确的问题。因此,本文就利用solidwords软件的API技术,来解决上述所存在的问题。

Solidwords软件可以通过OLE(对象嵌入与连接)或者COM为用户提供了自由开放、功能完整的二次开发接口。Solidwords软件支持设计人员根据具体需要对其进行二次开发工作,并且提供了数百个的API函数,只要使用Visual C++、Visual Basic等编程语言就可以对solidwords进行二次开发,从而创建出用户定制的、专门的solidwords应用模块。
Solidwords软件的API技术采用面向对象的编程方法,顶层为solidwords对象,在其下是solidwords活动文档对象(包括“零件环境”、“工程图环境”、“装配体环境”以及“非工作环境”四个状态),再向下层分解,最底层是用户直接操作的特征和图形元素组成的对象。从而形成了一个自顶向下、层次分明、条例清晰的体系。灵活的使用solidwords的API技术可以实现许多软件本身无法涉及的功能,如完成定制级的系列化产品零部件绘制工作、自动装配、自动工程图、批量转换格式、批量打印等可快速提高工作效率。
下面就以三维曲面点坐标数据导出为例,重点阐述使用solidwords软件的API技术实现曲面上点坐标数据的导出方法。本实例以Visual Basic语言为基础编写。
在曲面点数据导出中,用到了solidwords软件API技术中的遍历技术。可以快速高效的在不进行任何辅助绘图情况下,直接导出点的数据,数据导出存放于txt格式文档中。
具体编程如下:
单击宏工具栏上的新建宏命令,命名为曲面点数据导出.swp,添加代码如下:
Option Explicit
Sub main()
Dim swApp As SldWorks.SldWorks
Dim myModel As SldWorks.ModelDoc2
Dim mathUtils As SldWorks.MathUtility
Dim nStart As Single
nStart = Timer
Set swApp = Application.SldWorks
Set myModel = swApp.ActiveDoc
Set mathUtils = swApp.GetMathUtility()
' 以下遍历22x22个投影点
Dim i As Integer
Dim j As Integer
For i = 0 To 21
For j = 0 To 21
' 预先指定一个被投影面
Dim mySelMgr As SldWorks.SelectionMgr
Dim selObj As Object
Dim faceToUse As SldWorks.Face2
Dim surfaceToUse As SldWorks.Surface
Dim selCount As Long
Dim selType As Long
Set mySelMgr = myModel.SelectionManager
selCount = mySelMgr.GetSelectedObjectCount2(0)
If (selCount > 0) Then
selType = mySelMgr.GetSelectedObjectType3(1, 0) Set selObj = mySelMgr.GetSelectedObject6(1, 0)
If (selType = SwConst.swSelFACES)
Then
Set faceToUse = selObj
End If
End If
' 定义投影向量
Dim basePoint(0 To 2) As Double, rayDir(0 To 2) As Double
Dim vBasePoint As Variant, vVector As Variant
Dim rayPoint As SldWorks.MathPoint, rayVector As SldWorks.MathVector
Dim intersectPt As SldWorks.MathPoint
Dim vPoint As Variant, vPoint2 As Variant
Dim xPt As Double, yPt As Double, zPt As Double
' 先对曲面的情况进行投影; First try the face
If Not faceToUse Is Nothing Then
basePoint(0) = i 0.125 '
basePoint(1) = j 0.125 '
basePoint(2) = 1#
vBasePoint = basePoint
Set rayPoint = mathUtils.CreatePoint(vBasePoint)
rayDir(0) = 0#
rayDir(1) = 0#
rayDir(2) = -1#
vVector = rayDir
Set rayVector = mathUtils.CreateVector(vVector)
Set intersectPt = faceToUse.GetProjectedPointOn(rayPoint, rayVector)
If Not intersectPt Is Nothing Then
vPoint = intersectPt.ArrayData
xPt = vPoint(0)
yPt = vPoint(1)
zPt = vPoint(2)
清单输出窗口.LIST.Text = 清单输出窗口.LIST.Text & Format(xPt 1000, "##0.0#####") & " , "
清单输出窗口.LIST.Text = 清单输出窗口.LIST.Text & Format(yPt 1000, "##0.0#####") & " , "
清单输出窗口.LIST.Text = 清单输出窗口.LIST.Text & Format(zPt 1000, "##0.0#####") & " " & vbCrLf
Else
清单输出窗口.LIST.Text = 清单输出窗口.LIST.Text & Format(zPt 1000, "##0.0#####") & " " & vbCrLf '(j 125, "##0.0#####") & " , 0" & " " & vbCrLf '控制是否输出未投影到曲面上的点位 " No face hit point."
End If
End If
Next j
Next i
清单输出窗口.计算耗用时间.Text = Round(Timer) - Round(nStart) & "秒"
清单输出窗口.Show
End Sub
Public Sub Delayms(lngTime As Long) '延时程序调用-测试时用
Dim StartTime As Single
Dim CostTime As Single
StartTime = Timer
Do While (Timer - StartTime) 1000 < lngTime
DoEvents
Loop
End Sub
选择曲面然后执行编写的宏,效果如图2。
图2
点数据保存后就可以得到txt格式数据文件如图3。
图3
当然也可以验证一下输出的点对不对,就可以让solidwords重画一下点,选择生成点草图就会得到如图4所示。
总结:
借助solidwords软件强大的绘图功能、二次开发功能能很好的解决自己企业或生产上遇到的许多问题。该方法利用Visual Basic语言在solidwords软件API二次开发技术上开发出的三维曲面上点的数据导出应用程序轻松解决了生产应用中遇到的问题。该方法不用增加辅助绘图操作即可轻松、准确导出所需点数据,更好服务与生产。此外,该方法还可应用于类似工程应用。
如果需求宏程序代码,可以私信交流。现在主要精力在写rhino方面的程序。