Search code examples
c#vbaadd-insolidworks

Solidworks C# Addin - Sending a string to a macro


I'm currently working on a new Solidworks task-pane, mostly implementing some "old" macros I've written in a more convenient format. A few of these require user input via text boxes which I would like to include in the task-pane.

The problem is, I cannot find a way of writing a scratch file or to import these strings into my macros (which I'd rather not take time to rewrite)

Is there any other way to send these strings to my macros? Addin is in C#, and I'm currently using the Solidworks "RunMacro2" method.

Thanks!

EDIT: Adding some code snippets below. The main macro in question, is meant to propagate custom property files across an entire assembly.

namespace Efficiency_Interface
{
    [ComVisible(true)]
    [ProgId(ProjMan_Tab_PROGID)]
    public partial class Project_Management_Tab : UserControl
    {

        SwAddin SolidRun = new SwAddin();
        public const string ProjMan_Tab_PROGID = "Proj Management";
        public const string scratchFile = "C:\\keyStoneAddinScratch.txt";
        StreamWriter writeText = new StreamWriter(scratchFile);

        public Project_Management_Tab()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            foreach (var textBox in this.Controls.OfType<TextBox>())
            {
                writeText.WriteLine(textBox.Text);
            }
            writeText.Close();
            SolidRun.runGen("proc");
        }
    }
}

The above is the base code for my task pane. Below is the code snippet from my main addin class, it also contains the code for one of my other buttons.

public void runCreate4Pack()
{
    iSwApp.RunMacro2(macroPath + "CREATE 4 SIZE PACKAGE.swp", "", "", 0, out runMacroError);
    return;
}

public void runGen(string procName)
{
    iSwApp.RunMacro2(macroPath + "Efficiency Interface.swp", "hitButton", procName, 0, out runMacroError);
    File.Delete("C:\\Users\\Public\\keyStoneAddinScratch.txt");
    return;
}

Finally, is the main code from the macro I am trying to interface with.

Private Sub fillProps_Click()
    Dim doneParts() As Variant
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set part = swApp.ActiveDoc

    If firstAssem = "" Then
        referenceList (0)
    End If

    i = 0
    ReDim Preserve doneParts(1)
    Set custPropMgr = part.Extension.CustomPropertyManager(part.GetActiveConfiguration.name)
    setProps "", "", ""

    While i <= 1000 And Not assemComps(i, j) = ""
        parentAssemNum = Left(assemComps(i, 0), InStrRev(assemComps(i, 0), ".") - 1)
        parentAssemDesc = assemComps(i, 1)
        j = 2
        While j <= 10000 And Not assemComps(i, j) = ""
            k = 0
            While k < UBound(doneParts())
                If doneParts(k) = assemComps(i, j) Then
                    GoTo skipEntry
                End If
                k = k + 1
            Wend
            Set part = swApp.ActivateDoc3(assemComps(i, j), True, 1, 1)
            If part.GetType = 1 Then
                Set swpartdoc = part
            End If

            If InStr(part.IGetActiveConfiguration.name, "Default") > 0 Then
                Set custPropMgr = part.Extension.CustomPropertyManager("")
            End If
            Debug.Print custPropMgr.Get("Description")
            setProps parentAssemNum + "", parentAssemDesc + "", ""

            ReDim Preserve doneParts(UBound(doneParts) + 1)
            doneParts(UBound(doneParts)) = assemComps(i, j)
            If i > 0 Or j > 0 Then
                swApp.QuitDoc (assemComps(i, j))
            End If
skipEntry:
            j = j + 1
        Wend
        i = i + 1
    Wend   
End Sub

