0 Replies Latest reply on May 6, 2016 12:35 PM by Simon Rafferty

    Kinematics Macro - can I drive the model?

    Simon Rafferty

      I have been looking at the possibility of using Solidworks to generate positions for actuators by dragging a model (multi axis robot)  to a required position, let SW calculate the lengths of the actuators then save them as a line in a CSV file.


      In order to avoid having to configure the macro for each model, I did this by using Distance & Angle limit mates and renaming the ones I'm interested in as Axis1, Axis2 etc.  The macro can parse the mates folder to find any called Axis# then build a CSV based on that.  That bit seems to work OK.


      The bit that has floored me is reading back the CSV and forcing the model to move correspondingly.  If I change the mate type to ordinary distance mates - I can write a value to the distance and the model moves when I force an update.  However, like that, you cannot move the model by dragging - Hence using limit mates.


      I can write a value to the distance, read it back and it appears to have changed.  However when I rebuild the model - the value changes back to what it was set to before and the model does not move!


      Dim swApp As SldWorks.SldWorks

      Dim swModel As SldWorks.ModelDoc2

      Dim swFeat As SldWorks.Feature

      Dim swMate As SldWorks.Mate2


      Sub main()

          Set swApp = Application.SldWorks

          Set swModel = swApp.ActiveDoc

          If swModel Is Nothing Then


          End If


          Set swFeat = swModel.FeatureByName("Axis1")


          If swFeat Is Nothing Then


          End If


          Set swMate = swFeat.GetSpecificFeature2


          Dim swDispDim As SldWorks.DisplayDimension

          Dim swDim As SldWorks.Dimension


          Set swDispDim = swMate.DisplayDimension2(0)


          Set swDim = swDispDim.GetDimension2(0)


          Dim val As Double


          val = swDim.GetSystemValue3(swInConfigurationOpts_e.swThisConfiguration, "")(0)

          Debug.Print "Original Distance = " & val

          val = val + 0.005 'Add 5mm to distance

          swDim.SetSystemValue3 val, swInConfigurationOpts_e.swAllConfiguration, ""

          Debug.Print "New Distance value = " & swDim.GetSystemValue3(swInConfigurationOpts_e.swThisConfiguration, "")(0)



          swModel.ForceRebuild3 True

          Debug.Print "New Distance value after rebuild = " & swDim.GetSystemValue3(swInConfigurationOpts_e.swThisConfiguration, "")(0)


      End Sub



      Which outputs the following:

      Original Distance = 3.64127446215382E-02

      New Distance value = 4.14127446215382E-02

      New Distance value after rebuild = 3.64127446215564E-02


      Is there some 'issue' with the API implementation of Distance Limit Mates?  I've only tried it in 2015 - but we're sticking with 2015 for the time being so it has to work in that!


      Thanks in advance,