Aveva Marine VBNET 编程系列-搭建开发框架

aveva,marine,vbnet,编程,系列,搭建,开发,框架 · 浏览次数 : 40

小编点评

**代码摘要** 该代码实现了一个插件,它可以动态创建菜单并执行方法。 **主要类** * `MyAmFunctionAtt`:定义了插件方法的属性,用于反射调用。 * `MyAMFunction`:继承自 `MyAmFunctionAtt` 的类,用于存储插件方法的信息。 * `MianClsss`:插件启动加载的类,其中定义了 `GetAllCommand` 方法。 * `MyAmCommand`:用于测试功能的类,它继承自 `MyAmFunctionAtt`。 **主要方法** * `GetAllCommand`:从插件的 Assembly 中获取所有方法,并筛选出支持测试功能的方法。 * `测试功能`:在窗口管理器的空位置右键选择插件,并调用 `测试功能` 方法。 **关键功能** * 动态创建菜单:使用 `MenuTool` 类添加自定义菜单项。 * 反射调用:使用 `Attribute` 属性获取方法信息,并调用对应的方法。 * 绑定事件:为按钮添加事件,当按钮被点击时,执行相应的方法。 **其他信息** * 代码使用 `System.IO.File.GetLastWriteTime` 获取插件的最后修改时间。 * 当插件启动时,会在窗口管理器的右键菜单中添加一个新菜单项,该菜单项指向 `测试功能`。 * 用户可以通过右键选择菜单项,选择 `测试功能`,然后在窗口管理器中看到提示信息。

正文

引用的Dll

Aveva.ApplicationFramework.dll

Aveva.ApplicationFramework.Presentation

菜单展示效果

创建Attribute,用于反射来动态创建菜单,不用每次都去写command

Public Class MyAmFunctionAtt
    Inherits Attribute

    Private _menuName As String
    Public Property MenuName() As String
        Get
            Return _menuName
        End Get
        Set(ByVal value As String)
            _menuName = value
        End Set
    End Property
    Private _functionName As String
    Public Property FunctionName() As String
        Get
            Return _functionName
        End Get
        Set(ByVal value As String)
            _functionName = value
        End Set
    End Property

    Sub New(_menuNam As String, _functionName As String)
        Me.MenuName = _menuNam
        Me.FunctionName = _functionName
    End Sub
End Class

自定义类,在内存中储存方法的信息,方便后面反射调用。

Public Class MyAMFunction
    Private _att As MyAmFunctionAtt
    Public Property Att() As MyAmFunctionAtt
        Get
            Return _att
        End Get
        Set(ByVal value As MyAmFunctionAtt)
            _att = value
        End Set
    End Property

    Private _mi As MethodInfo
    Public Property Method() As MethodInfo
        Get
            Return _mi
        End Get
        Set(ByVal value As MethodInfo)
            _mi = value
        End Set
    End Property

    Sub New(mi As MethodInfo)
        Me.Att = mi.GetCustomAttributes(True).First(Function(att)
                                                        Return att.GetType().FullName = GetType(MyAmFunctionAtt).FullName
                                                    End Function)
        Me.Method = mi
    End Sub
End Class

插件启动加载的类

Public Class MianClsss
    Implements IAddin
    Public CurAss As Assembly = Assembly.GetExecutingAssembly()
    Public ReadOnly Property Description As String Implements IAddin.Description
        Get
            Return Me.GetType().FullName
        End Get
    End Property

    Public ReadOnly Property Name As String Implements IAddin.Name
        Get
            Return Me.GetType().FullName
        End Get
    End Property

    Public Sub Start(serviceManager As ServiceManager) Implements IAddin.Start
        Dim wm As WindowManager = serviceManager.GetService(GetType(WindowManager))
        'Dim cmd As New MyCommand(wm)
        'Dim cmdManager As CommandManager = serviceManager.GetService(GetType(CommandManager))
        'cmdManager.Commands.Add(cmd)
        Dim cbm As CommandBarManager = serviceManager.GetService(GetType(CommandBarManager))
        cbm.AllowCustomization = True
        cbm.BeginUpdate()
        Dim cbar = cbm.CommandBars.AddCommandBar(System.IO.Path.GetFileNameWithoutExtension(CurAss.Location))
        cbar.DockedPosition = DockedPosition.Top
        cbar.AllowHiding = False
        cbar.AllowFloating = True
        Dim assemblyDate = System.IO.File.GetLastWriteTime(System.Reflection.Assembly.GetExecutingAssembly().Location).ToString("yyyy年MM月dd日-HH点mm分")
        cbar.Caption = cbar.Key + $",软件版本({assemblyDate})"
        '读取全部的自定义命令
        Dim cmds = GetAllCommand()
        For Each item As KeyValuePair(Of String, List(Of MyAMFunction)) In cmds
            Dim curMenu As MenuTool = cbm.RootTools.AddMenuTool(item.Key, item.Key, Nothing)
            Dim it1 As MenuTool = cbar.Tools.AddTool(curMenu.Key)
            Dim curMenuItems = item.Value.OrderBy(Function(c)
                                                      Return c.Att.FunctionName
                                                  End Function).ToList()
            For Each myCmd As MyAMFunction In curMenuItems
                Dim cmdBtn As ButtonTool = cbm.RootTools.AddButtonTool(myCmd.Att.FunctionName, myCmd.Att.FunctionName, Nothing)
                cmdBtn.Tooltip = $"{myCmd.Att.MenuName}.{myCmd.Att.FunctionName}"
                AddHandler cmdBtn.ToolClick, Sub()
                                                 Try
                                                     wm.StatusBar.Text = $"正在执行命令{ myCmd.Att.FunctionName}..."
                                                     If myCmd.Method.DeclaringType Is Nothing Then Return
                                                     If myCmd.Method.IsStatic Then
                                                         myCmd.Method.Invoke(Nothing, {wm})
                                                     Else
                                                         myCmd.Method.Invoke(Activator.CreateInstance(myCmd.Method.DeclaringType), {wm})
                                                     End If
                                                     wm.StatusBar.Text = $"执行命令{ myCmd.Att.FunctionName}完成...."
                                                 Catch ex As Exception
                                                     MsgBox(ex.StackTrace)
                                                 End Try
                                             End Sub
                it1.Tools.AddTool(cmdBtn.Key)
            Next
        Next
        cbm.EndUpdate(True)
        cbm.SaveLayout()
    End Sub


    Public Sub [Stop]() Implements IAddin.Stop

    End Sub

    Public Function GetAllCommand() As Dictionary(Of String, List(Of MyAMFunction))

        Dim dicts As New Dictionary(Of String, List(Of MyAMFunction))

        Dim allClass As List(Of Type) = Me.CurAss.GetTypes().Where(Function(c)
                                                                       Return c.IsClass And c.IsPublic
                                                                   End Function).ToList()
        Dim mis As New List(Of MyAMFunction)

        For Each item As Type In allClass
            Dim curClsMis = item.GetMethods().Where(Function(m)
                                                        Return m.GetCustomAttributes(GetType(MyAmFunctionAtt), True).Any()
                                                    End Function).ToList()
            If curClsMis.Count > 0 Then
                For Each mi As MethodInfo In curClsMis
                    mis.Add(New MyAMFunction(mi))
                Next
            End If
        Next
        If mis.Count = 0 Then Return dicts
        For Each item As MyAMFunction In mis
            Dim temp As New List(Of MyAMFunction)
            If dicts.ContainsKey(item.Att.MenuName) Then temp = dicts(item.Att.MenuName)
            temp.Add(item)
            dicts(item.Att.MenuName) = temp
        Next
        Return dicts
    End Function