Sub setProps(parentAssemNum As String, parentAssemDesc As String, stockSize  As String)
    If custPropMgr.Get("StockSize") = "" Then
        If part.GetType = swDocPART Then
            If swpartdoc.IsWeldment = False Then
                Dim sizeArray(2)
                vboundbox = swpartdoc.GetPartBox(False)
                size1 = Round(Abs(vboundbox(0) - vboundbox(3)), 2)
                size2 = Round(Abs(vboundbox(1) - vboundbox(4)), 2)
                size3 = Round(Abs(vboundbox(2) - vboundbox(5)), 2)
                sizeArray(0) = size1
                sizeArray(1) = size2
                sizeArray(2) = size3
                rectVol = size1 * size2 * size3
                Set swmass = part.Extension.CreateMassProperty
                swmass.UseSystemUnits = False
                swVol = swmass.Volume
                QuickSort sizeArray, LBound(sizeArray), UBound(sizeArray)
                eq = 0
                If size1 = size2 Then
                    eq = 1
                    cylVol = 3.14159 * ((size1 / 2) * (size1 / 2)) * size3
                End If
                If size1 = size3 Then
                    eq = 1
                    cylVol = 3.14159 * ((size1 / 2) * (size1 / 2)) * size2
                End If
                If size3 = size2 Then
                    eq = 1
                    cylVol = 3.14159 * ((size2 / 2) * (size2 / 2)) * size1
                End If
                If eq = 1 Then
                    If Abs(swVol - cylVol) < Abs(swVol - rectVol) Then
                        boolstatus = custPropMgr.Set("StockSize", "ROUND BAR, " & size2 & " OD X " & size3 & "LG")
                    End If
                    If Abs(swVol - rectVol) < Abs(swVol - cylVol) Then
                        'If size3 > size2 Then
                            boolstatus = custPropMgr.Set("StockSize", size2 & " SQ X " & size3 & "LG")
                        'End If
                        'If size3 < size2 Then
                        '    boolstatus = custPropMgr.Set("StockSize", "PLATE," & size2 & " SQ X " & size3 & "LG")
                        'End If
                    End If
                    If Abs(swVol - cylVol) = Abs(swVol - rectVol) Then
                        'If size3 > size2 Then
                            boolstatus = custPropMgr.Set("StockSize", "BAR, " & size2 & " X " & size3 & "LG")
                        'End If
                        'If size3 < size2 Then
                        '    boolstatus = custPropMgr.Set("StockSize", "PLATE," & size2 & " SQ X " & size3 & "LG")
                        'End If
                    End If
                End If
                If eq = 0 Then
                    boolstatus = custPropMgr.Set("StockSize", sizeArray(2) & " X " & sizeArray(1) & " X " & sizeArray(0))
                End If
            End If
        End If
    End If
    If Len(custPropMgr.Get("DATE")) = 0 Then
        boolstatus = custPropMgr.Set("Date", Left(Now, InStrRev(Now, "/") + 4))
    End If

    boolstatus = custPropMgr.Set("Workorder", Interface.workorder.Text)
    boolstatus = custPropMgr.Set("Plant", Interface.plantBox.Text)
    boolstatus = custPropMgr.Set("AssemblyNumber", parentAssemNum)
    boolstatus = custPropMgr.Set("Line2", parentAssemDesc)
    boolstatus = custPropMgr.Set("Line3", Interface.projBox.Text)

    If Len(custPropMgr.Get("Finish")) = 0 Then
        'boolstatus = custPropMgr.Set("Finish", Interface.finish.Text)
    End If
    If Len(custPropMgr.Get("DesignBy")) = 0 Then
        'boolstatus = custPropMgr.Set("DesignBy", Interface.creator.Text)
    End If
    If Len(custPropMgr.Get("DrawnBy")) = 0 Then
        'boolstatus = custPropMgr.Set("DrawnBy", Interface.creator.Text)
    End If
End Sub

I do hope this helps, and isn't too confusing.


Solution

  • Solidworks supports 2 types of VB macro files

    • swp - newer version
    • swb - older plain text macro, here's an example of the empty swb macro :

      Dim swApp As Object  
      Dim swModel  As SldWorks.ModelDoc2  
        Sub main()  
          Set swApp = Application.SldWorks 
          Set swModel = swApp.ActiveDoc  
        End Sub  
      

    If you have access to the source code of your macros you can convert them to plain text and leave in placeholders.

    MsgBox "--MyParameter1--"
    

    After user fills in parameters on your taskpane replace placeholders in the swb macro with actual values and run it.