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;file=file.png" alt="" /></p>
<p>插件可以单向请求客户端接口。客户端也能够主动请求(回调)插件,进行响应的业务处理,如下图所示。
<img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=d50fc5ab36960e9a56aca6edba548a0d&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> "这里")</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>{
&quot;abstractCadType&quot;: &quot;_3d&quot;,
&quot;cadType&quot;: &quot;solidworks&quot;,
&quot;cadCommand&quot;: 101,
&quot;msgSendWay&quot;: 0,
&quot;dataModel&quot;: [
{
&quot;cadId&quot;: &quot;5049e365-a0ed-4cd0-8bc3-505597ce356a&quot;,
&quot;directoryPath&quot;: &quot;D:\\Repos\\非标CAD指导\\Kingdee.PLM.CAD.CustomPlugin\\Kingdee.PLM.CAD.CustomPlugin.Demo\\bin\\Debug\\素材&quot;,
&quot;fileName&quot;: &quot;根装配件.SLDASM&quot;,
&quot;fileType&quot;: 2
}
]
}</code></pre>
<h4>3.返回示例</h4>
<p>仅带响应的请求,才会返回结果,可以观察到,返回的data里,包含了请求时的abstractCadType、cadType、cadCommand、msgSendWay属性。
<strong>注意:返回参数统一使用JSON格式,并且含有几个通用参数,为节省篇幅,后续的详细请求文档不再阐述!</strong></p>
<pre><code>{
&quot;success&quot;: true,
&quot;message&quot;: null,
&quot;errCode&quot;: null,
&quot;data&quot;: {
&quot;dataModel&quot;: [
{
&quot;cadId&quot;: &quot;15cf6069-9eb7-4bbc-933a-953131c8b0cd&quot;,
&quot;hasBeenRecord&quot;: false
}
],
&quot;abstractCadType&quot;: &quot;_3d&quot;,
&quot;cadType&quot;: &quot;solidworks&quot;,
&quot;cadCommand&quot;: 101,
&quot;msgSendWay&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>在某些操作中,需要调起客户端提供的页面进行操作,操作并确认后才会通知插件,例如引用零件操作:插件发送指令给客户端 > 客户端打开引用零件窗口 > 用户选择零件并确认 > 客户端回调插件进行处理。回调数据也是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&lt;IPCBaseMessage&lt;object&gt;&gt;();
if (string.IsNullOrWhiteSpace(message))
return ret.Error(&quot;请求参数不能为空&quot;);
try
{
var baseModel = JsonConvert.DeserializeObject&lt;IPCBaseMessage&gt;(message);
if (baseModel == null)
{
return ret.Error(&quot;请求消息格式错误&quot;);
}
switch (baseModel.cadCommand)
{
case Common.CadCommand.AddComponent:
{
// 具体业务处理
var recvModel = JsonConvert.DeserializeObject&lt;AddComponentRequestModel&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>{
&quot;abstractCadType&quot;: &quot;_3d&quot;,
&quot;cadType&quot;: &quot;solidworks&quot;,
&quot;cadCommand&quot;: 105,
&quot;msgSendWay&quot;: 0,
&quot;dataModel&quot;: {
&quot;cadId&quot;: &quot;f3292e1e-2ff3-466f-a664-1ab8e299d6d6&quot;,
&quot;assmDirectoryPath&quot;: &quot;D:\\Repos\\非标CAD指导\\Kingdee.PLM.CAD.CustomPlugin\\Kingdee.PLM.CAD.CustomPlugin.Demo\\bin\\Debug\\素材&quot;,
&quot;assmFileName&quot;: &quot;根装配件.SLDASM&quot;,
&quot;childFileFullPath&quot;: [
&quot;D:\\Repos\\非标CAD指导\\Kingdee.PLM.CAD.CustomPlugin\\Kingdee.PLM.CAD.CustomPlugin.Demo\\bin\\Debug\\素材\\XWX0919A-XX5XT-10-1-10上连接角钢.SLDPRT&quot;
]
}
}</code></pre>