Description
A one-line function call to programmatically insert a block into SolidWorks drawing allows you to quickly place a block in the active document. This macro returns the SketchBlockInstance for the inserted block, enabling users to efficiently place and manage sketch blocks within a drawing. It is particularly useful for automating the placement of standardized blocks, reducing repetitive tasks.
System Requirements
- SolidWorks Version: SolidWorks 2014 or newer
- Operating System: Windows 7 or later
Pre-Conditions
- The active document must be a drawing file.
- The block file to be inserted must exist in the specified path.
Results
- The block will be inserted at the specified X and Y coordinates.
- The macro returns a
SketchBlockInstanceobject for the inserted block.
VBA Macro Code
Visual Basic
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
' Disclaimer: ' The code provided should be used at your own risk. ' Blue Byte Systems Inc. assumes no responsibility for any issues or damages that may arise from using or modifying this code. ' For more information, visit [Blue Byte Systems Inc.](https://bluebyte.biz). Option Explicit Dim swApp As SldWorks.SldWorks ' Main subroutine to insert a block and print block attributes Sub main() Dim part As ModelDoc2 Dim swBlkInst As SketchBlockInstance Dim boolstatus As Boolean ' Initialize SolidWorks application Set swApp = Application.SldWorks Set part = swApp.ActiveDoc ' Insert the block at specified location with optional scale and rotation Set swBlkInst = Insert_Block(part, "C:\temp\myblock.SLDBLK", 0.254, 0.254) ' Display block attributes in the Immediate window Debug.Print "Number of attributes: " & swBlkInst.GetAttributeCount Debug.Print "Scale: " & swBlkInst.Scale Debug.Print "Name: " & swBlkInst.Name ' Set an attribute value for the inserted block boolstatus = swBlkInst.SetAttributeValue("ItemNo", "Value") End Sub ' Function to insert a block into the active document Function Insert_Block(ByVal rModel As ModelDoc2, ByVal blkName As String, ByVal Xpt As Double, ByVal Ypt As Double, _ Optional ByVal sAngle As Double = 0, Optional ByVal sScale As Double = 1) As Object Dim swBlockDef As SketchBlockDefinition Dim swBlockInst As SketchBlockInstance Dim swMathPoint As MathPoint Dim vBlockInst As Variant Dim swMathUtil As MathUtility Set swMathUtil = swApp.GetMathUtility ' Prepare coordinates for block insertion Dim pt(2) As Double pt(0) = Xpt pt(1) = Ypt pt(2) = 0 ' Turn off grid and entity snapping to facilitate block insertion rModel.SetAddToDB True ' Check if the block definition already exists in the drawing Set swBlockDef = GetBlockDefination(Mid(blkName, InStrRev(blkName, "\") + 1), rModel) Set swMathPoint = swMathUtil.CreatePoint(pt) ' Insert the block if definition is found, otherwise create a new one If Not swBlockDef Is Nothing Then Set swBlockInst = rModel.SketchManager.InsertSketchBlockInstance(swBlockDef, swMathPoint, sScale, sAngle) Else Set swBlockDef = rModel.SketchManager.MakeSketchBlockFromFile(swMathPoint, blkName, False, sScale, sAngle) vBlockInst = swBlockDef.GetInstances Set swBlockInst = vBlockInst(0) End If ' Restore grid and entity snapping rModel.SetAddToDB False ' Redraw graphics to reflect the changes rModel.GraphicsRedraw2 Set Insert_Block = swBlockInst End Function ' Function to get the block definition if it already exists in the drawing Function GetBlockDefination(ByVal blkName As String, ByVal rModel As ModelDoc2) As Object Dim swBlockDef As Object Dim vBlockDef As Variant Dim i As Integer ' Check if there are existing block definitions in the drawing If rModel.SketchManager.GetSketchBlockDefinitionCount > 0 Then vBlockDef = rModel.SketchManager.GetSketchBlockDefinitions If UBound(vBlockDef) >= 0 Then ' Loop through existing definitions to find the matching one For i = 0 To UBound(vBlockDef) Set swBlockDef = vBlockDef(i) If UCase(Mid(swBlockDef.FileName, InStrRev(swBlockDef.FileName, "\") + 1)) = UCase(blkName) Then Set GetBlockDefination = swBlockDef Exit Function End If Next i End If End If ' Return nothing if no matching block definition is found Set GetBlockDefination = Nothing End Function |
Macro
You can download the macro from here.
Customization
Need to modify the macro to meet specific requirements or integrate it with other processes? We provide custom macro development tailored to your needs. Contact us
