做为一个摩登的工业软件,提供可编程的脚本能力是必不可少的能力。脚本既可以方便用户进行二次开发,也对方便对程序进行自动化测试。本文将结合AnyCAD对Python脚本支持的能力和WPF快速开发带脚本编辑器的CAD软件。

1 增加脚本插件

创建一个WPF控件项目,名为Rapid.ScriptPy.Plugin。参照《开发基于WPF的摩登三维工业软件 (6)》一文添加ScriptRibbonTab,并增加运行脚本按钮。

<Fluent:RibbonTabItem xmlns:Fluent="urn:fluent-ribbon" x:Class="Rapid.ScriptPy.Plugin.UI.ScriptRibbonTab"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Rapid.ScriptPy.Plugin.UI"
mc:Ignorable="d"
Header="脚本"
d:DesignHeight="100" d:DesignWidth="400">
<Fluent:RibbonGroupBox Header="基本体" IsLauncherVisible="False" Margin="7,0,0,0">
<Fluent:Button Header="运行" Size="Large" Command="{x:Static local:ScriptRibbonTab.ExecuteCommand}"
CommandParameter="runPy" Margin="0,0,7,0"/>
</Fluent:RibbonGroupBox>
</Fluent:RibbonTabItem>
namespace Rapid.ScriptPy.Plugin.UI
{
/// <summary>
/// ScriptRibbonTab.xaml 的交互逻辑
/// </summary>
public partial class ScriptRibbonTab
{
public static readonly RoutedCommand ExecuteCommand = new("Rapid.ScriptPy", typeof(ScriptRibbonTab)); public ScriptRibbonTab()
{
InitializeComponent(); CommandBindings.Add(new CommandBinding(ExecuteCommand, OnExecuteCommand));
} private void OnExecuteCommand(object sender, ExecutedRoutedEventArgs e)
{ }
}
}

2 脚本编辑器

基于WPF的自带语法高亮的代码编辑器很多,本文使用AvalonEdit作为Python代码编辑控件。

2.1 添加程序集

在nuget.org搜索AvalonEdit, 为Rapid.CAX和Rapid.ScriptPy.Plugin增加程序集引用:

2.2 添加编辑器控件

在MainWindow.xaml中三维控件显示窗口后增加脚本编辑器:

<ad:LayoutPanel Orientation="Vertical">
<ad:LayoutDocumentPane IsMaximized="True">
<ad:LayoutDocument Title="Python脚本" CanClose="False">
<!--Script Editor-->
<avalonEdit:TextEditor
xmlns:avalonEdit="http://icsharpcode.net/sharpdevelop/avalonedit"
Name="textEditor"
SyntaxHighlighting="Python"
FontFamily="Consolas"
FontSize="12pt" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"/>
</ad:LayoutDocument>
</ad:LayoutDocumentPane>
</ad:LayoutPanel>

编译并运行:

可以看到,我们的程序轻轻松松就具备了Python语法高亮的能力。

当然AvalonEdit也具备提示、代码块折叠等高级功能。

3 集成脚本

我们的目标是在Rapid.ScriptPy.Plugin中运行脚本,首先需要为MainWindow暴露获取TextEditor的方法:

   public partial class MainWindow
{
...
public ICSharpCode.AvalonEdit.TextEditor GetTextEditor()
{
return this.textEditor;
}
...
}

响应运行命令:

    public partial class ScriptRibbonTab
{
//...
private void OnExecuteCommand(object sender, ExecutedRoutedEventArgs e)
{
switch (e.Parameter.ToString())
{
case "runPy":
{
var textEditor = MainWindow.Instance()?.GetTextEditor();
if(textEditor?.Text?.Length > 0)
{
AnyCAD.Py.PyScript.Instance().Run(textEditor?.Text);
}
}
break;
}
}
}

使用AnyCAD.Py.PyScript.Instance().Run(content)可以直接运行脚本内容。AnyCAD.Py.PyScript.Instance().RunFile(filePath)可以运行文件内的脚本。

编译运行,测试一下:

box = AnyCAD.ShapeBuilder.MakeBox(AnyCAD.GAx2(), 1,1,1)
theViewer.ShowTopoShape(box, None)
theViewer.RequestUpdate(AnyCAD.EnumUpdateFlags_Scene)

4 总结

从最近的编程语言排行榜来看,Python语言高居榜首。为程序增加Python脚本支持,可以大大降低二次开发的门槛。基于AnyCAD开放的Python API,可以方便地使用Python脚本来创建模型、分析模型。

AvalonEdit是一个非常棒的代码编辑控件,我们后续可以进一步完善智能提示、代码块折叠等高级功能,提供用户体验。

本文相关代码:https://gitee.com/anycad/RapidCAX/tree/new-ui/

5 相关链接

[1] AvalonEdit: http://avalonedit.net/documentation/

[2] .NET6: 开发基于WPF的摩登三维工业软件 (6)

[3] .NET6: 开发基于WPF的摩登三维工业软件 (5)

[4] .NET6: 开发基于WPF的摩登三维工业软件 (4)

[5] .NET6: 开发基于WPF的摩登三维工业软件 (3)

[6] .NET6: 开发基于WPF的摩登三维工业软件 (2)

[7] .NET6: 开发基于WPF的摩登三维工业软件 (1)

