SOLIDWORKS Macro to display callouts with diameters for edges
This macro will display the callouts with the diameter values of all selected circular edges in the 3D model using ISelectionMgr::CreateCallout2 SOLIDWORKS API method.
This can be useful while inspecting the model and it is required to see multiple diameters at the same time.
The callout is a visual element in SOLIDWORKS which displays data organized in key-value pairs (single or multiple rows). The callout elements are used in some standard SOLIDWORKS tools such as Measure tool. Usually callouts are attached to the selection and destroyed once the object is deselected.
To run the macro:
- Select circular edges and run the macro
- Callouts with the diameter value in the model's units are displayed for all circular edges
- Clear the selection to remove the callouts
Create new macro and copy the following code into the macro's module:
Dim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim swSelMgr As SldWorks.SelectionMgr Sub main() Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc If Not swModel Is Nothing Then Set swSelMgr = swModel.SelectionManager Dim swCalloutHandler As New HoleDiamCalloutHandler Dim i As Integer Dim swCalloutsCollection As New Collection For i = 1 To swSelMgr.GetSelectedObjectCount2(-1) If swSelMgr.GetSelectedObjectType3(i, -1) = swSelectType_e.swSelEDGES Then Dim swEdge As SldWorks.Edge Set swEdge = swSelMgr.GetSelectedObject6(i, -1) Dim swCurve As SldWorks.Curve Set swCurve = swEdge.GetCurve If swCurve.IsCircle() Then Dim vParams As Variant vParams = swCurve.CircleParams Dim diam As Double diam = vParams(6) * 2 Dim swUserUnit As SldWorks.UserUnit Set swUserUnit = swModel.GetUserUnit(swUserUnitsType_e.swLengthUnit) Dim diamVal As String diamVal = swUserUnit.ConvertToUserUnit(diam, False, False) Dim swCallout As SldWorks.Callout Set swCallout = swSelMgr.CreateCallout2(1, swCalloutHandler) swCallout.Label2(0) = "Diameter" swCallout.Value(0) = diamVal swSelMgr.SetCallout i, swCallout swCalloutsCollection.Add swCallout End If End If Next While swSelMgr.GetSelectedObjectCount2(-1) > 0 DoEvents Wend Else MsgBox "Please open the model" End If End Sub
Create new class module and name it HoleDiamCalloutHandler.
Copy the following code in there:
Implements swCalloutHandler Private Function swCalloutHandler_OnStringValueChanged(ByVal pManipulator As Object, ByVal RowID As Long, ByVal Text As String) As Boolean End Function