Calling Add-ins (C#)

news2024/11/27 16:34:26

本范例展示如何通过实现 IEdmAddIn5::GetAddInInfo 和 IEdmAddIn5::OnCmd 去创建一个当用户在数据卡中点击一个按钮时被调用的Visual C# add-in程序。这个add-in在用户浏览文件时打开一个对话框. add-in 将所选文件的路径复制到 文件的数据卡。

注意: 因为 SOLIDWORKS PDM Professional 无法强制重新加载 .NET 中编写的Add-in程序。必须重新启动所有客户端计算机,以确保使用最新版本的外接程序。 


  1.   启动VS。
  2. 新建项目,选择类库。                                    
  3. 在“解决方案资源管理器”中右键单击项目名称 ,然后单击添加引用。
    1. 单击 COM 在 左侧面板,单击PDMWorks Enterprise 2019 Type Library,然后单击添加

    2. 如果需要,引入相关的程序集。
    3. 设置Interop.EdmLib的嵌入互操作类型为False。
  4. 在“解决方案资源管理器”中右击项目名称,然后单击“属性”。
    1. “应用程序>程序集信息”。                         
    2. 取消勾选“使程序集 COM 可见(M)”。                         
  5. 修改Class1.cs。这里修改类名为CallAddin.cs。
    1.  添加和创建GUID。
    2. 修改代码
using System;
using EdmLib;//添加
using System.Runtime.InteropServices;//添加

namespace Calling_Add_ins
{
    [Guid("20637265-0AAC-4730-BA59-43C4395B2D2A"),ComVisible(true)]
    public class CallAddin : IEdmAddIn5
    {
        
    }
}

  1. 实现 IEdmAddIn5::GetAddInInfo 和IEdmAddIn5::OnCmd                                                                                                                                                       ​​
    using System;
    using EdmLib;//添加
    using System.Runtime.InteropServices;//添加
    
    namespace Calling_Add_ins
    {
        [Guid("20637265-0AAC-4730-BA59-43C4395B2D2A"),ComVisible(true)]
        public class CallAddin : IEdmAddIn5
        {
            public void GetAddInInfo(ref EdmAddInInfo poInfo, IEdmVault5 poVault, IEdmCmdMgr5 poCmdMgr)
            {
                //Specify information to display in the add-in's Properties dialog box
                poInfo.mbsAddInName = "My Calling Add-ins";
                poInfo.mbsCompany = "JXEM";
                poInfo.mbsDescription = "JXEM Add-ins";
                poInfo.mlAddInVersion = 1;
                poInfo.mlRequiredVersionMajor = 5;
                poInfo.mlRequiredVersionMinor = 2;
    
                //Notify the add-in when a file data card button is clicked
                poCmdMgr.AddHook(EdmCmdType.EdmCmd_CardButton);//按钮
            }
    
            public void OnCmd(ref EdmCmd poCmd, ref Array ppoData)
            {
                //Respond only to a specific button command  仅响应特定按钮命令
                //The button command to respond to begins with "MyButton:" and ends with the name of the variable to update in the card 
                //要响应的按钮命令以"MyButton:"开头,以要在卡中更新的变量的名称结尾            
                if (poCmd.mbsComment.Substring(0, 9) == "MyButton:")    //string mbsComment;Contains name specific to EdmCmd.meCmdType.  
                {
                    //Get the name of the variable to update. 
                    string VarName = poCmd.mbsComment.Substring(9);
    
                    //Let the user select the file whose path will be copied to the card variable
                    //让用户选择路径将被复制到卡变量的文件
    
                    //EdmVault5:PDM库  mpoVault:指向库的指针
                    EdmVault5 vault = (EdmVault5)poCmd.mpoVault;
    
                    //IEdmStrLst5:允许您访问任意字符串的列表。
                    //BrowseForFile:显示“打开”或“另存为”对话框,用户可以在其中单击一个或多个文件。
                    IEdmStrLst5 PathList = vault.BrowseForFile(poCmd.mlParentWnd, (int)EdmBrowseFlag.EdmBws_ForOpen + (int)EdmBrowseFlag.EdmBws_PermitVaultFiles, "", "", "", "", "Select File for " + VarName);
    
                    if ((PathList != null))
                    {
                        //GetNext	Gets the next string in this list.  
                        //GetHeadPosition	Starts an enumeration of the strings in this list.  
                        string path = PathList.GetNext(PathList.GetHeadPosition());
    
                        //Store the path in the card variable 
                        IEdmEnumeratorVariable5 vars = (IEdmEnumeratorVariable5)poCmd.mpoExtra; //mpoExtra:The type of interface returned depends on the type of command or hook. See EdmCmdData for more information.
                        object VariantPath = path;
                        vars.SetVar(VarName, "", VariantPath);
                    }
                }
                return;
            }
        }
    }
    
  2. ​单击“生成”>“生成解决方案” ,生成Add-in。
  3. 安装生成的Add-in。
    1. 打开PDM 管理工作。
    2. 登录。
    3. 在插件中添加新插件。
  4. 卡 -> 文件卡 -> Text Card -> 添加按钮 -> 点击按钮 -> 命令类型:运行插件 -> 插件名称:MyButton:Title -> 保存 
  5.  在库中检出txt文件,浏览其数据卡,点击按钮

  6. 选择文件

     

    备注

    本例中,使用 IEdmEnumeratorVariable5::SetVar 设置变量值。你也可以使用IEdmEnumeratorVariable5::GetVar 读变量值.
    使用类似按钮处理程序,您还可以:

    通过检查包含 IEdmStrLst5 文件接口的 EdmCmdData::mpoExtra 变量来检索文件中配置(configurations)、布局(layouts)或两者的数量。

        切换活动配置.

        使用 EdmCmdData 的成员将焦点设置为某个控件。

        在按钮通过将 EdmCmdData::mlLongData1变量设置为 EdmCardFlag 常量后,自动关闭数据卡。

打包:https://download.csdn.net/download/hd51cc/87887323

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/628982.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【图书推荐 | 12】前端系列

【赠书活动第十二期 】 图书推荐 本期书籍:前端系列 图书列表: Vue.js核心技术解析Nuxt.js实战Nuxt.js Web开发实战HTML5CSS 从入门到精通Flutter2 开发实例精解Electron项目开发实战 Vue.js核心技术解析 Nuxt.js实战 Nuxt.js Web开发实战 HTML5CSS 从入…

算法与数据结构基数排序

一、基数排序算法示意图 下方的基数排序算法的实现是利用“桶”来实现的,首先我们创建10个桶,然后按照基数入桶,基数的取值是从数字的低位到高位以此取值。我们还是以[62, 88, 58, 47, 62, 35, 73, 51, 99, 37, 93]这个序列为例,…

PINN学习与实验之拟合sin(x)

首先给出数学上的知识。 1. 2. 3. 其次给出PINN最基础的理解与应用说明。 1.PINN中的MLP多层感知机的作用? 答:目的是用来拟合出我们需要的那个 常微分方程,即函数逼近器。 2.PINN中物理信息的作用? 答:用于约束MLP反向…

安利一个我喜欢的博主(鱼皮)的项目----鱼聪明AI

大家好,我是鱼皮的粉丝。今天给大家介绍下他们公司的新朋友 —— 鱼聪明! 是不是看上去就像个大聪明哈哈,这其实是他们公司的吉祥物。当然啦,她以后会经常出现在他们的产品家族和周边中~ 比如他们最新上线的 AI 助手网站 —— 鱼…

自动化测试真的会取代手工测试?说这话的人肯定不是干测试的~

在测试行业,一个一直被讨论的问题就是:手工测试没有前途,自动化测试会取代手工测试? 首先说结论:自动化测试不会取代手工测试,这完全是两个维度的事情。为什么不会呢?我们需要从本源上说起。 …

计算机网络期末考试学习记录

1.如果特别想把一个知识点给别人讲懂的话,那自己也会受益很多。 2.我是先讲给自己的,因为我本人也有太多疑问而不问。 3.答案是我自己做出来的,仅供参考。 1.路由器因目的不可达而丢弃的普通IP分组,会向源主机发送(C)报文来报告…

【每日挠头算法(4)】字符串相加|字符串相乘

欢迎~ 一、字符串相加思路:模拟竖式加法具体代码如下: 二、字符串相乘思路:模拟竖式乘法具体代码如下: 总结 一、字符串相加 点我直达~ 思路:模拟竖式加法 1.将两个字符串从右往左开始进行相加,使用一个变量ans表示进…

关于枚举常量手误带来的错误

前言 记录2020年5月30日,肯哥在群里面分享的一个因为手误带来的bug。 问题描述 肯哥原话: 又到了每天的open话题讨论时刻,一起在摸鱼中学点东西,今天我们来聊一个话题:一不小心的手误,代码有时能跑&#xf…

Python集合学习笔记

列表、字典、集合都是可变类型的序列. 集合是没有value的字典s {2, 3, 4, 5, 5, 5, 5, 6, 7, 7} print(s) # {2, 3, 4, 5, 6, 7} 集合中没有相同的元素,元素不能重复print() s1 set(range(6)) print(s1) # {0, 1, 2, 3, 4, 5} lis [2, 5, 8, 5, 8, 4, 9] s2 s…

搜索与图论(acwing算法基础)

文章目录 DFS排列数字n皇后 BFS走迷宫 拓扑序列单链表树与图的深度优先搜索模拟队列有向图的拓扑序列 bellman-ford有边数限制的最短路 spfaspfa求最短路spfa判断负环 FloydFloyd求最短路 PrimPrim算法求最小生成树 KruskalKruskal算法求最小生成树 染色法判定二分图染色法判定…

rabbitmq记录(服务器重启后,RabbitMQ用户丢失)

1.docker运行rabbitmq docker run -d --hostname my-rabbit --name myrabbit -p 15672:15672 -p 5672:5672 rabbitmq 2.进入rabbitmq容器 docker exec -it 3776394dd2b3 /bin/bash 3.开启rabbitmq可视化界面管理 rabbitmq-plugins enable rabbitmq_management 4.添加新用户…

RabbitMq-高级

参考:https://blog.csdn.net/dingd1234/article/details/125032383 1 TTL TTL QUEUE 声明args TTL MESSAGE postmessage中设置 区别:过期消息会直接删除消息,过期队列若配置死信队列会移到死信队列 ps:同时配置两个已小的为准 2…

2. Redis持久化、主从哨兵架构详解

分布式缓存技术Redis 1. Redis持久化1.1 RDB快照(snapshot)1.1.1 bgsave的写时复制(COW)机制 本文是按照自己的理解进行笔记总结,如有不正确的地方,还望大佬多多指点纠正,勿喷。 课程内容: 1、RDB、AOF及混合持久化详解 2、并行…

css基础一:说说你对CSS盒子模型的理解?

一、是什么 当对一个文档进行布局(layout)的时候,浏览器的渲染引擎会根据标准之一的 CSS 基础框盒模型(CSS basic box model),将所有元素表示为一个个矩形的盒子(box) 一个盒子由四…

认识HttpServletRequest和HttpServletResponse

hi,大家好,上一期我们认识了HttpServlet,这一期我们来认识一下HttpServletRequest和HttpServletResponse 🚀HttpServletRequest 💚1.核心方法介绍 💚2.代码举例展示 🚀HttpServletResponse 💚1.核心方法展示 &a…

STC12读取内部ID方法介绍

STC12读取内部ID方法介绍 🔖这里以STC12LE5A60S2为例,从STC12手册的第一章,1.10小结可以找到相关的ID相关的信息。这个信息主要是用于程序加密或产品销售管理等方面。🌿STC12LE5A60S2系统板: https://oshwhub.com/pers…

javaScript蓝桥杯----阅读吧

目录 一、介绍二、准备三、目标四、代码五、完成 一、介绍 “读万卷书,行万里路”,无论你现在贫穷或富有,身和心一定要有一个在路上。那么,在快节奏的今天,人们是如何利用碎片化的时间去阅读的呢?没错&…

【MySQL高级篇笔记-事务基础知识(中) 】

此笔记为尚硅谷MySQL高级篇部分内容 目录 一、数据库事务概述 1、存储引擎支持情况 2、基本概念 3、事务的ACID特性 1.原子性(atomicity) 2.一致性(consistency) 3.隔离型(isolation) 4.持久性&a…

卷积编码和维特比译码

文章目录 卷积编码维特比译码 卷积编码 卷积码是一种非分组码,通常适用于前向纠错。在分组码中,编码器产生的 n 个码元的一个码组,完全决定于这段时间中 k 比特输入信息。这个码组中的监督位仅监督本码组中 k 个信息位。卷积码在编码时虽然也…

Calico介绍

Calico 是一个基于 BGP 的纯三层的网络方案,与 OpenStack 、Kubernetes 、AWS 、GCE 等云平台都能够良好地集成 。 Calico 在每个计算节点都利用 Linux Kernel 实现了一个高效的 vRouter 来负责数据转发 。每个 vRouter 都通过 BGP 协议把在本节点上运行的容器的路由…