【问题标题】:Solidworks EPDM API IEdmEnumeratorVariable5::SetVar not working as expectedSolidworks EPDM API IEdmEnumeratorVariable5::SetVar 未按预期工作
【发布时间】:2015-09-07 22:00:42
【问题描述】:

我正在尝试使用IEdmEnumeratorVariable5::SetVar 根据用户输入到 Windows 窗体中来更新一些文件卡变量。我的代码执行,没有错误消息,文件被签出并重新签入,并在历史记录中添加了适当的注释;但是卡上的变量没有更新。

我通过在运行时单步执行代码来验证所有变量都填充了正确的(如预期的)数据。 SetVar 程序都顺利进行,但数据卡上的变量不会改变值——即使手动刷新文件夹视图也没有效果。


下面是我的代码。

这是一个插件应用程序,使用 VS Community 2015 在 VB 中编写为类库项目,目标框架为 .NET 4.0。

努力使这个问题更简洁;下面我只包含了执行设置变量工作的代码的 sn-p,然后我还包含了更多代码,以便您可以在需要时获得整个画面。


只是提示:

这是设置变量的代码:

Dim UserManager As IEdmUserMgr5 = .SourceVault
Dim User As IEdmUser5 = UserManager.GetLoggedInUser

CardComment = UserComment & CardComment
CardDate = Today().ToString("yyMMdd", Globalization.CultureInfo.InvariantCulture)
CardBy = User.Name
CardDisposition = UserDisposition

CardVariables.SetVar(DispositionVariable, "@", CardDisposition)
CardVariables.SetVar(CommentVariable, "@", CardComment)
CardVariables.SetVar(ByVariable, "@", CardBy)
CardVariables.SetVar(DateVariable, "@", CardDate)
CardVariables.Flush()


更广泛的笔划:

类模块级变量:

Private Structure CommandInfo
    Dim SourceVault As IEdmVault11
    Dim SourceCommand As EdmCmd
    Dim SourceSelection As System.Array
    Dim TargetTemplate As System.String
    Dim VerifiedPaths As List(Of String)
End Structure

Private ReceivedCommand As CommandInfo

OnCmd 过程(调用者):

Public Sub OnCmd(ByRef poCmd As EdmCmd,
                 ByRef ppoData As System.Array) Implements IEdmAddIn5.OnCmd

    Dim CommandToRun As MenuCommand

    Try

        With ReceivedCommand
            .SourceVault = poCmd.mpoVault
            .SourceCommand = poCmd
            .SourceSelection = ppoData

            'Get the command structure for the command ID
            Select Case poCmd.meCmdType

                Case EdmCmdType.EdmCmd_Menu
                    CommandToRun = AvailableCommands(.SourceCommand.mlCmdID)

                Case EdmCmdType.EdmCmd_CardButton
                    Select Case True
                        Case poCmd.mbsComment.ToString.ToUpper.Contains("DISPOSITION")
                            DispositionRequest()
                        Case Else : Exit Sub
                    End Select

                Case Else : Exit Sub
            End Select
    '...... (End Try, End Sub, Etc.)

DispositionRequest 过程(被调用者):

