Hello, I'm trying to set the mass units/decimal places of the selected parts inside an assembly but when I run it throws an error "Run time error '438' Object doesn't support this property or method". GetSelectedObjectsComponent4 doesn't output a Component? Therefore I defined SetUnits(swComp As Component2)
Can somebody help me fix this, and if possible explain me why it wasn't working?
Thanks in advance!
SolidworksApi/macros' Mass_Section_Properties (Mass) ---------------------------------------------21/08/2016
' ****************************************************************************************
' Macro will change the Mass units for Mass/Section Properties from all others to Grams;
' You can use TASK and run this macro on all parts or ass at once, they go on 1 decimals;
' You can change the units and decimals by your self according to the parameters table;
' Written by: Deepak Gupta ( http://gupta9665.wordpress.com/ )
' Modified by: Jeff Lee ( Specially thanks to Deepak Gupta )
' ****************************************************************************************
Option Explicit
'On Error Resume Next
Dim swApp As Object
Dim Part As Object
Dim boolstatus As Boolean
Dim longstatus As Long, longwarnings As Long
Sub main()
Dim i As Integer
Set swApp = Application.SldWorks
Set Part = swApp.ActiveDoc
Dim selMgr As SelectionMgr
Dim swSelComp As SldWorks.Component2
Dim swSelModel As SldWorks.ModelDoc2
If Part.GetType = swconst.swDocASSEMBLY Then
Set selMgr = Part.SelectionManager
If selMgr.GetSelectedObjectCount2(-1) = 0 Then
MsgBox "No selected component"
Exit Sub
End If
If selMgr.GetSelectedObjectType3(1, -1) <> swSelCOMPONENTS Then
MsgBox "No selected component"
Exit Sub
End If
For i = 1 To selMgr.GetSelectedObjectCount2(-1)
Set swSelComp = selMgr.GetSelectedObject6(i, -1) 'obtem a part segundo o index da seleção (index = numero inteiro, se selecionar 3parts o index vai de 1 a 3)
'Set swModelPart = myComp.ModelDoc2
If swSelComp Is Nothing Then
Set swSelComp = swSelComp.GetComponent
Else
Debug.Print "whatelse"
Set swSelComp = selMgr.GetSelectedObjectsComponent4(i, -1)
End If
SetUnits (swSelComp)
'MsgBox myComp.GetPathName
Next
Else
SetUnits (Part)
End If
End Sub
Function SetUnits(swComp As Component2)
' Set the Unit system from (MKS, CGS, MMGS, IPS) to Custom
boolstatus = swComp.Extension.SetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swUnitSystem, 0, swUnitSystem_Custom)
' Get and Check the Mass_Section_Properties - Mass - Unit, if it is not Grams
' Mass units Member Description(Value)
' swUnitsMassPropMass_Grams 2
' swUnitsMassPropMass_Kilograms 3
' swUnitsMassPropMass_Milligrams 1
' swUnitsMassPropMass_Pounds 4
Debug.Print "try"
If (swComp.Extension.GetUserPreferenceInteger(swUnitsMassPropMass, 0) <> 3) Then
' Change to Grams
boolstatus = swComp.Extension.SetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swUnitsMassPropMass, 0, 3) '
'Else // Please ignore this code, it is the original code from Deepak Gupta
' Else keep or set to Grams // Please ignore this code, it is the original code from Deepak Gupta
' You can choose the decimal place format:
' boolstatus = Part.Extension.SetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swUnitsMassPropMass, 0, 2)
' Iza zareza zaoruzuje na stotu decimalu ( Behind the point set the hundredth decimal place,
' Integer value could be set to (0, 1, 2, 3, 4, 5, 6, 7, 8 )
boolstatus = swComp.Extension.SetUserPreferenceInteger(swUserPreferenceIntegerValue_e.swUnitsMassPropDecimalPlaces, swUserPreferenceOption_e.swDetailingNoOptionSpecified, 1)
End If
End Function