惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
Docker
F
Fortinet All Blogs
爱范儿
爱范儿
博客园 - Franky
MyScale Blog
MyScale Blog
罗磊的独立博客
博客园 - 三生石上(FineUI控件)
B
Blog
P
Proofpoint News Feed
IT之家
IT之家
宝玉的分享
宝玉的分享
D
DataBreaches.Net
S
SegmentFault 最新的问题
Microsoft Azure Blog
Microsoft Azure Blog
GbyAI
GbyAI
M
MIT News - Artificial intelligence
L
LangChain Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
月光博客
月光博客
雷峰网
雷峰网
Stack Overflow Blog
Stack Overflow Blog
量子位
V
V2EX
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻

博客园 - AnyCAD

ACIS SAT 文件格式详解及其解析 基于.NET开发STEP三维模型浏览器 【源码】蚁群算法TSP问题可视化 Python下的三维建模和可视化 .NET8:快速集成Rapid.NET三维控件 AnyCAD程序无法启动的问题解决方法 基于AvaloniaUI开发跨平台.NET三维应用:环境搭建 基于.NET三维控件的个性化管道软件开发 .NET6: 开发基于WPF的摩登三维工业软件 (10) - 机器人 .NET6: 开发基于WPF的摩登三维工业软件 (8) - MVVM .NET6: 开发基于WPF的摩登三维工业软件 (2) .NET6: 开发基于WPF的摩登三维工业软件 .NET6: 三分钟搭建WPF三维应用 十行代码搭建基于.NET6三维应用程序 基于.NET的机械运动模拟应用开发 Linux下基于.NET5开发CAX应用 .NET5下的三维应用程序开发 本地Nuget包管理 基于.NET实现Matlab备用方案
.NET6: 开发基于WPF的摩登三维工业软件 (7)
AnyCAD · 2022-02-26 · via 博客园 - AnyCAD

做为一个摩登的工业软件,提供可编程的脚本能力是必不可少的能力。脚本既可以方便用户进行二次开发,也对方便对程序进行自动化测试。本文将结合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/