首页 > 其他分享 >基于.NET三维控件的个性化管道软件开发

基于.NET三维控件的个性化管道软件开发

时间:2022-11-28 09:46:34浏览次数:64  
标签:控件 nameof 软件开发 get value public Position NET Model

1 简介

管道广泛用于化工、工厂、建筑、市政等方面,关系到国计民生。虽然管道设计软件种类繁多,有的也非常强大(然而也非常昂贵),但也并不能完全满足个性化需要。 如何快速开发一款满足自己需求的三维管道设计软件?本文提供一种基于AnyCAD .NET SDK的开发解决方案,不妨一试。


 

2 方案

《.NET6: 开发基于WPF的摩登三维工业软件》系列提供了一种插件式的开发工业软件的框架(源码详见:https://gitee.com/anycad/RapidCAX )。本案例基于该框架开发。

整体上采用MVVM模式,以直管为例,整体架构如下:

 

 

注:上述架构在《.NET6: 开发基于WPF的摩登三维工业软件》系列有详细说明。

3 实现

本案例中,管道由直管和弯管组成,两种的参数不一样,因此需要按照不同的类型来处理。由于篇幅所限,此处以直管为例的MVVM架构实现。

3.1 Model实现

    // 定义管子的参数
    public class PipeModel : ElementModel
    {
        public GPnt Position = new GPnt();
        public GDir Direction = new GDir();
        public double Thickness = 2;
        public double InnerRadius = 5;
        public double Length = 100;
        public PipeModel()
        {
        }

        // 根据参数创建几何
        public TopoShape CreateShape()
        {
           return ShapeBuilder.MakeTube(Position, Direction, InnerRadius, Thickness, Length);
        }
    }
    
    //参数化机制实现
    class PipeSchema : ElementSchema
    {
        public PipeSchema()
            : base(nameof(PipeModel))
        {
            this.SetTitle("管");
        }

        public override ElementModel CreateModel()
        {
            return new PipeModel();
        }

        public override Element OnCreateInstance()
        {
            return new ShapeInstance();
        }

        public override bool OnParameterChanged(Document document, Element instance, ParameterDict parameters)
        {
            var element = ShapeInstance.Cast(instance);
            if (element == null)
                return false;

            PipeModel model = new PipeModel();
            model.Load(parameters);

            var shape = model.CreateShape();

            element.SetShape(shape);

            return true;
        }
    }

3.2 ViewModel实现

   internal class PipeViewModel : ElementViewModel
    {        
        public PipeModel Model { get { return (PipeModel)_Model; } }
        public PipeViewModel(Element model, Document doc)
            : base(new PipeModel(), model, doc)
        {
            SetPickFilter(EnumShapeFilter.VertexEdgeFace);
        }

        public GPnt Position
        {
            get => Model.Position;
            set => SetProperty(nameof(Position), ref Model.Position, value, nameof(X), nameof(Y), nameof(Z));
        }

        public double X
        {
            get => Model.Position.x;
            set 
            {
                if(X != value)
                {
                    Position = new GPnt(value, Model.Position.y, Model.Position.z);
                }
            }
        }

        public double Y
        {
            get => Model.Position.y;
            set
            {
                if (Y != value)
                {
                    Position = new GPnt(Model.Position.x, value, Model.Position.z);
                }
            }
        }
        public double Z
        {
            get => Model.Position.z;
            set
            {
                if (Z != value)
                {
                    Position = new GPnt(Model.Position.x, Model.Position.y, value);
                }
            }
        }

        public GDir Direction
        {
            get => Model.Direction;
            set => SetProperty(nameof(Direction), ref Model.Direction, value);
        }

        public double InnerRadius
        {
            get => Model.InnerRadius;
            set => SetProperty(nameof(InnerRadius), ref Model.InnerRadius, value, 
                () => { return value > 0; }, nameof(OutterRadius));
        }

        public double Thickness
        {
            get => Model.Thickness;
            set => SetProperty(nameof(Thickness), ref Model.Thickness, value,
                () => { return value > 0; }, nameof(OutterRadius));
        }
        public double Length
        {
            get => Model.Length;
            set => SetProperty(nameof(Length), ref Model.Length, value, ()=>{ return value > 0; });
        }

        public double OutterRadius
        {
            get => Model.InnerRadius + Model.Thickness;
        }
        
        //...
    }

3.3 View实现

xaml和界面布局相关,此处省略。

4 运行效果

 

程序下载:

链接: https://pan.baidu.com/s/1KEzQbYhRLAsWb5lC6S0O2g?pwd=pipe 

提取码: pipe 

5 总结

本文从技术的角度提供一种管道建模的方案,能够快速验证想法,但距离实际应用还有一段距离,达到生产应用还需要精雕细琢。基于AnyCAD Rapid .NET框架提供的建模、显示、数据管理等基础设施,可以快速验证产品原型,大大地缩短产品研发周期,使产品能够更快的产生价值。

 
   

标签:控件,nameof,软件开发,get,value,public,Position,NET,Model
From: https://www.cnblogs.com/anycad/p/16931364.html

相关文章

  • 【自定义控件】WrapBeakPanel-自定义代有换行功能的Panel
    自定义代有换行功能的PanelWrapBreakPanel.csusingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Windows.Controls;usingSystem.Win......
  • Modbus RTU转Profinet网关将信衡控制秤接入Profinet的配置过程
    本案例控制的主要对象是信衡控制秤仪表的数据参数的显示和报警,仪表型号XH3180-K,系统主PLC选用西门子S71200,将设备接入西门子PLC的采集数据模块采用MODBUS转PROFINE......
  • 拓端tecdat|r语言代码编写对LASSO,Ridge岭回归和Elastic Net模型实现
     介绍Glmnet是一个通过惩罚最大似然来拟合广义线性模型的包。正则化路径是针对正则化参数λ的值网格处的套索或弹性网络罚值计算的。该算法速度极快,可以利用输入矩阵中的稀......
  • Netty源码-00-启动
    一源码我fork的源码带注释分支study二环境版本Netty4.1.169Java8三Samples1服务端1.1启动类/**Copyright2012TheNettyProject**......
  • 拓端tecdat|python编程代写对网络图networkx进行社区检测和彩色绘图
    python对网络图networkx进行社区检测和彩色绘图 以下是创建图表,检测其中的社区,然后在少于10行的python中使用由其社区着色的节点进行可视化的方法......
  • 基于.net C# Socket WinForm MQTT 客户端开发
     1、什么是MQTT?MQTT(MessageQueuingTelemetryTransport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议......
  • 菩提阁外卖各种bug_network
    原项目视频:https://www.bilibili.com/video/BV13a411q753/下面是遇到的有关的bug(这里只包括了基础篇,没有引入redis那些。所以都是前面103集遇到的bug)静态资源映射失败......
  • .NET6之MiniAPI(十七):缓存
    缓存是空间换时间的一种做法,可以有效的提升响应时间,asp.netcore引入了本地内存缓存和分布式缓存。先看一下本地内存缓存:usingMicrosoft.Extensions.Caching.M......
  • .NET6之MiniAPI(十七):缓存
    缓存是空间换时间的一种做法,可以有效的提升响应时间,asp.netcore引入了本地内存缓存和分布式缓存。先看一下本地内存缓存:usingMicrosoft.Extensions.Caching.M......
  • .NET6之MiniAPI(十六):数据保护
    对于web,安全是一个永久的话题,所以ASP.NETCore数据保护提供了一个简单,易用的加密API,可以用来保护数据,密钥管理和轮换。ASP.NETCore的数据保护是根据本机的一个ke......