SOLIDWORKS PDM Professional API Help

Task Add-in Sample (C#)

The following shows the entire source code of a task add-in written in C#. The add-in:

 

NOTE: To populate the GUID attribute below, click Tools > Create GUID in the IDE, select GUID Format 6, click Copy, and click Exit. Replace <Guid("")> with the copied string.

 

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using EPDM.Interop.epdm;
using System.Runtime.InteropServices;
using System.Windows.Forms;

[Guid(""), ComVisible(true)] 
    public class Class1 : IEdmAddIn5
    {
 
        SetupPage SetupPageObj;
        public void GetAddInInfo(ref EdmAddInInfo poInfo, IEdmVault5 poVault, IEdmCmdMgr5 poCmdMgr)
        {
 
            try
            {
                poInfo.mbsAddInName = "C# Workflow State Age Task Add-In";
                poInfo.mbsCompany = "Dassault Systemes";
                poInfo.mbsDescription = "Example demonstrates a task that finds files that have been in selected workflow states a selected number of days";
                poInfo.mlAddInVersion = 1;
                //Minimum SOLIDWORKS PDM Professional version
                //needed for Tasks is 10.0
                poInfo.mlRequiredVersionMajor = 10;
                poInfo.mlRequiredVersionMinor = 0;
 
                //Register to call OnCmd on task-related events
                poCmdMgr.AddHook(EdmCmdType.EdmCmd_TaskSetup);
                poCmdMgr.AddHook(EdmCmdType.EdmCmd_TaskSetupButton);
                poCmdMgr.AddHook(EdmCmdType.EdmCmd_TaskRun);
                poCmdMgr.AddHook(EdmCmdType.EdmCmd_TaskDetails);
            }
            catch (System.Runtime.InteropServices.COMException ex)
            {
                MessageBox.Show("HRESULT = 0x" + ex.ErrorCode.ToString("X") + ex.Message);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

private void OnTaskDetails(ref EdmCmd poCmd, ref EdmCmdData[] ppoData)
        {
            try
            {
                IEdmTaskInstance TaskInstance = (IEdmTaskInstance)poCmd.mpoExtra;
                if ((TaskInstance != null))
                {
                    SetupPageObj = new SetupPage((IEdmVault7)poCmd.mpoVault, TaskInstance);
                    //Force immediate creation of the control
                    //and its handle
                    SetupPageObj.CreateControl();
                    SetupPageObj.LoadData(poCmd);
                    SetupPageObj.DisableControls();
                    poCmd.mbsComment = "State Age Details";
                    poCmd.mlParentWnd = SetupPageObj.Handle.ToInt32();
                }
 
            }
            catch (System.Runtime.InteropServices.COMException ex)
            {
                MessageBox.Show("HRESULT = 0x" + ex.ErrorCode.ToString("X") + ex.Message);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }


private void OnTaskRun(ref EdmCmd poCmd, ref EdmCmdData[] ppoData)
        {
            try
            {
                IEdmTaskInstance TaskInstance = default(IEdmTaskInstance);
                TaskInstance = (IEdmTaskInstance)poCmd.mpoExtra;
                if ((TaskInstance != null))
                {
                    TaskInstance.SetStatus(EdmTaskStatus.EdmTaskStat_Running);
                    TaskInstance.SetProgressRange(100, 0, "Task is running.");
 
                    string NoDays = null;
                    NoDays = (string)TaskInstance.GetValEx("NoDaysVar");
 
                    string States = "";
                    States = (string)TaskInstance.GetValEx("SelectedStatesVar");
 
                    List<EdmSelItem2> Items = new List<EdmSelItem2>();
 
                    DoSearch((IEdmVault11)poCmd.mpoVault, States, NoDays, Items);
 
                    EdmSelItem2[] NotificationArray = new EdmSelItem2[Items.Count];
 
                    Items.CopyTo(NotificationArray);
 
                    string ProgresssMsg = null;
                    if ((Items.Count > 0))
                    {
                        ProgresssMsg = "Found " + Items.Count.ToString() + " files.";
                    }
                    else
                    {
                        ProgresssMsg = ("No files found.");
                    }
 
                    TaskInstance.SetProgressPos(100, ProgresssMsg);
                    TaskInstance.SetStatus(EdmTaskStatus.EdmTaskStat_DoneOK, 0, "", NotificationArray, ProgresssMsg);
                }
 
            }
            catch (System.Runtime.InteropServices.COMException ex)
            {
                MessageBox.Show("HRESULT = 0x" + ex.ErrorCode.ToString("X") + " " + ex.Message);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
'Store the custom set-up page here so it can be accessed from both OnTaskSetup and OnTaskSetupButton
SetupPage SetupPageObj;
private void OnTaskSetup(ref EdmCmd poCmd, ref EdmCmdData[] ppoData)
        {
            try
            {
                IEdmTaskProperties props = (IEdmTaskProperties)poCmd.mpoExtra;
                if ((props != null))
                {
                    //Set the task properties
                    props.TaskFlags = (int)EdmTaskFlag.EdmTask_SupportsScheduling + (int)EdmTaskFlag.EdmTask_SupportsDetails;
 
                    SetupPageObj = new SetupPage((IEdmVault7)poCmd.mpoVault, props);
                    //Force immediate creation of the control
                    //and its handle
                    SetupPageObj.CreateControl();
                    SetupPageObj.LoadData(poCmd);
 
                    EdmTaskSetupPage[] pages = new EdmTaskSetupPage[1];
                    //Page name that appears in the
                    //navigation pane of the Add Task dialog
                    //in the Administration tool
                    pages[0].mbsPageName = "Choose states to check";
                    pages[0].mlPageHwnd = SetupPageObj.Handle.ToInt32();
                    pages[0].mpoPageImpl = SetupPageObj;
 
                    props.SetSetupPages(pages);
 
                }
 
            }
            catch (System.Runtime.InteropServices.COMException ex)
            {
                MessageBox.Show("HRESULT = 0x" + ex.ErrorCode.ToString("X") + " " + ex.Message);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
'Called when the user clicks OK or Cancel in the
'task property dialog box
private void OnTaskSetupButton(ref EdmCmd poCmd, ref EdmCmdData[] ppoData)
        {
            try
            {
                //Custom setup page, SetupPageObj, is created
                //in method Class1::OnTaskSetup; SetupPage::StoreData 
                //saves the contents of the list box to poCmd.mpoExtra 
                //in the IEdmTaskProperties interface
                if (poCmd.mbsComment == "OK" & (SetupPageObj != null))
                {
                    SetupPageObj.StoreData();
                }
                SetupPageObj = null;
 
            }
            catch (System.Runtime.InteropServices.COMException ex)
            {
                MessageBox.Show("HRESULT = 0x" + ex.ErrorCode.ToString("X") + " " + ex.Message);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
'Main entry point of the add-in; called by SOLIDWORKS
'PDM Professional for all task-related events
public void OnCmd(ref EdmCmd poCmd, ref EdmCmdData[] ppoData)
        {
 
            try
            {
                switch (poCmd.meCmdType)
                {
 
                    //Called from the Administration tool when
                    //the user selects this task add-in from the
                    //drop-down list and whenever this task is
                    //subsequently edited in the Administration tool
                    case EdmCmdType.EdmCmd_TaskSetup:
                        OnTaskSetup(ref poCmd, ref ppoData);
 
                        break;
                    //Sent when the user clicks OK or
                    //Cancel in the task property dialog box
                    case EdmCmdType.EdmCmd_TaskSetupButton:
                        OnTaskSetupButton(ref poCmd, ref ppoData);
 
                        break;
                    //Called when an instance of the
                    //task is run
                    case EdmCmdType.EdmCmd_TaskRun:
                        OnTaskRun(ref poCmd, ref ppoData);
 
                        break;
                    //Called from the Task List in the
                    //Administration tool when the task details
                    //dialog is displayed
                    case EdmCmdType.EdmCmd_TaskDetails:
                        OnTaskDetails(ref poCmd, ref ppoData);
                        break;
                }
 
            }
            catch (System.Runtime.InteropServices.COMException ex)
            {
                MessageBox.Show("HRESULT = 0x" + ex.ErrorCode.ToString("X") + ex.Message);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
 
        }


The following is a resource template of the custom set-up page that is displayed in the Task property dialog box by TaskAddIn::OnTaskSetup. It also appears in the Task Details page added by TaskAddIn::OnTaskDetails. It is a user control in Visual Studio.


 
 

The code behind the custom set-up page is as follows.

using System;

using System.Collections;

using System.Collections.Generic;

using System.Data;

using System.Diagnostics;

using System.Windows.Forms;

using EPDM.Interop.epdm;

namespace StateAgeTask_CSharp

{

    // Setup page used in the task setup and task details dialogs must be a System.Windows.Forms.UserControl

    public partial class SetupPage

    {

 

        private IEdmVault7 mVault;

        private IEdmTaskProperties mTaskProps;

        private IEdmTaskInstance mTaskInst;

        // Constructor called from task setup

        public SetupPage(IEdmVault7 Vault, IEdmTaskProperties Props)

        {

            try

            {

                InitializeComponent();

                mVault = Vault;

                mTaskProps = Props;

                mTaskInst = null;

 

            }

            catch (System.Runtime.InteropServices.COMException ex)

            {

                MessageBox.Show("HRESULT = 0x" + ex.ErrorCode.ToString("X") + ex.Message);

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

        }

        // Constructor called from task details

        public SetupPage(IEdmVault7 Vault, IEdmTaskInstance Props)

        {

            try

            {

                InitializeComponent();

                mVault = Vault;

                mTaskProps = null;

                mTaskInst = Props;

 

            }

            catch (System.Runtime.InteropServices.COMException ex)

            {

                MessageBox.Show("HRESULT = 0x" + ex.ErrorCode.ToString("X") + ex.Message);

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

        }

 

        public void LoadData(EdmCmd poCmd)

        {

            try

            {

                //Add the names of the available workflows

                //to WorkflowsComboBox

                WorkflowsComboBox.Items.Clear();

                IEdmWorkflowMgr6 WorkflowMgr = default(IEdmWorkflowMgr6);

                WorkflowMgr = (IEdmWorkflowMgr6)mVault.CreateUtility(EdmUtility.EdmUtil_WorkflowMgr);

                IEdmPos5 WorkflowPos = WorkflowMgr.GetFirstWorkflowPosition();

                while (!WorkflowPos.IsNull)

                {

                    IEdmWorkflow6 Workflow = default(IEdmWorkflow6);

                    Workflow = WorkflowMgr.GetNextWorkflow(WorkflowPos);

                    WorkflowsComboBox.Items.Add(Workflow.Name);

                }

 

                string SelectedWorkflow = "";

                string NoDays = "";

                if ((mTaskProps != null))

                {

                    //Retrieve the name of the workflow that was

                    //selected by the user

                    SelectedWorkflow = (string)mTaskProps.GetValEx("SelectedWorkflowVar");

                    //Retrieve the number of days in a state

                    //before sending a message

                    NoDays = (string)mTaskProps.GetValEx("NoDaysVar");

                }

                else if ((mTaskInst != null))

                {

                    //Retrieve the name of the workflow that

                    //was selected by the user

                    SelectedWorkflow = (string)mTaskInst.GetValEx("SelectedWorkflowVar");

                    //Retrieve the number of days in a state

                    //before sending a message

                    NoDays = (string)mTaskInst.GetValEx("NoDaysVar");

                }

 

                //Select the workflow to display in

                //WorkflowsComboBox; setting this also

                //causes SetupPage::WorkflowsComboBox_SelectedIndexChanged

                //to be called to fill StatesListBox 

                //with the available states for this workflow

                if (string.IsNullOrEmpty(SelectedWorkflow))

                {

                    WorkflowsComboBox.SelectedIndex = 0;

                }

                else

                {

                    WorkflowsComboBox.Text = SelectedWorkflow;

                }

 

 

 

            }

            catch (System.Runtime.InteropServices.COMException ex)

            {

                MessageBox.Show("HRESULT = 0x" + ex.ErrorCode.ToString("X") + ex.Message);

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

        }

 

        public void StoreData()

        {

            try

            {

                //Add the selected states to StatesList

                string StatesList = "";

                foreach (int SelectedStateIndex in StatesListBox.SelectedIndices)

                {

                    StatesList += StatesListBox.Items[SelectedStateIndex] + "";

                }

                //Save the states selected by the user

                mTaskProps.SetValEx("SelectedStatesVar", StatesList);

                //Save the workflow selected by the user

                mTaskProps.SetValEx("SelectedWorkflowVar", WorkflowsComboBox.Text);

                //Save the number of days selected by the user

                mTaskProps.SetValEx("NoDaysVar", DaysNumericUpDown.Value.ToString());

 

            }

            catch (System.Runtime.InteropServices.COMException ex)

            {

                MessageBox.Show("HRESULT = 0x" + ex.ErrorCode.ToString("X") + ex.Message);

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

        }

 

 

        private void WorkflowsComboBox_SelectedIndexChanged(System.Object sender, System.EventArgs e)

        {

            try

            {

                //Find the IEdmWorkflow corresponding to the

                //selected workflow name

                IEdmWorkflowMgr6 WorkflowMgr = default(IEdmWorkflowMgr6);

                WorkflowMgr = (IEdmWorkflowMgr6)mVault.CreateUtility(EdmUtility.EdmUtil_WorkflowMgr);

                IEdmPos5 WorkflowPos = WorkflowMgr.GetFirstWorkflowPosition();

                IEdmWorkflow6 Workflow = null;

                IEdmWorkflow6 SelectedWorkflow = null;

                while (!WorkflowPos.IsNull)

                {

                    Workflow = WorkflowMgr.GetNextWorkflow(WorkflowPos);

                    if (Workflow.Name == WorkflowsComboBox.Text)

                    {

                        SelectedWorkflow = Workflow;

                        break;

                    }

                }

 

                //Add the names of the available states for the

                //selected workflow to StatesListBox

                StatesListBox.Items.Clear();

                if (SelectedWorkflow != null)

                {

                    IEdmPos5 StatePos = SelectedWorkflow.GetFirstStatePosition();

                    while (!(StatePos.IsNull))

                    {

                        IEdmState6 State = default(IEdmState6);

                        State = SelectedWorkflow.GetNextState(StatePos);

                        StatesListBox.Items.Add(State.Name);

 

                    }

 

                }

 

                string SelectedStates = "";

                if ((mTaskProps != null))

                {

                    SelectedStates = (string)mTaskProps.GetValEx("SelectedStatesVar");

                }

                else if ((mTaskInst != null))

                {

                    SelectedStates = (string)mTaskInst.GetValEx("SelectedStatesVar");

                }

 

                string[] States = SelectedStates.Split(new string[] { "\\n" }, StringSplitOptions.None);

                foreach (string State in States)

                {

                    if (!string.IsNullOrEmpty(State.Trim()))

                    {

                        StatesListBox.SelectedItems.Add(State);

                    }

                }

 

            }

            catch (System.Runtime.InteropServices.COMException ex)

            {

                MessageBox.Show("HRESULT = 0x" + ex.ErrorCode.ToString("X") + ex.Message);

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

        }

 

        public void DisableControls()

        {

            try

            {

                WorkflowsComboBox.Enabled = false;

                StatesListBox.Enabled = false;

                DaysNumericUpDown.Enabled = false;

            }

            catch (System.Runtime.InteropServices.COMException ex)

            {

                MessageBox.Show("HRESULT = 0x" + ex.ErrorCode.ToString("X") + ex.Message);

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

        }

 

    }

}

 

See Also

Programming Tasks

Standard Task Add-in

TaskSample (VB.NET)

 

Back to top