# SOLIDWORKS PDM Professional API Help

# Create Vault View Tab Add-in Example (C#)

This example shows how to create an add-in that adds a custom tab to the bottom panel of a vault view when it is opened in File Explorer.

//--------------------------------------------------------------------------------------
// Preconditions:
// 1. Start Microsoft Visual Studio.
// 2. Click File > New > Project > Visual C# > Class Library (.NET Framework).
// 3. Type SWEPDMAddin1 in Name.
// 4. Click Browse and navigate to the folder where to create the project.
// 5. Click OK.
// 6. Right-click the project name in the Solution Explorer and select Add > Reference.
// 7. In the Reference Manager dialog:
// a. Click the Browse tab.
// b. Click Browse at the bottom.
// c. Navigate to the SOLIDWORKS PDM Client installation folder.
// d. Select EPDM.Interop.epdm.dll and click Add.
// e. Ensure that EPDM.Interop.epdm.dll is checked in the Reference Manager dialog.
// f. Click OK.
// 8. Right-click the project name in the Solution Explorer and select Properties.
// 9. 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.
//10. Save the project.
//11. Copy SWEPDMADDin1 code to a new class, SWEPDMAddin1.cs.
//12. Right-click the project and select Add > User Control.
//13. Type "UserControl1.cs" in Name and click Add.
//14. Copy UserControl1 code to the code behind UserControl1.cs.
//15. Copy UserControl1.Designer code to UserControl1.Designer.cs.
//16. To populate the GUID attribute in SWEPDMAddin1.cs:
// a. Click Tools > Create GUID in the IDE.
// b. Select GUID Format 5.
// c. Click Copy.
// d. Click Exit.
// e. Populate Guid("") in the code with the copied string.
//17. Copy a *.png file to the project folder.
//18. Right-click the project and select Add > Existing item.
//19. Select the *.png file and click Add.
//20. Right-click the *.png file in Solution Explorer and select Exclude from Project.
//21. Replace the png_path in SWEPDMAddin1.cs with the full path name of the *.png
// you just added to the project.
//22. Click Build > Build Solution.
//23. Ensure you have a vault, a vault view, and a file in the vault.
//
// 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 SWEPDMAddin1 project.
// b. Click SWEPDMAddin1.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 icon and click Log Off > vault_name.
// 5. Open File Explorer on a view of vault_name:
// a. Log in as Admin.
// b. Click UserTab1 in the bottom panel of the vault view.
// One or more message boxes display. Click OK in the message boxes.
// c. Select a file in the vault.
// The custom tab's text box is populated with the name of the file.
// d. Right-click the file in the vault.
// e. Select Test menu item #1.
// f. Click OK in the message box.
//---------------------------------------------------------------------------------------

//SWEPDMADDin1

