Below macro loads the Halloween pumpkin model from an external geometry file and displays it in the graphics window only. The geometry displayed as 3D watermark and cannot be selected or edited. It is also not present in the Feature Manager Tree as it not generated using features.
How To Run Macro
- Create new macro and paste the code below
Private Declare PtrSafe Function CreateStreamOnHGlobal Lib "ole32" (ByVal hGlobal As LongPtr, ByVal fDeleteOnRelease As Long, ByRef ppstm As Any) As Long Dim swApp As SldWorks.SldWorks Dim swBody As SldWorks.Body2 Sub main() Set swApp = Application.SldWorks Dim swModel As SldWorks.ModelDoc2 Set swModel = swApp.ActiveDoc If Not swModel Is Nothing Then Dim filePath As String filePath = swApp.GetCurrentMacroPathFolder() & "\geometry.dat" Set swBody = LoadBodyFromFile(filePath) swBody.Display3 swModel, RGB(255, 165, 0), swTempBodySelectOptions_e.swTempBodySelectOptionNone Else MsgBox "Please open the model" End If End Sub Function LoadBodyFromFile(filePath As String) As SldWorks.Body2 Dim buff() As Byte buff = ReadByteArrFromFile(filePath) Dim comStream As IUnknown Set comStream = BytesArrToComStream(buff) Dim swModeler As SldWorks.Modeler Set swModeler = swApp.GetModeler Dim swBody As SldWorks.Body2 Set swBody = swModeler.Restore(comStream) Set LoadBodyFromFile = swBody End Function Function ReadByteArrFromFile(filePath) As Byte() Dim buff() As Byte Dim fileNumb As Integer fileNumb = FreeFile Open filePath For Binary Access Read As fileNumb ReDim buff(0 To LOF(fileNumb) - 1) Get fileNumb, , buff Close fileNumb ReadByteArrFromFile = buff End Function Private Function BytesArrToComStream(ByRef buff() As Byte) As IUnknown Dim comStream As IUnknown If CreateStreamOnHGlobal(VarPtr(buff(LBound(buff))), 0, comStream) Then Err.Raise vbError, "", "Failed to create stream from byte array" End If Set BytesArrToComStream = comStream End Function
- Download geometry file and place in the same folder as macro
- Create new part file or open existing one
- Run the macro. 3D watermark is displayed. This is a copy of the model downloaded from GrabCad
- Stop the macro or close the model to remove the watermark
How It Works
This macro is utilizing the temp bodies functionality which allows to use low level geometry without SOLIDWORKS features.
Bodies can be serialized into the COM Stream via IBody2::Save method. Stream can then be saved into an external binary file as shown in Save Body To File example or can be used as a part of the structured storage.