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;
[Guid(""),
ComVisible(true)]
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
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;
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.