不能将 SetVar 与 PostAdd 或 PreAdd 挂钩 PDM 一起使用 Api

Cant use SetVar with PostAdd or PreAdd hooks PDM Api

我正在使用 SolidWorks PDM 2017 SP5

您好,我正在开发一个插件,当文档添加到保管库时必须修改一个变量,问题是 PreAddPostAdd return我一个错误,文件没有被我签出(0x080040210),显然,文件还没有被注册

这是我的代码

public void GetAddInInfo(ref EdmAddInInfo poInfo, IEdmVault5 poVault, IEdmCmdMgr5 poCmdMgr)

        {

            poInfo.mbsAddInName = "Titulo C# Add-In";

            poInfo.mbsCompany = "ARTRANS S.A.";

            poInfo.mbsDescription = "Renombra los títulos de las obras de epdm.";

            poInfo.mlAddInVersion = 1;

            poInfo.mlRequiredVersionMajor = 17;

            poInfo.mlRequiredVersionMinor = 5;

           //Create PreAdd hook (with PostAdd i have the same result)

            poCmdMgr.AddHook(EdmCmdType.EdmCmd_PreAdd);

        }

public void OnCmd(ref EdmCmd poCmd, ref Array ppoData)

{
 switch (poCmd.meCmdType)    
 {    
        case EdmCmdType.EdmCmd_PreAdd:    

            IEdmVault5 _Vault = (IEdmVault5)poCmd.mpoVault;

            IEdmFile5 archivo = default(IEdmFile5);

            var varManager = default(IEdmEnumeratorVariable8);    

            foreach (EdmCmdData fila in ppoData)

            {

                archivo = (IEdmFile5)_Vault.GetObject(EdmObjectType.EdmObject_File, fila.mlObjectID1);

                varManager = (IEdmEnumeratorVariable8)archivo.GetEnumeratorVariable();

                varManager.SetVar("Title", "", "Example"));

                varManager.CloseFile(true);

            }

            break;   
    }    
}

有人知道必须怎么做吗?我真的没主意了!

非常感谢

我找到了关于 EdmCmdData Structure 的文档,每个挂钩上都有 EdmCmdData 结构的行为,所以,在我的例子中,PostAdd

我得到了

父文件夹的 ID EdmCmdData.mlObjectID1

本地文件路径EdmCmdData.mbsStrData1

用所需的数据替换这一行:

archivo = (IEdmFile5)_Vault.GetObject(EdmObjectType.EdmObject_File, fila.mlObjectID1);

为此

IEdmFolder5 carpeta = (IEdmFolder5)_Vault.GetObject(EdmObjectType.EdmObject_Folder, fila.mlObjectID1);
archivo = _Vault.GetFileFromPath(fila.mbsStrData1,out carpeta);

您需要处理 PostAdd,并确保文件已由您在您的计算机上检出。

IEdmVault12 _Vault = (IEdmVault12)poCmd.mpoVault;
// Get our userId
var userId = _Vault.GetLoggedInWindowsUserID(_Vault.Name);
IEdmFile5 archivo = default(IEdmFile5);
var varManager = default(IEdmEnumeratorVariable8);
foreach (EdmCmdData fila in ppoData)
{
    archivo = (IEdmFile5)_Vault.GetObject(EdmObjectType.EdmObject_File, fila.mlObjectID1);
    // Make sure we're the user with the file checked out and it's checked out on this machine.
    if (archivo.LockedByUserID != userId || archivo.LockedOnComputer != Environment.MachineName)
        continue;

    varManager = (IEdmEnumeratorVariable8)archivo.GetEnumeratorVariable();
    varManager.SetVar("Title", "", "Example"));
    varManager.CloseFile(true);

}