Private Sub DispositionRequest()

    Dim UserDisposition As String

    Using Disposition As New DispositionForm
        With Disposition
            If Not .ShowDialog() = System.Windows.Forms.DialogResult.OK Then Exit Sub
            Select Case True

                Case .Approve.Checked
                    UserDisposition = "Approved"

                Case .Reject.Checked
                    UserDisposition = "Rejected"

                Case Else : Exit Sub

            End Select
        End With
    End Using



    Dim UserComment As String

    Using Explanation As New DispositionExplanation
        With Explanation

            If Not .ShowDialog() = System.Windows.Forms.DialogResult.OK Then Exit Sub

            If .ListView1.Items.Count > 0 Then
                 'do some stuff not relevant to this question...
            End If

            UserComment = .Comments.Text

        End With
    End Using

    'This next procedure just gets a list of paths from ReceivedCommand.SourceSelection  - which is just the ppoData argument from the OnCmd procedure - see code block above!
    Dim RequestPaths As List(Of String) = GetSelectedFilePaths()

    For Each Path As String In RequestPaths
        With ReceivedCommand
            Dim RequestFile As IEdmFile5 = .SourceVault.GetFileFromPath(Path)
            Dim ParentFolder As IEdmFolder6 = .SourceVault.GetFolderFromPath(System.IO.Path.GetDirectoryName(Path))
            Dim UnlockLater As Boolean = False

            If Not RequestFile.IsLocked Then
                UnlockLater = True
                RequestFile.LockFile(ParentFolder.ID, .SourceCommand.mlParentWnd, CInt(EdmLockFlag.EdmLock_Simple))
            End If

            Dim CardVariables As IEdmEnumeratorVariable5 = RequestFile.GetEnumeratorVariable

            'We allow users to re-disposition a request so we want to keep any previous disposition information so it is not lost
            Dim CardComment As String = String.Empty
            Dim CardBy As String = String.Empty
            Dim CardDate As String = String.Empty
            Dim CardDisposition As String = String.Empty
            Dim Success As Boolean

            Const CommentVariable As String = "DispComm"
            Const ByVariable As String = "DisposedBy"
            Const DateVariable As String = "DisposedDate"
            Const DispositionVariable As String = "Disposition"

            Success = CardVariables.GetVar(DispositionVariable, "@", CardDisposition)

            If Success Then
                Success = CardVariables.GetVar(CommentVariable, "@", CardComment)
                If Success Then Success = CardVariables.GetVar(ByVariable, "@", CardBy)
                If Success Then Success = CardVariables.GetVar(DateVariable, "@", CardDate)
                If Success Then CardComment = "Previously dispositioned as: """ & CardDisposition & """ by: " & CardBy & " on: " & CardDate & vbNewLine &
                                                 "---------Previous disposition explanation---------" & vbNewLine & CardComment
            End If

            Dim UserManager As IEdmUserMgr5 = .SourceVault
            Dim User As IEdmUser5 = UserManager.GetLoggedInUser

            CardComment = UserComment & CardComment
            CardDate = Today().ToString("yyMMdd", Globalization.CultureInfo.InvariantCulture)
            CardBy = User.Name
            CardDisposition = UserDisposition

            CardVariables.SetVar(DispositionVariable, "@", CardDisposition)
            CardVariables.SetVar(CommentVariable, "@", CardComment)
            CardVariables.SetVar(ByVariable, "@", CardBy)
            CardVariables.SetVar(DateVariable, "@", CardDate)
            CardVariables.Flush()

            If UnlockLater Then RequestFile.UnlockFile(lParentWnd:= .SourceCommand.mlParentWnd,
                                                        bsComment:="Dispositioned as " & CardDisposition,
                                                        lEdmUnlockFlags:=0)
            .SourceVault.RefreshFolder(ParentFolder.LocalPath)
        End With
    Next


End Sub

【问题讨论】:

    标签: vb.net com solidworks


    【解决方案1】:

    来自the documentation

    bsCfgName :存储变量值的配置或布局的名称; 不支持配置的文件夹和文件类型的空字符串

    我正在处理一个不支持配置的虚拟文件。 我看到一个使用虚拟文件的 C 示例,它们传递了空引用,所以我重新阅读了文档并看到了上面的摘录,所以我将 mboconfiguration 参数的代码从 "@" 更改为 String.Empty,现在它正在工作!

    CardVariables.SetVar(DispositionVariable, String.Empty, CardDisposition)
    CardVariables.SetVar(CommentVariable, String.Empty, CardComment)
    CardVariables.SetVar(ByVariable, String.Empty, CardBy)
    CardVariables.SetVar(DateVariable, String.Empty, CardDate)
    CardVariables.Flush()
    

    【讨论】:

    • 很好地阅读了那个细则......不要刷新,在 10 版本的枚举器上使用 CloseFile(true)。
    猜你喜欢
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 2016-01-29
    • 2023-03-21
    • 2017-10-24
    • 2016-03-16
    • 1970-01-01
    • 2020-08-12
    相关资源
    最近更新 更多