End Class

创建测试函数

Public Class MyAmCommand
    <MyAmFunctionAtt(NameOf(MyAmCommand), NameOf(测试功能))>
    Sub 测试功能(wm As WindowManager)
        MsgBox(NameOf(测试功能) + "ok")
    End Sub
End Class

修改文件,让插件随软件启动

在空白位置右键选择刚才我们开发的插件,即可达到开始的效果。

与Aveva Marine VBNET 编程系列-搭建开发框架相似的内容:

Aveva Marine VBNET 编程系列-搭建开发框架

引用的Dll Aveva.ApplicationFramework.dll Aveva.ApplicationFramework.Presentation 菜单展示效果 创建Attribute,用于反射来动态创建菜单,不用每次都去写command Public Class MyAmFunctionA

Aveva Marine VBNET 编程系列-修改程序快捷键

修改HullDesign程序的主题以及菜单项的快捷键 引用的dll文件 下面的是代码和快捷键配置文件: https://files.cnblogs.com/files/NanShengBlogs/AMShortCut.HullDesign.zip?t=1695908179&download=true

Aveva Marine VBNET 编程系列-新建图纸,创建文字

根据MarApi,创建图形文件,新建文字 Imports Aveva.ApplicationFramework.Presentation Imports Aveva.Marine.Drafting ' marAPI.dll Public Class 绘图控制

Aveva Marine VBNET 编程系列-创建曲线

显现的效果 代码实现: Public Sub 新建曲线(wm As WindowManager) Dim draftApp As New MarDrafting Dim ui As New MarUi 'Im

Aveva Marine VBNET 编程系列-封装一个类

由于AM的marapi的大部分类实现了IDisposable接口,所有避免内存过大,用了一般需要dispose下 微软官方的解释: https://learn.microsoft.com/zh-cn/dotnet/api/system.idisposable?view=net-7.0 以下是MarD

Aveva Marine VBNET 编程系列===>读取drawing explorer的第一层级 view

今天我们研究下读取drawing expolrer的第一层级:view 下面的图纸的层级目录示意图,我们今天需要获取所有的view 主要用到2个方法: 1# 获取第一个元素 MarDrafting.ElementChildFirstGet Method () 2# 获取相邻的元素 MarDrafti

Aveva Marine VBNET 编程系列====>读取drawing explorer的第2层级 Sub views

接上期的内容,此次读取view的下一层几subview 主要用到下面的方法获取view的第一个子级 一个封装的类 Public Class DrawingExpolrerEx Public Shared Function DrawingHasViews(draftApp As MarDrafting

Aveva Marine VBNET 编程系列   获取文字

此系列的教程,暂时不更新,因为没多少人愿意加入一起学习的行列,有需要学习的可以加我微信或者QQ讨论 电话:17607170146(微信同号) QQ:442024898 提取图纸中的文字, Public S

C# AVEVA MARINE 二次开发 读取分段

快速读取和筛选分段元素 [MyAmFunctionAtt(nameof(测试功能), nameof(读取分段))] public void 读取分段(WindowManager wm) { try { foreach (var item in wm.Windows) { if (item is Do

c# aveva marine 批量导出图纸到dxf格式

获取图纸数据库 查看代码 public static Dictionary