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

博客 分享
0 213
优雅殿下
优雅殿下 2022-02-26 17:55:50
悬赏:0 积分 收藏

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

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

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

1 增加脚本插件

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

<Fluent:RibbonTabItem xmlns:Fluent="urn:fluent-ribbon" x:             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/

posted @ 2022-02-26 17:02 AnyCAD 阅读(0) 评论(0) 编辑 收藏 举报
回帖
    优雅殿下

    优雅殿下 (王者 段位)

    2018 积分 (2)粉丝 (47)源码

    小小码农,大大世界

     

    温馨提示

    亦奇源码

    最新会员