[8] 本文代码gitee/anycad/RapidCAX/

.NET6: 开发基于WPF的摩登三维工业软件 (7)的更多相关文章

  1. .NET6: 开发基于WPF的摩登三维工业软件 (2)

    在<.NET6: 开发基于WPF的摩登三维工业软件 (1)>我们创建了一个"毛坯"界面,距离摩登还差一段距离.本文将对上一阶段的成果进行深化,实现当下流行的暗黑风格UI ...

  2. .NET6: 开发基于WPF的摩登三维工业软件

    MS Office和VisualStudio一直引领着桌面应用的时尚潮流,大型的工业软件一般都会紧跟潮流,搭配着Ribbon和DockPanel风格的界面.本文将介绍WPF下两个轻量级的Ribbon和 ...

  3. .NET6: 开发基于WPF的摩登三维工业软件 (8) - MVVM

    基于WPF开发界面的一个很大优势是可以方便地基于MVVM设计模式开发应用.本文从应用的角度基于MVVM实现参数化管材的创建界面. 1 MVVM MVVM是Model-View-ViewModel的简写 ...

  4. .NET6: 开发基于WPF的摩登三维工业软件 (10) - 机器人

    基于前文介绍的Ribbon界面.插件化.MVVM模式等内容,我们搭建了一个软件雏形.本文将综合之前的内容在RapidCAX框架中集成Robot组件,实现一个简单的机器人正向模拟模块. 1 目标 基于M ...

  5. 封装:简要介绍自定义开发基于WPF的MVC框架

    原文:封装:简要介绍自定义开发基于WPF的MVC框架 一.目的:在使用Asp.net Core时,深感MVC框架作为页面跳转数据处理的方便,但WPF中似乎没有现成的MVC框架,由此自定义开发一套MVC ...

  6. (转)基于 WPF + Modern UI 的 公司OA小助手 开发总结

    原文地址:http://www.cnblogs.com/rainlam163/p/3365181.html 前言: 距离上一篇博客,整整一个月的时间了.人不能懒下来,必须有个阶段性的总结,算是对我这个 ...

  7. 基于 WPF + Modern UI 的 公司OA小助手 开发总结

    前言: 距离上一篇博客,整整一个月的时间了.人不能懒下来,必须有个阶段性的总结,算是对我这个阶段的一个反思.人只有在总结的过程中才会发现自己的不足. 公司每天都要在OA系统上上班点击签到,下班点击签退 ...

  8. 【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇二:基于OneNote难点突破和批量识别

    篇一:WPF常用知识以及本项目设计总结:http://www.cnblogs.com/baiboy/p/wpf.html 篇二:基于OneNote难点突破和批量识别:http://www.cnblog ...

  9. 快速开发基于 HTML5 网络拓扑图应用

    采用 HT 开发网络拓扑图非常容易,例如<入门手册>的第一个小例子麻雀虽小五脏俱全:http://www.hightopo.com/guide/guide/core/beginners/e ...

随机推荐

  1. 《剑指offer》面试题53 - I. 在排序数组中查找数字 I

    问题描述 统计一个数字在排序数组中出现的次数. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 示例 2: 输入: nums = [5,7,7,8, ...

  2. Solon Web 开发,七、视图模板与Mvc注解

    Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域 ...

  3. Java的八大基本数据类型

    Java的八大基本数据类型 前言 Bit是计算机存储数据的基本单元,bit叫做位,也被称作比特位. Byte意为字节,1Byte=1字节,一字节可以存储八个二进制位的数字, 即为1Byte=8bit. ...

  4. 【get√】golang新手理解了一点点gin框架的中间件

    1.通过use()来使用多个中间件 router := gin.New() router.Use( middleware1, middleware2) 2.中间件的典型实现 func Logger() ...

  5. WebGPU图形编程(4):构建一个彩色的正方形<学习引自徐博士教程>

    本节我们来复原一个彩色的正方形,前提告知,本节的shaders和main的代码从结构上有调整,我会更加详细的描述每行的代码意思: 源代码下载地址:https://github.com/jack1232 ...

  6. golang中的标准库IO操作

    参考链接 输入输出的底层原理 终端其实是一个文件,相关实例如下: os.Stdin:标准输入的文件实例,类型为*File os.Stdout:标准输出的文件实例,类型为*File os.Stderr: ...

  7. C++ 反汇编:关于Switch语句的优化措施

    流程控制语句是C语言中最基本的判断语句,通常我们可以使用IF来构建多分支结构,但同样可以使用Switch语句构建,Switch语句针对多分支的优化措施有4种形式,分别是,IF-ELSE优化,有序线性优 ...

  8. MapperScan注解 放在启动器上?

    package com.aaa.zxf; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boo ...

  9. springboot 修改关闭banner的方法

    一.修改banner. 1.1 替换banner: 需要在resources(classpath)目录中创建文件 banner.txt 1.2 上图   banner.txt 里面可以使用文字,也可以 ...

  10. docker容器编排 (4)

    容器编排 我们的项目可能会使用了多个容器,容器多了之后管理容器的工作就会变得麻烦.如果要对多个容器进行自动配置使得容器可以相互协作甚至实现复杂的调度,这就需要进行容器编排.Docker原生对容器编排的 ...