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;file=file.png" alt="" /></p>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=5d4bc89b0b256a0709bb307409d99647&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;file=file.png" alt="" /></p>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=d97c25518279b338cd9435e082d96a49&amp;file=file.png" alt="" /></p>
<p>(2)在同一个页面中,找到客户端信息的下载路径,下载最新版的PLM客户端,并且安装。安装后,填写服务地址以及登录后,即可使用。
<img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=3d93eb318ec385e09879fa65b18fa29e&amp;file=file.png" alt="" /></p>
<h4>4. 创建工程</h4>
<p>(1)打开VS2019,创建一个WPF应用(.NET Framework),信息配置如下:
> 注意,二开插件(类库)的项目命名空间(namespace)必须包含“Kingdee.PLM.CAD”字符,推荐使用如下规范:{厂家代号}.Kingdee.PLM.CAD.{具体类库名}。如此处使用 <strong>Jair.Kingdee.PLM.CAD.CustomPlugin</strong>
> 框架:必须选择 .NET Framework 4.8</p>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=f61bb507f6c7cb373a681d8318f7dd3e&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;file=file.png" alt="" /></p>
<p>(3)在MainWindow.xaml中,添加两个按钮【检测文档是否存在系统中】、【打开客户端文档库窗口】,并添加点击事件
<img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=38a31deff126f6b8d4a650df07300312&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;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> "检查文档是否存在"),添加按钮代码如下:</p>
<pre><code>private void Button_Click(object sender, RoutedEventArgs e)
{
// 检测文档是否存在系统中
var checkDocs = new List&lt;CheckDocExistsReqDataStruct&gt;()
{
new CheckDocExistsReqDataStruct
{
cadId = Guid.NewGuid().ToString(),
directoryPath = Path.GetFullPath(&quot;素材&quot;),
fileName = &quot;Test.SLDASM&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&lt;CheckDocIsExistsResponseModel&gt;(sendStr, false);
var resultJson = JsonConvert.SerializeObject(ret);
Console.WriteLine(resultJson);
}</code></pre>
<p>返回示例Json如下:</p>
<pre><code>{
&quot;Data&quot;: {
&quot;dataModel&quot;: [
{
&quot;cadId&quot;: &quot;d8fe2523-a3b0-4554-9ba0-f72684b78806&quot;,
&quot;hasBeenRecord&quot;: false
}
],
&quot;abstractCadType&quot;: &quot;_3d&quot;,
&quot;cadType&quot;: &quot;jairtest&quot;,
&quot;cadCommand&quot;: 101,
&quot;msgSendWay&quot;: 0
},
&quot;Success&quot;: true,
&quot;Message&quot;: null,
&quot;ErrCode&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> "打开PLM系统文档库窗口"),添加按钮代码如下:</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;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 = &quot;jairtest&quot;)]
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 CadCommand.OpenDocCurrentForm:
{
var recvModel = JsonConvert.DeserializeObject&lt;OpenDocRequestModel&gt;(message);
break;
}
default:
{
// 其他待处理的指令
break;
}
}
return null;
}
catch (Exception ex)
{
return ret.Error(ex.Message);
}
}
}</code></pre></li>
</ul>