关于SOLIDWORKS PDM插件的制作
PDM插件用到的主要分两种
通过插件命令管理接口IEdmCmdMgr5 的方法来实现(注册)
生成的类需继承 IEdmAddIn5接口的 addcmd和oncmd方法
AddCmd
添加菜单类的方法:
void AddCmd(
System.int lCmdID,
System.string bsMenuString,
System.int lEdmMenuFlags,
System.string bsStatusBarHelp,
System.string bsToolbarToolTip,
System.int lToolbarButtonIndex,
System.int lToolbarImageID
)
对应的参数介绍如下:
lCmdID
本命令的ID
bsMenuString
命令上显示的文本(相当到buttom里的.txt)
lEdmMenuFlags
菜单的适合范围(如可以设为仅仅选择是文件时,菜单才有效)【可选】
bsStatusBarHelp
用户在右键单击上下文菜单中突出显示菜单项时在Windows资源管理器状态栏中显示的可选文本【可选】
bsToolbarToolTip
光标位于命令工具栏按钮上方时显示的可选消息【可选】
lToolbarButtonIndex
资源图像中工具栏按钮的可选索引【可选】
lToolbarImageID
用作工具栏按钮的图像的可选ID【可选】
AddHook方法
添加一个挂钩,当指定事件发生时,该挂钩使SOLIDWORKS PDM Professional将该插件的IEdmAddIn5插件下对应的方法;类似于一个事件触发机制
钩子参见如下
https://blog.csdn.net/weixin_34294649/article/details/90157515
该方法主要用一个参数
void AddHook(
EdmCmdType eCmdType,
System.object poReserved
)
eCmdType
事件的类型触发见一表
poReserved
空值; 保留以备将来使用
例事件触发类:
using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Windows.Forms;
using EdmLib;
public class ChangeStateNotification : IEdmAddIn5
{
public void GetAddInInfo(ref EdmLib.EdmAddInInfo poInfo, EdmLib.IEdmVault5 poVault, EdmLib.IEdmCmdMgr5 poCmdMgr)
{
try
{
poInfo.mbsAddInName = "插件名称";
poInfo.mbsCompany = "公司名称";
poInfo.mbsDescription = "插件说明";
poInfo.mlAddInVersion = 1;
//PDM的最低版本要求
poInfo.mlRequiredVersionMajor = 6;//PDM的版本如2006
poInfo.mlRequiredVersionMinor = 4;//PDM版本如 2006 V5
//PDM注册钩子事件
//参数代表文件状态改变事件
poCmdMgr.AddHook(EdmCmdType.EdmCmd_PostState);
}
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 OnCmd(ref EdmLib.EdmCmd poCmd, ref System.Array ppoData)
{
try {
string AffectedFileNames = "";
Boolean topNode;
IEdmCmdNode cmdNode;
switch (poCmd.meCmdType) {
//当有事件发生-状态改变
case EdmCmdType.EdmCmd_PostState:
foreach ( EdmCmdData AffectedFile in ppoData) {
//对具体的事件执行动作,即产生事件的文件或文件夹
//ppoData为对应每个文件的结构体组成的数组,可获取文件ID路径等信息
//AffectedFile实例化后的结构体,对应不同的文件类型属性也不一样
//如mbsStrData1 为文件的路径信息
if (AffectedFile.mbsStrData2 == "通过") {
AffectedFileNames += AffectedFile.mbsStrData1 + "";
}
cmdNode = (IEdmCmdNode)AffectedFile.mpoExtra;
//返回的接口类型取决于命令或挂钩的类型
//指向包含命令特定信息的对象(object)
//当插件命令执行时可通过如上方法获取文件的转变状态
topNode = (Boolean)cmdNode.GetProperty(EdmCmdNodeProp.EdmCmdNode_IsTopNode);
//True 代表文件到了最后的节点
((EdmVault5)(poCmd.mpoVault)).MsgBox(poCmd.mlParentWnd, "文件是否到了最后审核环节? " + topNode);
}
if (AffectedFileNames.Length > 0) {
((EdmVault5)(poCmd.mpoVault)).MsgBox(poCmd.mlParentWnd, AffectedFileNames + " 已通过");
}
break;
//事件注册失败时
default:
((EdmVault5)(poCmd.mpoVault)).MsgBox(poCmd.mlParentWnd, "未知命令类型");
break;
}
} catch (System.Runtime.InteropServices.COMException ex) {
MessageBox.Show("HRESULT = 0x" + ex.ErrorCode.ToString("X") + ex.Message);
} catch (Exception ex) {
MessageBox.Show(ex.Message);
}
}
}
注意:
需设置COM可见
引用dll文件PDMWorks Enterprise nnnn Type Library(nnnn代表年份)
完成后通过PDM管理端那个添加插件
例二菜单点击类
using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Windows.Forms;
using EdmLib;
public class Class1 : IEdmAddIn5
{
public void GetAddInInfo(ref EdmAddInInfo poInfo, IEdmVault5 poVault, IEdmCmdMgr5 poCmdMgr)
{
poInfo.mbsAddInName = "插件名;
poInfo.mbsCompany = "公司名";
poInfo.mbsDescription = "插件说明";
poInfo.mlAddInVersion = 1;
poInfo.mlRequiredVersionMajor = 6;
poInfo.mlRequiredVersionMinor = 4;
poCmdMgr.AddCmd(1, "第一个菜单插件", (int)EdmMenuFlags.EdmMenu_Nothing);
}
public void OnCmd(ref EdmCmd poCmd, ref System.Array ppoData)
{
if (poCmd.meCmdType == EdmCmdType.EdmCmd_Menu)
{
if (poCmd.mlCmdID == 1)
{
System.Windows.Forms.MessageBox.Show("这是制作的第一个插件");
}
}
}
}