代码之家  ›  专栏  ›  技术社区  ›  Juan Salvador Portugal

不能将setvar与postadd或preadd hooks pdm api一起使用

  •  1
  • Juan Salvador Portugal  · 技术社区  · 6 年前

    我正在和 SolidWorks PDM 2017 SP5

    您好,我正在开发一个插件,在将文档添加到保管库时,该插件必须修改变量,问题是这两者都是, PreAdd PostAdd 返回文档未由我签出的错误( 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;   
        }    
    }
    

    有人知道怎么做吗?我真的疯了!

    非常感谢

    2 回复  |  直到 6 年前
        1
  •  1
  •   Juan Salvador Portugal    6 年前

    我找到了关于 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);
    
        2
  •  1
  •   ehcanadian    6 年前

    您需要处理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);
    
    }