金蝶PLM CAD 集成


1. 集成前必读

<p>[TOC]</p> <h3>简介</h3> <p>本文档仅提供金蝶云·星空 旗舰版产品-PLM客户端API及相关开发工具的基本介绍,您可以借助它们实现对金蝶官方没有集成的CAD软件进行插件二次开发,从而实现您的客制化需求。我们推荐使用C#开发基于PLM客户端的附加插件。我们将不断改进API,使其更加支持我们的开发者基于PLM客户端API开发强大的CAD插件。</p> <h4>1.通讯方式</h4> <p>第三方插件(简称插件)可以与PLM客户端(简称客户端)之间使用IPC管道进行通讯,可以引用PLM客户端的 <code>Kingdee.PLM.CAD.Common.dll</code> 库,即可快速向本地的客户端发起请求,如下图 <img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=e3d0a1450e390e03c98fea28d21ffff0&amp;amp;file=file.png" alt="" /></p> <p>插件可以单向请求客户端接口。客户端也能够主动请求(回调)插件,进行响应的业务处理,如下图所示。 <img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=d50fc5ab36960e9a56aca6edba548a0d&amp;amp;file=file.png" alt="" /></p> <h4>2.项目命名空间约束</h4> <ul> <li>二开插件(类库)的项目命名空间(namespace)必须包含“Kingdee.PLM.CAD”字符,推荐使用如下规范:{厂家代号}.Kingdee.PLM.CAD.{具体类库名}</li> <li>如厂家名称为ABC,类库名为TestPlugin,那么完整命名空间为:ABC.Kingdee.PLM.CAD.TestPlugin</li> </ul> <h4>3. .NET Demo</h4> <ul> <li>完成WPF程序Demo地址(.NET):</li> </ul> <hr /> <h3>插件单向请求客户端</h3> <ul> <li> <p>带响应:<code>IPCClient.Instance.PostMessage</code></p> </li> <li>无响应:<code>IPCClient.Instance.SendMessage</code></li> </ul> <h4>1.请求参数说明(重要)</h4> <p><strong>注意:请求参数统一使用JSON格式,并且含有几个通用参数,为节省篇幅,后续的详细请求文档不再阐述!</strong></p> <table> <thead> <tr> <th style="text-align: left;">参数名</th> <th style="text-align: left;">必填</th> <th style="text-align: left;">类型</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td style="text-align: left;">cadType</td> <td style="text-align: left;">是</td> <td style="text-align: left;">string</td> <td>cad枚举类型(全小写),如:solidworks/creo,对应系统的文件类型</td> </tr> <tr> <td style="text-align: left;">abstractCadType</td> <td style="text-align: left;">否</td> <td style="text-align: left;">string</td> <td>cad抽象类型(全小写),可选值:NoSet/_3d/_2d/_ele,相同类型会走相同的通用业务</td> </tr> <tr> <td style="text-align: left;">cadCommand</td> <td style="text-align: left;">是</td> <td style="text-align: left;">int</td> <td>操作命令代码,详见[这里](<a href="https://www.showdoc.com.cn/kingdeeplm/11558475336472955">https://www.showdoc.com.cn/kingdeeplm/11558475336472955</a> &quot;这里&quot;)</td> </tr> <tr> <td style="text-align: left;">msgSendWay</td> <td style="text-align: left;">是</td> <td style="text-align: left;">int</td> <td>0 常规;1 自动轮训。默认0</td> </tr> <tr> <td style="text-align: left;">dataModel</td> <td style="text-align: left;">是</td> <td style="text-align: left;">泛型</td> <td>数据对象模型,在具体请求文档中,进行具体说明,例如object,array[object]</td> </tr> </tbody> </table> <h4>2.完整请求示例</h4> <p>这里演示简单的【查询文档是否存在系统里】接口</p> <pre><code>{ &amp;quot;abstractCadType&amp;quot;: &amp;quot;_3d&amp;quot;, &amp;quot;cadType&amp;quot;: &amp;quot;solidworks&amp;quot;, &amp;quot;cadCommand&amp;quot;: 101, &amp;quot;msgSendWay&amp;quot;: 0, &amp;quot;dataModel&amp;quot;: [ { &amp;quot;cadId&amp;quot;: &amp;quot;5049e365-a0ed-4cd0-8bc3-505597ce356a&amp;quot;, &amp;quot;directoryPath&amp;quot;: &amp;quot;D:\\Repos\\非标CAD指导\\Kingdee.PLM.CAD.CustomPlugin\\Kingdee.PLM.CAD.CustomPlugin.Demo\\bin\\Debug\\素材&amp;quot;, &amp;quot;fileName&amp;quot;: &amp;quot;根装配件.SLDASM&amp;quot;, &amp;quot;fileType&amp;quot;: 2 } ] }</code></pre> <h4>3.返回示例</h4> <p>仅带响应的请求,才会返回结果,可以观察到,返回的data里,包含了请求时的abstractCadType、cadType、cadCommand、msgSendWay属性。 <strong>注意:返回参数统一使用JSON格式,并且含有几个通用参数,为节省篇幅,后续的详细请求文档不再阐述!</strong></p> <pre><code>{ &amp;quot;success&amp;quot;: true, &amp;quot;message&amp;quot;: null, &amp;quot;errCode&amp;quot;: null, &amp;quot;data&amp;quot;: { &amp;quot;dataModel&amp;quot;: [ { &amp;quot;cadId&amp;quot;: &amp;quot;15cf6069-9eb7-4bbc-933a-953131c8b0cd&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;solidworks&amp;quot;, &amp;quot;cadCommand&amp;quot;: 101, &amp;quot;msgSendWay&amp;quot;: 0 } }</code></pre> <h4>4.返回参数说明</h4> <table> <thead> <tr> <th style="text-align: left;">参数名</th> <th style="text-align: left;">类型</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td style="text-align: left;">success</td> <td style="text-align: left;">bool</td> <td>是否成功</td> </tr> <tr> <td style="text-align: left;">message</td> <td style="text-align: left;">string</td> <td>错误消息</td> </tr> <tr> <td style="text-align: left;">errCode</td> <td style="text-align: left;">string</td> <td>错误代码</td> </tr> <tr> <td style="text-align: left;">data</td> <td style="text-align: left;">泛型</td> <td>在具体请求文档中,进行具体说明,例如object,array[object]</td> </tr> </tbody> </table> <hr /> <h3>客户端操作后回调插件</h3> <p>在某些操作中,需要调起客户端提供的页面进行操作,操作并确认后才会通知插件,例如引用零件操作:插件发送指令给客户端 &gt; 客户端打开引用零件窗口 &gt; 用户选择零件并确认 &gt; 客户端回调插件进行处理。回调数据也是JSON格式。</p> <h4>1. 注册消息服务</h4> <p>该消息服务是后台线程,因此可以在进程启动时调用即可,例如WPF的MainWindow构造中实现: <strong>注意:客户端只会为指定CAD类型最多建立一个IPC管道,假设插件A、B都是注册solidworks,并且A先运行。那么客户端回调插件时,只有A能接收到回调!</strong></p> <pre><code> public MainWindow() { InitializeComponent(); new IPCServer(CAD.Common.CadType.solidworks).InitService(); // 注册消息服务 }</code></pre> <h4>2. 实现消息处理接口</h4> <p>创建一个自定义的消息处理器并实现下述接口,然后添加与第1步相同的CAD类型的属性,在Execute方法中反序列化消息,并根据操作指令进行不同的自定义业务处理。 接口:<code>Kingdee.PLM.CAD.Common.IPCManager.IMessageHandler</code> 示例代码如下:</p> <pre><code>using Kingdee.PLM.CAD.Common.IPCManager; using Kingdee.PLM.CAD.Common.Model; using Kingdee.PLM.CAD.Common.Model.CommunicationModel; using Newtonsoft.Json; using System; namespace Kingdee.PLM.CAD.CustomPlugin.Demo { [MessageHandler(CadType = CAD.Common.CadType.solidworks)] 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 Common.CadCommand.AddComponent: { // 具体业务处理 var recvModel = JsonConvert.DeserializeObject&amp;lt;AddComponentRequestModel&amp;gt;(message); } break; } return null; } catch (Exception ex) { return ret.Error(ex.Message); } } } }</code></pre> <h4>3. 返回参数说明及示例</h4> <p>返回的数据中没有在外面多包裹一层,而且包含了请求时的abstractCadType、cadType、cadCommand、msgSendWay属性,因此只需要关注dataModel类型即可,其数据类型也会在具体的接口中说明</p> <pre><code>{ &amp;quot;abstractCadType&amp;quot;: &amp;quot;_3d&amp;quot;, &amp;quot;cadType&amp;quot;: &amp;quot;solidworks&amp;quot;, &amp;quot;cadCommand&amp;quot;: 105, &amp;quot;msgSendWay&amp;quot;: 0, &amp;quot;dataModel&amp;quot;: { &amp;quot;cadId&amp;quot;: &amp;quot;f3292e1e-2ff3-466f-a664-1ab8e299d6d6&amp;quot;, &amp;quot;assmDirectoryPath&amp;quot;: &amp;quot;D:\\Repos\\非标CAD指导\\Kingdee.PLM.CAD.CustomPlugin\\Kingdee.PLM.CAD.CustomPlugin.Demo\\bin\\Debug\\素材&amp;quot;, &amp;quot;assmFileName&amp;quot;: &amp;quot;根装配件.SLDASM&amp;quot;, &amp;quot;childFileFullPath&amp;quot;: [ &amp;quot;D:\\Repos\\非标CAD指导\\Kingdee.PLM.CAD.CustomPlugin\\Kingdee.PLM.CAD.CustomPlugin.Demo\\bin\\Debug\\素材\\XWX0919A-XX5XT-10-1-10上连接角钢.SLDPRT&amp;quot; ] } }</code></pre>

页面列表

ITEM_HTML