SOLIDWORKS PDM Professional API Help

Change Card Variables Add-in Example (C#)

This example shows how to create an add-in that pops up a message box when a file is approved.

//--------------------------------------------------------------------------------------
// Preconditions:
// 1. Start Microsoft Visual Studio.
// 2. Click File > New > Project > Visual C# > Class Library (.NET Framework).
// 3. Select .NET Framework 4.5 or later in the dropdown.
// 4. Type CardVariables_CSharp in Name.
// 5. Click Browse and navigate to the folder where to create the project.
// 6. Click OK
// 7. Right-click the project name in the Solution Explorer and click Add Reference
// 8. In the Add Reference dialog:   
//    a. Add the SOLIDWORKS PDM Professional interop assembly as a reference (click Browse in the
//       left-side panel, click EPDM.Interop.epdm.dll
//       and click OK).
//    b. Add Microsoft.VisualBasic and System.Windows.Forms as a references (click Assemblies > Framework in the
//       left-side panel, click System.Windows.Forms and Microsoft.VisualBasic, and click OK).

//    c. Click Close.
// 9. Right-click the project name in the Solution Explorer and click Properties.
//10. In the Properties window:
//    a. On the Application tab, click Assembly Information.
//    b. De-select Make assembly COM-Visible.
//    c. On the Build tab, select Any CPU, de-select Prefer 32-bit, and select Register for COM interop.
//11. Save the project.

//12. Copy the code below to Class1.cs.
//13.
To populate the GUID attribute, click Tools > Create GUID in the IDE,
//    select GUID Format 5, click Copy, and click Exit. Populate [
Guid(""),...] with
//    the copied string.

//14. Click Build > Build Solution.
//
// Postconditions: 
// 1. Open the SOLIDWORKS PDM Professional Administration tool, expand a vault_name node, 
//    and log in as Admin.
// 2. Under vault_name, right-click Add-ins, and click New Add-in.
//    a. Navigate to the bin\Debug directory of your built project.
//    b. Click EPDM.Interop.epdm.dll and CardVariables.dll.
//    c. Click Open.
//    d. Click OK.
// 3. Click OK after reading the SOLIDWORKS PDM Professional warning dialog.
// 4. In the taskbar, click the Administration tool blueberry and click Log off > vault_name.

// 5. Open File Explorer on a view of vault_name to:
//    a. Log in as Admin.

//    b. Create, check in, and check out a file whose data card contains Project Name 
//       and Project Number.

//    c. Click the Data Card tab.
//    d. In Project Name, type MercuryVenusEarthMarsJupiter, or Saturn.
//    e. Observe the change in Project Number.
//    f. In Project Number, type a number between 1000 and 1005.

//    g. Observe the change in Project Name.
//---------------------------------------------------------------------------------------
 

using Microsoft.VisualBasic
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using EPDM.Interop.epdm;
using System.Runtime.InteropServices;

[Guid(""), ComVisible(true)] 
public class CardVariables : IEdmAddIn5
{
 