using System;
using System.Collections.Generic;
using System.Diagnostics;
using EPDM.Interop.epdm;
using System.Runtime.InteropServices;
namespace SWEPDMAddin1
{
[Guid(""), ComVisible(true)]
public class SWPDMAddin : IEdmAddIn5
{
Dictionary<string, UserControl1> ControlMaps = new Dictionary<string, UserControl1>();
static long Identifier = 1;
public void GetAddInInfo(ref EdmAddInInfo poInfo, IEdmVault5 poVault, IEdmCmdMgr5 poCmdMgr)
{
//Add-in information
poInfo.mbsAddInName = "SWPDMAddin1";
poInfo.mbsCompany = "your_company_name";
poInfo.mbsDescription = "This add-in adds a tab to the bottom panel of the vault view before it is opened in File Explorer. It also adds context-sensitive menu items to the right-click menus of files in the vault.";
poInfo.mlAddInVersion = 1;
//Minimum Conisio version needed for .Net add-Ins is 6.4
poInfo.mlRequiredVersionMajor = 6;
poInfo.mlRequiredVersionMinor = 4;
//Adds context-sensitive menu items to the right-click menus of files in the vault
poCmdMgr.AddCmd(1, "Test menu item #1", (int)EdmMenuFlags.EdmMenu_Nothing, "", "", 0, 0);
poCmdMgr.AddCmd(1, "Test menu item #2", (int)EdmMenuFlags.EdmMenu_Nothing, "", "", 0, 0);
AddAllHooks(poCmdMgr);
}
public void OnCmd(ref EPDM.Interop.epdm.EdmCmd poCmd, ref EdmCmdData[] ppoData)
{
Debug.Print("Command Type: " + poCmd.meCmdType.ToString() + "\n " + System.DateTime.Now.ToString());
IEdmVault5 edmVault = poCmd.mpoVault as IEdmVault5;
try
{
switch (poCmd.meCmdType)
{
case EdmCmdType.EdmCmd_CardButton:
break;
case EdmCmdType.EdmCmd_CardInput:
break;
case EdmCmdType.EdmCmd_CardListSrc:
break;
case EdmCmdType.EdmCmd_InstallAddIn:
break;
case EdmCmdType.EdmCmd_Menu:
//File's right-click menu item is selected
edmVault.MsgBox(0, " Context-sensitive menu item selected", EdmMBoxType.EdmMbt_OKOnly, "PDM Pro add-in");
break;
case EdmCmdType.EdmCmd_PostAdd:
break;
case EdmCmdType.EdmCmd_PostAddFolder:
break;
case EdmCmdType.EdmCmd_PostCopy:
break;
case EdmCmdType.EdmCmd_PostCopyFolder:
break;
case EdmCmdType.EdmCmd_PostDelete:
break;
case EdmCmdType.EdmCmd_PostDeleteFolder:
break;
case EdmCmdType.EdmCmd_PostGet:
break;
case EdmCmdType.EdmCmd_PostLock:
break;
case EdmCmdType.EdmCmd_PostMove:
break;
case EdmCmdType.EdmCmd_PostMoveFolder:
break;
case EdmCmdType.EdmCmd_PostRename:
break;
case EdmCmdType.EdmCmd_PostRenameFolder:
break;
case EdmCmdType.EdmCmd_PostShare:
break;
case EdmCmdType.EdmCmd_PostState:
break;
case EdmCmdType.EdmCmd_PostUndoLock:
break;
case EdmCmdType.EdmCmd_PostUnlock:
break;
case EdmCmdType.EdmCmd_PreAdd:
break;
case EdmCmdType.EdmCmd_PreAddFolder:
break;
case EdmCmdType.EdmCmd_PreCopy:
break;
case EdmCmdType.EdmCmd_PreCopyFolder:
break;
case EdmCmdType.EdmCmd_PreDelete:
break;
case EdmCmdType.EdmCmd_PreDeleteFolder:
break;
case EdmCmdType.EdmCmd_PreGet:
break;
case EdmCmdType.EdmCmd_PreLock:
break;
case EdmCmdType.EdmCmd_PreMove:
break;
case EdmCmdType.EdmCmd_PreMoveFolder:
break;
case EdmCmdType.EdmCmd_PreRename:
break;
case EdmCmdType.EdmCmd_PreRenameFolder:
break;
case EdmCmdType.EdmCmd_PreShare:
break;
case EdmCmdType.EdmCmd_PreState:
break;
case EdmCmdType.EdmCmd_PreUndoLock:
break;
case EdmCmdType.EdmCmd_PreUnlock:
break;
case EdmCmdType.EdmCmd_SerialNo:
break;
case EdmCmdType.EdmCmd_UninstallAddIn:
break;
case EdmCmdType.EdmCmd_TaskDetails:
break;
case EdmCmdType.EdmCmd_PreExploreInit:
{
// File Explorer is about to be opened
IEdmCmdMgr6 poCmdMgr6 = poCmd.mpoExtra as IEdmCmdMgr6;
UserControl1 myControl1 = new UserControl1();
// Add a custom tab to the bottom panel of the vault view
poCmdMgr6.AddVaultViewTab(myControl1.Handle.ToInt64(), "UserTab1", @"png_path", "UserTab1", Identifier.ToString());
ControlMaps.Add(Identifier.ToString(), myControl1);
Identifier++;
break;
}
case EdmCmdType.EdmCmd_SelectItem:
{
// If a file is selected, populate the textBox1 control
EdmCmdData poobject = (EdmCmdData)ppoData.GetValue(0);
string Id = poobject.mbsStrData3;
UserControl1 myControl;
bool exist = ControlMaps.TryGetValue(Id, out myControl);
if (exist)
{
if (poobject.mbsStrData1.Length != 0)
myControl.SetFileName(poobject.mbsStrData1);
else
myControl.SetFileName(poobject.mbsStrData2);
}
break;
}
case EdmCmdType.EdmCmd_DeSelectItem:
{
// If a file is de-selected, empty the textBox1 control
EdmCmdData poobject = (EdmCmdData)ppoData.GetValue(0);
string Id = poobject.mbsStrData3;
UserControl1 myControl;
bool exist = ControlMaps.TryGetValue(Id, out myControl);
if (exist)
{
myControl.SetFileName("");
}
break;
}
case EdmCmdType.EdmCmd_UserTabDelete:
{
// When File Explorer is closed, this event is called; perform cleanup here
EdmCmdData poobject = (EdmCmdData)ppoData.GetValue(0);
string Id = poobject.mbsStrData3;
ControlMaps.Remove(Id);
break;
}
case EdmCmdType.EdmCmd_ActivateAPITab:
{
// UserTab1 is selected
edmVault.MsgBox(0, " UserTab1 selected", EdmMBoxType.EdmMbt_OKOnly, "PDM Pro add-in");
break;
}
default:
break;
}
}
catch (COMException exp)
{
string errorName, errorDesc;
edmVault.GetErrorString(exp.ErrorCode, out errorName, out errorDesc);
edmVault.MsgBox(0, errorDesc, EdmMBoxType.EdmMbt_OKOnly, errorName);
}
}
void AddAllHooks(IEdmCmdMgr5 poCmdMgr)
{
poCmdMgr.AddHook(EdmCmdType.EdmCmd_CardButton, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_CardInput, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_CardListSrc, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_InstallAddIn, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_Menu, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_PostAdd, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_PostAddFolder, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_PostCopy, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_PostCopyFolder, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_PostDelete, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_PostDeleteFolder, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_PostGet, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_PostLock, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_PostMove, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_PostMoveFolder, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_PostRename, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_PostRenameFolder, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_PostShare, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_PostState, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_PostUndoLock, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_PostUnlock, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_PreAdd, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_PreAddFolder, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_PreCopy, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_PreCopyFolder, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_PreDeleteFolder, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_PreGet, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_PreLock, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_PreMove, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_PreMoveFolder, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_PreRename, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_PreRenameFolder, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_PreShare, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_PreState, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_PreUndoLock, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_PreUnlock, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_SerialNo, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_PreExploreInit, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_UninstallAddIn, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_TaskDetails, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_SelectItem, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_DeSelectItem, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_ActivateAPITab, null);
poCmdMgr.AddHook(EdmCmdType.EdmCmd_UserTabDelete, null);
}
}
}

Back to top

//UserControl1.Designer

namespace SWEPDMAddin1
{
partial class UserControl1
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.textBox1 = new System.Windows.Forms.TextBox();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// textBox1
//
this.textBox1.Location = new System.Drawing.Point(128, 42);
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(414, 20);
this.textBox1.TabIndex = 4;
//
// label1
//
this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(3, 0);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(54, 13);
this.label1.TabIndex = 5;
this.label1.Text = "UserTab1";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(47, 45);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(75, 13);
this.label2.TabIndex = 6;
this.label2.Text = "Selected Item ";
//
// UserControl1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.label2);
this.Controls.Add(this.label1);
this.Controls.Add(this.textBox1);
this.Name = "UserControl1";
this.Size = new System.Drawing.Size(559, 243);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
}
}

Back to top

//UserControl1

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
namespace SWEPDMAddin1
{
public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
}
public void SetFileName(string strFileName)
{
textBox1.Text = strFileName;
}
}
}

Back to top