金蝶PLM CAD 集成


5. 创建一个二开插件工程Demo

<p>[TOC]</p> <h3>简介</h3> <p>我们可以按照本文档步骤,创建一个WPF Demo,并且实现自定义文档类型,以及尝试调用客户端部分简单指令等。</p> <h3>创建插件二开工程</h3> <h4>1. 系统要求</h4> <p>(1)Windows 7 SP2 或 Windows 10 或 Windows 11(推荐 Windows 10) (2)Visual Studio 2019 或 2022(简称VS),并至少安装上【.NET 桌面开发】工作负荷,及【.NET Framework 4.8 SDK】组件 (3)获取并安装最新版 PLM客户端(简称客户端) 桌面应用,版本≥1.0.6(下文有介绍下载地址)</p> <h4>2. 添加自定义CAD业务类型</h4> <p>(1)访问【金蝶云·星空 旗舰版】网址并登录,搜索“文件类型列表”,进入页面后,新增一个类型。文档类型编码即为准备二开插件的CAD软件代号,例如<strong>Solidworkds_2015</strong>、<strong>Altium_Designer_24</strong>等等,这里以<strong>JairTest</strong>为例,具体信息如图: <img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=ed6d2b7caf58f0edb575039d616bf4eb&amp;amp;file=file.png" alt="" /></p> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=5d4bc89b0b256a0709bb307409d99647&amp;amp;file=file.png" alt="" /></p> <h4>3. 获取PLM客户端及DLL库</h4> <p>(1)访问【金蝶云·星空 旗舰版】网址并登录,搜索“PLM系统参数”,进入页面后,找到SOLIDWROKS最新版的下载地址,复制地址访问下载组件压缩包并解压。 <img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=0a46deca97b7ad9412b2c84cc5fed1d7&amp;amp;file=file.png" alt="" /></p> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=d97c25518279b338cd9435e082d96a49&amp;amp;file=file.png" alt="" /></p> <p>(2)在同一个页面中,找到客户端信息的下载路径,下载最新版的PLM客户端,并且安装。安装后,填写服务地址以及登录后,即可使用。 <img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=3d93eb318ec385e09879fa65b18fa29e&amp;amp;file=file.png" alt="" /></p> <h4>4. 创建工程</h4> <p>(1)打开VS2019,创建一个WPF应用(.NET Framework),信息配置如下: &gt; 注意,二开插件(类库)的项目命名空间(namespace)必须包含“Kingdee.PLM.CAD”字符,推荐使用如下规范:{厂家代号}.Kingdee.PLM.CAD.{具体类库名}。如此处使用 <strong>Jair.Kingdee.PLM.CAD.CustomPlugin</strong> &gt; 框架:必须选择 .NET Framework 4.8</p> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=f61bb507f6c7cb373a681d8318f7dd3e&amp;amp;file=file.png" alt="" /></p> <p>(2)解压第3.1步的文档,在解决方案中,添加<strong>“Kingdee.PLM.CAD.Common.dll”</strong>和<strong>“Newtonsoft.Json.dll(该dll库也可以用Nuget包获取)”</strong>引用。</p> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=cdba99f5e175e90f09f65a61f3001bce&amp;amp;file=file.png" alt="" /></p> <p>(3)在MainWindow.xaml中,添加两个按钮【检测文档是否存在系统中】、【打开客户端文档库窗口】,并添加点击事件 <img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=38a31deff126f6b8d4a650df07300312&amp;amp;file=file.png" alt="" /></p> <p>(4)在MainWindow.cs中,添加两个变量,变量值与【第2. 添加自定义CAD业务类型】对应: <img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=538d0a1370994e0d7188c2f8efd61b23&amp;amp;file=file.png" alt="" /></p> <h4>5. 开始调用客户端API</h4> <h5>(1)检测文档是否存在系统中</h5> <p>API详细说明看这里:[检查文档是否存在](<a href="https://www.showdoc.com.cn/kingdeeplm/11558475248017260">https://www.showdoc.com.cn/kingdeeplm/11558475248017260</a> &quot;检查文档是否存在&quot;),添加按钮代码如下:</p> <pre><code>private void Button_Click(object sender, RoutedEventArgs e) { // 检测文档是否存在系统中 var checkDocs = new List&amp;lt;CheckDocExistsReqDataStruct&amp;gt;() { new CheckDocExistsReqDataStruct { cadId = Guid.NewGuid().ToString(), directoryPath = Path.GetFullPath(&amp;quot;素材&amp;quot;), fileName = &amp;quot;Test.SLDASM&amp;quot;, fileType = CadFileType.AssemblyDrawing } }; var reqModel = new CheckDocIsExistsRequestModel() { abstractCadType = abstractCadType, cadType = cadType, cadCommand = CadCommand.GetDocHasBeenRecord, dataModel = checkDocs }; var sendStr = JsonConvert.SerializeObject(reqModel); var ret = IPCClient.Instance.PostMessage&amp;lt;CheckDocIsExistsResponseModel&amp;gt;(sendStr, false); var resultJson = JsonConvert.SerializeObject(ret); Console.WriteLine(resultJson); }</code></pre> <p>返回示例Json如下:</p> <pre><code>{ &amp;quot;Data&amp;quot;: { &amp;quot;dataModel&amp;quot;: [ { &amp;quot;cadId&amp;quot;: &amp;quot;d8fe2523-a3b0-4554-9ba0-f72684b78806&amp;quot;, &amp;quot;hasBeenRecord&amp;quot;: false } ], &amp;quot;abstractCadType&amp;quot;: &amp;quot;_3d&amp;quot;, &amp;quot;cadType&amp;quot;: &amp;quot;jairtest&amp;quot;, &amp;quot;cadCommand&amp;quot;: 101, &amp;quot;msgSendWay&amp;quot;: 0 }, &amp;quot;Success&amp;quot;: true, &amp;quot;Message&amp;quot;: null, &amp;quot;ErrCode&amp;quot;: null }</code></pre> <h5>(2)打开客户端文档库窗口</h5> <p>API详细说明看这里:[打开PLM系统文档库窗口](<a href="https://www.showdoc.com.cn/kingdeeplm/11558480853311684">https://www.showdoc.com.cn/kingdeeplm/11558480853311684</a> &quot;打开PLM系统文档库窗口&quot;),添加按钮代码如下:</p> <pre><code>private void Button_Click_1(object sender, RoutedEventArgs e) { // 打开客户端模板库窗口 IPCBaseMessage reqModel = new IPCBaseMessage() { abstractCadType = abstractCadType, cadType = cadType, cadCommand = CadCommand.ShowDocumentLibrary, }; var sendStr = JsonConvert.SerializeObject(reqModel); IPCClient.Instance.SendMessage(sendStr, false); }</code></pre> <p>成功打开【从PLM中打开图纸】窗口 <img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=a25e8f666ecf5ac3091fb2c58cb49bf5&amp;amp;file=file.png" alt="" /></p> <h5>(3)注册消息服务,实现客户端回调监听</h5> <ul> <li>我们需要在自己的插件中注册消息服务,并且定义一个消息处理器。此时,用户在PLM客户端提供的窗口中进行操作时,客户端会回调给我们插件进行处理。如上面打开【从PLM中打开图纸】,选中某个图纸后,点击确认。此时客户端会下载该图纸到本地,下载完成后,即可回调(通知)到我们的插件中。</li> <li>a)注册消息服务: <pre><code>public MainWindow() { InitializeComponent(); new IPCServer(cadType).InitService(); // 注册消息服务 }</code></pre></li> <li>b)定义一个消息处理器,并打断点进行调试: <pre><code>[MessageHandler(CadType = &amp;quot;jairtest&amp;quot;)] public class MyMessageHandler : IMessageHandler { public object Execute(string message) { var ret = new Result&amp;lt;IPCBaseMessage&amp;lt;object&amp;gt;&amp;gt;(); if (string.IsNullOrWhiteSpace(message)) return ret.Error(&amp;quot;请求参数不能为空&amp;quot;); try { var baseModel = JsonConvert.DeserializeObject&amp;lt;IPCBaseMessage&amp;gt;(message); if (baseModel == null) { return ret.Error(&amp;quot;请求消息格式错误&amp;quot;); } switch (baseModel.cadCommand) { case CadCommand.OpenDocCurrentForm: { var recvModel = JsonConvert.DeserializeObject&amp;lt;OpenDocRequestModel&amp;gt;(message); break; } default: { // 其他待处理的指令 break; } } return null; } catch (Exception ex) { return ret.Error(ex.Message); } } }</code></pre></li> </ul>

页面列表

ITEM_HTML