    public void GetAddInInfo(ref EdmAddInInfo poInfo, IEdmVault5 poVault, IEdmCmdMgr5 poCmdMgr)
    {
        try
        {
            poInfo.mbsAddInName = "C# Card Variable Add-In";
            poInfo.mbsCompany = "Dassault Systemes";
            poInfo.mbsDescription = "Example demonstrating updating a card variable based on another card variable";
            poInfo.mlAddInVersion = 1;
            //Minimum SOLIDWORKS PDM Professional version
            //needed for C# Add-Ins is 6.4
            poInfo.mlRequiredVersionMajor = 6;
            poInfo.mlRequiredVersionMinor = 4;
 
            //Register to receive a notification when
            //a data card variable value changes
            poCmdMgr.AddHook(EdmCmdType.EdmCmd_CardInput);
 
            IEdmDictionary5 ProjectDictionary = default(IEdmDictionary5);
            ProjectDictionary = poVault.GetDictionary("Projects"true);
 
            bool SuccessSet = false;
            SuccessSet = ProjectDictionary.StringTestAndSetAt("1000""Mercury");
            SuccessSet = ProjectDictionary.StringTestAndSetAt("1001""Venus");
            SuccessSet = ProjectDictionary.StringTestAndSetAt("1002""Earth");
            SuccessSet = ProjectDictionary.StringTestAndSetAt("1003""Mars");
            SuccessSet = ProjectDictionary.StringTestAndSetAt("1004""Jupiter");
            SuccessSet = ProjectDictionary.StringTestAndSetAt("1005""Saturn");
 
        }
        catch (System.Runtime.InteropServices.COMException ex)
        {
            MessageBox.Show("HRESULT = 0x" + ex.ErrorCode.ToString("X") + "\r\n" + ex.Message);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }


    readonly Microsoft.VisualBasic.CompilerServices.StaticLocalInitFlag static_OnCmd_VariableChangeInProgress_Init = new Microsoft.VisualBasic.CompilerServices.StaticLocalInitFlag();
 
 
    //A data card variable value has changed
    bool static_OnCmd_VariableChangeInProgress;
    public void OnCmd(ref EdmCmd poCmd, ref EdmCmdData[] ppoData)
    {
        try
        {
            switch (poCmd.meCmdType)
            {
                case EdmCmdType.EdmCmd_CardInput:

                    lock (static_OnCmd_VariableChangeInProgress_Init)
                    {
                        try
                        {
                            if (InitStaticVariableHelper(static_OnCmd_VariableChangeInProgress_Init))
                            {
                                static_OnCmd_VariableChangeInProgress = false;
                            }
                        }
                        finally
                        {
                            static_OnCmd_VariableChangeInProgress_Init.State = 1;
                        }
                    }
 
                    IEdmEnumeratorVariable5 vars = (IEdmEnumeratorVariable5)poCmd.mpoExtra;
                    IEdmStrLst5 ConfigNames = (IEdmStrLst5)((EdmCmdData)ppoData.GetValue(0)).mpoExtra;
                    string Config = null;
                    if (IsConfigInList(ConfigNames, "@"))
                    {
                        Config = "@";
                    }
                    else
                    {
                        Config = "";
                    }
 
                    //Take appropriate action based on the data card variable that has changed
                    switch (poCmd.mbsComment)
                    {
 
                        //The Project Name variable has changed
                        case "Project Name":
                            if (static_OnCmd_VariableChangeInProgress == true)
                            {
                                static_OnCmd_VariableChangeInProgress = false;
                                break
                            }
                            object ProjectName = "";
                            vars.GetVar("Project Name", Config, out ProjectName);
 
                            //Get the old Project Number
                            object ProjectNumber = "";
                            vars.GetVar("Project number", Config, out ProjectNumber);
 
                            //Get the existing Projects dictionary
                            IEdmDictionary5 ProjectDictionary = default(IEdmDictionary5);
                            ProjectDictionary = ((IEdmVault5)(poCmd.mpoVault)).GetDictionary("Projects"false);
 
                            //Look up the new project number
                            string NewProjectNumber = "";
                            //Find all values containing the substring
                            //stored in ProjectName 
                            string key = "";
                            string value = "";
                            IEdmPos5 pos = default(IEdmPos5);
                            pos = ProjectDictionary.StringFindValues((string)ProjectName);
                            while (!pos.IsNull)
                            {
                                ProjectDictionary.StringGetNextAssoc(pos, out key, out value);
                                //Traverse the values until a match
                                //is found
                                if (value == (string)ProjectName)
                                {
                                    NewProjectNumber = key;
                                    break;
                                }
                            }
 
                            //Only update the variable if it changed
                            if (!(NewProjectNumber == (string)ProjectNumber))
                            {
                                static_OnCmd_VariableChangeInProgress = true;
                                vars.SetVar("Project number", Config, NewProjectNumber);
 
                            }
                            break;
 
                        //The Project Number variable has changed
                        case "Project number":
                            if (static_OnCmd_VariableChangeInProgress == true)
                            {
                                static_OnCmd_VariableChangeInProgress = false;
                                break
                            }
 
 
                            ProjectNumber = "";
                            vars.GetVar("Project number", Config, out ProjectNumber);
 
                            //Get the old Project Name
                            ProjectName = "";
                            vars.GetVar("Project Name", Config, out ProjectName);
 
                            //Get the existing Projects dictionary
                            ProjectDictionary = ((IEdmVault5)(poCmd.mpoVault)).GetDictionary("Projects"false);
 
                            //Look up the project name
                            string NewProjectName = "";
                            ProjectDictionary.StringGetAt((string)ProjectNumber, out NewProjectName);
 
 
                            //Only update the variable if it's changed
                            if (!(NewProjectName == ((string)ProjectName)))
                            {
                                static_OnCmd_VariableChangeInProgress = true;
                                vars.SetVar("Project Name", Config, NewProjectName);
                            }
                            break;
                    }
                    break;
            }
        }
        catch (System.Runtime.InteropServices.COMException ex)
        {
            MessageBox.Show("HRESULT = 0x" + ex.ErrorCode.ToString("X") + "\r\n" + ex.Message);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
 
    private bool IsConfigInList(IEdmStrLst5 ConfigNames, string ConfigName)
    {
        bool functionReturnValue = false;
        functionReturnValue = false;
        try
        {
            string CurConfig = null;
            IEdmPos5 Pos = ConfigNames.GetHeadPosition();
            while (!Pos.IsNull)
            {
                CurConfig = ConfigNames.GetNext(Pos);
                if (CurConfig == ConfigName)
                {
                    functionReturnValue = true;
                    break
                }
            }
            return functionReturnValue;
        }
        catch (System.Runtime.InteropServices.COMException ex)
        {
            MessageBox.Show("HRESULT = 0x" + ex.ErrorCode.ToString("X") + "\r\n" + ex.Message);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        return functionReturnValue;
    }


    static bool InitStaticVariableHelper(Microsoft.VisualBasic.CompilerServices.StaticLocalInitFlag flag)
    {
        if (flag.State == 0)
        {
            flag.State = 2;
            return true;
        }
        else if (flag.State == 2)
        {
            throw new Microsoft.VisualBasic.CompilerServices.IncompleteInitialization();
        }
        else
        {
            return false;
        }
    }
 
}

Back to top