Solidworks Macro - Fix Unit Issue From VBA Macro

In this post, I tell you about how to Fix Unit Issue in Solidworks API from VBA Macros in a Sketch.


Content

Feel free to select the topic you want to.


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 and AngleConversionFactor, 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.

correct-unit-values

' 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.

  1. 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.

  1. 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.

  1. 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.

  1. 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.

  1. 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!!!