Solidworks Macro - Fix Unit Issue
In this post, I tell you about how to Fix Unit Issue in Solidworks API from VBA Macros in a Sketch.
What is the Issue?
Before going to solution let us see what is the issue we are trying to address.
In my all previous posts, you can see a NOTE (shown below) about Solidworks API.
NOTE
It is very important to remember that, when you give distance or any other numeric value in Solidworks API, Solidworks takes that numeric value in Meter only.
Please see below for detail:
-
Length: Meter
-
Angle: Radian
Solidworks API does not care about your application’s Unit systems.
For example, I works in ANSI system means inches for distance. But when I used Solidworks API through VBA macros or C#, I need to converted numeric values.
Because Solidworks API output the distance in Meter which is not my requirement.
So in this post we address this issue and use this solution in future posts.
For this we take following steps:
-
Get Unit currently in use in Solidworks.
-
Apply Select Case on the length of active unit.
-
We define values of factors i.e.
LengthConversionFactor
andAngleConversionFactor
, these values depends upon the selected Length unit. -
After assigning the values, we use them when we need to define any length or angle value.
Code Sample
In below sample VBA macro program, we fix the issue.
Option Explicit
' Create variable for Solidworks application
Dim swApp As SldWorks.SldWorks
' Create variable for Solidworks document
Dim swDoc As SldWorks.ModelDoc2
' Boolean Variable
Dim BoolStatus As Boolean
' Create variable for Solidworks Sketch Manager
Dim swSketchManager As SldWorks.SketchManager
' Create Variable for Solidworks Sketch Segment
Dim swSketchSegment As SldWorks.SketchSegment
' Main function of our VBA program
Sub main()
' Set Solidworks variable to Solidworks application
Set swApp = Application.SldWorks
' Create string type variable for storing default part location
Dim defaultTemplate As String
' Set value of this string type variable to "Default part template"
defaultTemplate = swApp.GetUserPreferenceStringValue(swUserPreferenceStringValue_e.swDefaultTemplatePart)
' Set Solidworks document to new part document
Set swDoc = swApp.NewDocument(defaultTemplate, 0, 0, 0)
'-----------------------BELOW IS THE SOLUTION----------------------------------------
' Local variables used as Conversion Factors
Dim LengthConversionFactor As Double
Dim AngleConversionFactor As Double
' Use a Select Case, to get the length of active Unit and set the different factors
Select Case swDoc.GetUnits(0) ' GetUnits function gives us, active unit
Case swMETER ' If length is in Meter
LengthConversionFactor = 1
AngleConversionFactor = 1
Case swMM ' If length is in MM
LengthConversionFactor = 1 / 1000
AngleConversionFactor = 1 * 0.01745329
Case swCM ' If length is in CM
LengthConversionFactor = 1 / 100
AngleConversionFactor = 1 * 0.01745329
Case swINCHES ' If length is in INCHES
LengthConversionFactor = 1 * 0.0254
AngleConversionFactor = 1 * 0.01745329
Case swFEET ' If length is in FEET
LengthConversionFactor = 1 * (0.0254 * 12)
AngleConversionFactor = 1 * 0.01745329
Case swFEETINCHES ' If length is in FEET & INCHES
LengthConversionFactor = 1 * 0.0254 ' For length we use sama as Inch
AngleConversionFactor = 1 * 0.01745329
Case swANGSTROM ' If length is in ANGSTROM
LengthConversionFactor = 1 / 10000000000#
AngleConversionFactor = 1 * 0.01745329
Case swNANOMETER ' If length is in NANOMETER
LengthConversionFactor = 1 / 1000000000
AngleConversionFactor = 1 * 0.01745329
Case swMICRON ' If length is in MICRON
LengthConversionFactor = 1 / 1000000
AngleConversionFactor = 1 * 0.01745329
End Select
'----------------------------------------------------------------
' Select Front Plane
BoolStatus = swDoc.Extension.SelectByID2("Front Plane", "PLANE", 0, 0, 0, False, 0, Nothing, swSelectOption_e.swSelectOptionDefault)
' Set Sketch manager for our sketch
Set swSketchManager = swDoc.SketchManager
' Insert a sketch into selected plane
swSketchManager.InsertSketch True
' Set Sketch Segment value and Create a Circle
Set swSketchSegment = swSketchManager.CreateCircleByRadius(0, 0, 0, 0.2 * LengthConversionFactor)
' De-select the Sketch Segment after Circular Sketch Pattern
swDoc.ClearSelection2 True
' Show Front View after Circular Sketch Pattern
swDoc.ShowNamedView2 "", swStandardViews_e.swFrontView
' Zoom to fit screen in Solidworks Window
swDoc.ViewZoomtofit2
End Sub
Understanding the Code
Now let us walk through each line in the above code, and understand the meaning and purpose of every line.
I also give some link so that you can go through them if there are anything I explained in previous posts.
Option Explicit
This line forces us to define every variable we are going to use.
For more information please visit Solidworks Macros - Open new Part document post.
' Create variable for Solidworks application
Dim swApp As SldWorks.SldWorks
In this line, we create a variable which we named as swApp
and the type of this swApp
variable is SldWorks.SldWorks
.
' Create variable for Solidworks document
Dim swDoc As SldWorks.ModelDoc2
In this line, we create a variable which we named as swDoc
and the type of this swDoc
variable is SldWorks.ModelDoc2
.
' Boolean Variable
Dim BoolStatus As Boolean
In this line, we create a variable named BoolStatus
as Boolean
object type.
' Create variable for Solidworks Sketch Manager
Dim swSketchManager As SldWorks.SketchManager
In above line, we create variable swSketchManager
for Solidworks
Sketch Manager.
As the name suggested, a Sketch Manager holds variours methods and properties to manage Sketches.
To see methods and properties related to SketchManager
object, please visit
this
page
' Create variable for Solidworks Sketch Segment
Dim swSketchSegment As SldWorks.SketchSegment
In this line, we Create a variable which we named as swSketchSegment
and the type of this swSketchSegment
variable is SldWorks.SketchSegment
.
We create variable swSketchSegment
for
Solidworks Sketch Segments.
To see methods and properties related to swSketchSegment
object, please visit
this
page
These all are our global variables.
As you can see in code sample, they are Solidworks API Objects.
So basically I group all the Solidworks API Objects in one place.
I have also place boolean
type object
at top also, because after certain point we will need this variable frequently.
Thus, I have started placing it here.
Next is our Sub
procedure which has
name of main
.
This procedure hold all the statements (instructions) we give to computer.
' Set Solidworks variable to Solidworks application
Set swApp = Application.SldWorks
In this line, we set the value of our Solidworks variable swApp
; which we define earlier; to
Solidworks application.
' Create string type variable for storing default part location
Dim defaultTemplate As String
' Set value of this string type variable to "Default part template"
defaultTemplate = swApp.GetUserPreferenceStringValue(swUserPreferenceStringValue_e.swDefaultTemplatePart)
In 1st statement of above example, we are defining a variable of string
type and named it as defaultTemplate
.
This variable defaultTemplate
, hold the
location the location of Default Part Template.
In 2nd line of above example. we assign value to our newly define defaultTemplate
variable.
We assign the value by using a Method named GetUserPreferenceStringValue()
.
This GetUserPreferenceStringValue()
method is a part of our main Solidworks variable swApp
.
' Set Solidworks document to new part document
Set swDoc = swApp.NewDocument(defaultTemplate, 0, 0, 0)
In this line, we set the value of our swDoc
variable to new document.
For detailed information about these lines please visit Solidworks Macros - Open new Part document post.
I have discussed them thoroghly in Solidworks Macros - Open new Part document post, so do checkout that post if you want to understand above code in more detail.
' Local variables used as Conversion Factors
Dim LengthConversionFactor As Double
Dim AngleConversionFactor As Double
In above line we define our local variable we use as Conversion Factors.
Since this VBA program is small, we declare them in our Sub
function.
If we have multiple functions, then we will create them with other Global variables.
' Use a Select Case, to get the length of active Unit and set the different factors
Select Case swDoc.GetUnits(0) ' GetUnits function gives us, active unit
Case swMETER ' If length is in Meter
LengthConversionFactor = 1
AngleConversionFactor = 1
Case swMM ' If length is in MM
LengthConversionFactor = 1 / 1000
AngleConversionFactor = 1 * 0.01745329
Case swCM ' If length is in CM
LengthConversionFactor = 1 / 100
AngleConversionFactor = 1 * 0.01745329
Case swINCHES ' If length is in INCHES
LengthConversionFactor = 1 * 0.0254
AngleConversionFactor = 1 * 0.01745329
Case swFEET ' If length is in FEET
LengthConversionFactor = 1 * (0.0254 * 12)
AngleConversionFactor = 1 * 0.01745329
Case swFEETINCHES ' If length is in FEET & INCHES
LengthConversionFactor = 1 * 0.0254 ' For length we use sama as Inch
AngleConversionFactor = 1 * 0.01745329
Case swANGSTROM ' If length is in ANGSTROM
LengthConversionFactor = 1 / 10000000000#
AngleConversionFactor = 1 * 0.01745329
Case swNANOMETER ' If length is in NANOMETER
LengthConversionFactor = 1 / 1000000000
AngleConversionFactor = 1 * 0.01745329
Case swMICRON ' If length is in MICRON
LengthConversionFactor = 1 / 1000000
AngleConversionFactor = 1 * 0.01745329
End Select
Above we use a Select Case
statement
and apply GetUnits(0)
method on swDoc
variable to get the active
unit of current document.
If you want to know more about
Select Case
statment then please visit If-Then and Select Case structure post.
Case swMETER ' If length is in Meter
LengthConversionFactor = 1
AngleConversionFactor = 1
As shown in above code, when the is swMETER
then we define the value of these
factors.
In this case, it is:
- LengthConversionFactor = 1
- AngleConversionFactor = 1
Since, I use IPS, I got the below case.
Case swINCHES ' If length is in INCHES
LengthConversionFactor = 1 * 0.0254
AngleConversionFactor = 1 * 0.01745329
In this case, it is:
-
LengthConversionFactor = 0.0254
I write the value in
(1 * 0.0254)
format to show a relation of values with “METER”. -
AngleConversionFactor = 0.01745329
I write the value in
(1 * 0.01745329)
format to show a relation of values with “RADIAN”.
Similar is for all other CASES.
' Select Front Plane
BoolStatus = swDoc.Extension.SelectByID2("Front Plane", "PLANE", 0, 0, 0, False, 0, Nothing, swSelectOption_e.swSelectOptionDefault)
In above line, we select the front plane by using SelectByID2
method from Extension
object.
For more information about selection method please visit Solidworks Macros - Selection Methods post.
' Set Sketch manager for our sketch
Set swSketchManager = swDoc.SketchManager
In above line, we set the Sketch manager variable to current document’s sketch manager.
' Insert a sketch into selected plane
swSketchManager.InsertSketch True
In above line, we use InsertSketch
method of SketchManager and give True
value.
This method allows us to insert a sketch in selected plane.
' Set Sketch Segment value and Create a Circle
Set swSketchSegment = swSketchManager.CreateCircleByRadius(0, 0, 0, 0.2 * LengthConversionFactor)
In above line, we set the value of Solidworks Sketch Segment variable swSketchSegment
by CreateCircleByRadius
method from
Solidworks Sketch Manager.
This CreateCircleByRadius
method
creates a Circle at given point with radius.
For more information about CreateCircleByRadius
method, you can read my
Solidworks Macro - Create Circle By
Radius From VBA Macro post.
That post describe all the parameters we need for this CreateCircleByRadius
method in details.
In above line, we create a Circle with:
-
Circle Centerpoint : At origin i.e. (0, 0, 0)
-
Circle Radius :
0.2 * LengthConversionFactor
As you can notice, I have multiple the LengthConversionFactor
in 0.2
.
This will make sure that I get a circle of 0.4 Inch diameter. not a converted diameter in Meter.
Image of created circle is shown below with diameter dimension.
' De-select the Sketch after creation
swDoc.ClearSelection2 True
In the above line of code, we deselect the Sketch after the Circular Sketch Pattern operation.
For de-selecting, we use ClearSelection2
method from our Solidworks
document name swDoc
.
' Show Front View after Circular Sketch Pattern
swDoc.ShowNamedView2 "", swStandardViews_e.swFrontView
In the above line of code, we update the view orientation to Front View.
In my machine, after inserting a sketch view orientation does not changed.
Because of this I have to update the view to Front view.
For showing Front View we used ShowNamedView2
method from our Solidworks
document name swDoc
.
This method takes 2 parameter described as follows:
-
VName : Name of the view to display or an empty string to use ViewId instead
-
ViewId : ID of the view to display as defined by
swStandardViews_e
or -1 to use the VName argument instead.
NOTE: If you specify both VName and ViewId, then ViewId takes precedence if the two arguments do not resolve to the same view.
swStandardViews_e
has following
Standard View Types:
-
swBackView
-
swBottomView
-
swDimetricView
-
swFrontView
-
swIsometricView
-
swLeftView
-
swRightView
-
swTopView
-
swExtendetricView
In our code, we did not use VName instead I used empty string in form of ”“ symbol.
I used ViewId value to specify view and used swStandardViews_e.swFrontView
value to use
Standard Front View.
' Zoom to fit screen in Solidworks Window
swDoc.ViewZoomtofit
In this last line we use zoom to fit command.
For Zoom to fit, we use ViewZoomtofit
method from our Solidworks document variable swDoc
.
This is it !!!
If you found anything to add or update, please let me know on my e-mail.
VBA Language feature used in this post
In this post used some features of VBA programming language.
This section of post, has some brief information about the VBA programming language specific features.
- We use Option Explicit for capturing un-declared variables.
If you want to read more about Option Explicit then please visit Declaring and Scoping of Variables.
- Then we create variable for different data types.
If you know in detail about the Variables, then please visit Variables and Data-types posts of this blog.
It will help you to understand what Variables are and how to use them.
- Then we create main Sub procedure for our macro.
If you know in detail about the Sub procedure, then I suggest you to visit VBA Sub and Function Procedures and Executing Sub and Function Procedures posts of this blog.
It will help you to understand what Procedures are and how to use them.
- In most part we create some variables and set their values. We set those values by using some functions provided from objects.
If you don’t know about the functions, then you should visit VBA Functions and VBA Functions that do more posts of this blog.
It will help you to understand what functions are and how to use them.
- We use Select Case for checking Length of active unit.
If you want to read more about Select Case then please visit If-Then and Select Case structure.
Solidworks API Objects
In this post of Circular Sketch Pattern, we use Solidworks API objects and their methods.
This section contains the list of all Solidworks Objects used in this post.
I have also attached links of these Solidworks API Objects in API Help website.
If you want to explore those objects, you can use these links.
These Solidworks API Objects are listed below:
-
Solidworks Application Object
If you want explore Properties and Methods/Functions of Solidworks Application Object object you can visit this link.
-
Solidworks Document Object
If you want explore Properties and Methods/Functions of Solidworks Document Object object you can visit this link.
-
Solidworks Sketch Manager Object
If you want explore Properties and Methods/Functions of Solidworks Sketch Manager Object you can visit this link.
-
Solidworks Sketch Segment Object
If you want explore Properties and Methods/Functions of Solidworks Sketch Segment Object you can visit this link.
This is it !!!
If you found anything to add or update, please let me know on my e-mail.
Hope this post helps you to Fix Unit Issue in Solidworks API from VBA Macros.
For more such tutorials on Solidworks VBA Macro, do come to this blog after sometime.
If you like the post then please share it with your friends also.
Do let me know by you like this post or not!
Till then, Happy learning!!!