基于.NET三维控件的个性化管道软件开发
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框架提供的建模、显示、数据管理等基础设施,可以快速验证产品原型,大大地缩短产品研发周期,使产品能够更快的产生价值。
基于.NET三维控件的个性化管道软件开发的更多相关文章
- WinForm中使用AnyCAD三维控件 の 初始化
在WinForm中可以方便的集成AnyCAD.Net三维控件,只需要以下几部即可完成. 一.添加DLL程序集 AnyCAD.Foundation.Net.dll AnyCAD.Presentation ...
- AnyCAD三维控件场景节点详解
SceneNode是AnyCAD三维图形平台的AnyViz显示引擎的核心对象之一,只有放在场景管理器(SceneManager)里的节点才能被显示引擎所显示. 1. 节点分类 SceneNode是 ...
- 在MFC对话框中快速集成三维控件
在MFC的对话框中可以方便的集成AnyCAD三维控件(c++版本),遵循一下几步: 1.在对话框资源中增加一个Static控件,ID为IDC_STATIC_3D,并且把它的Notify属性设置为Tru ...
- AnyCAD三维控件(转)
在WinForm中可以方便的集成AnyCAD.Net三维控件,只需要以下几部即可完成. 一.添加DLL程序集 AnyCAD.Foundation.Net.dll AnyCAD.Presentation ...
- Qt开发Active控件:如何使用ActiveQt Server开发大型软件的主框架(2)
Qt开发Active控件:如何使用ActiveQt Server开发大型软件的主框架 注:本文更多地是带着如何去思考答案,而不是纯粹的放一个答案上来,如果你需要直接看到完整的答案,请直接看实例和最后的 ...
- ASP.NET登录控件延伸(个性化)
既然由登录控件涉及到了Membership,那么就不得不提到用户个性化Profile对象.个性化允许为用户保存特定的个性化信息到数据库中,因此它不同于ASP.NET状态管理之处在于可以永久性保存这些信 ...
- .Net三维控件
AnyCAD .Net三维建模和可视化控件为.Net 4.0开发者提供简单易用的三维建模.三维可视化和文件交换的API. 30天试用版下载: 1. 三维建模 三维建模有以下功能: 三维基本体,如点. ...
- MFC/QT 学习笔记(四)——MFC基于对话框学习控件(上)
新建项目->MFC模板->MFC应用程序->应用程序类型:基于对话框->...OK 解决方案资源管理器->资源文件->xxx.rc->进入:资源视图-> ...
- 问题解决——基于MSCOMM32.OCX控件的类在客户机不能创建控件
大家不要笑我了,我不喜欢用那个人家写的串口类. 所以导出了MSCOMM32.OCX的类,然后在此基础上写了一个串口打印机的小工具类. -------------声明--------------- 本文 ...
- 基于jQuery的控件:弹框
★页面展示 ★属性 属性 值 说明 默认值 div Object jQuery对象 $('body') width Number 控件的宽度 auto height Number 控件的高度 auto ...
随机推荐
- JS 闭包 BUG
C.js代码: /** * 有BUG */ (function (global) { var _id; var _map; var _length; global.C = function () { ...
- C++岗位面试真题宝典 -- 操作系统篇
2.1 Linux中查看进程运行状态的指令.查看内存使用情况的指令.tar解压文件的参数. 参考回答 查看进程运行状态的指令:ps命令."ps -aux | grep PID",用 ...
- 方法记录 | 文件批量导入Goodnotes
一般来说通常资料都是用网盘下载了很多文件,想用Goodnotes来写批注,记笔记等,但是由于网盘不能直接分享.也不能批量分享到Goodnotes,给学习带来了很大的麻烦. 当然有钱的大佬们呢直接开了 ...
- 2020年第十一届蓝桥杯省赛 第二场(10月17日)B组个人题解
A 找出来1到2020之间数位为2的数量. 不用特别去考虑,直接循环即可 B 求分子分母最小因子为1的. 跑两个for循环,写一个gcd就可以了 答案:2481215 int main() { // ...
- 简单的git使用命令
一.Git简介 Git(读音为/gɪt/.)是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理.Git 是 Linus Torvalds 为了帮助管理 Lin ...
- RabbitMQ消息队列的发布-消费
1. 生产者 RabbitMQ_Producer static void Main(string[] args) { string path = AppDomain.CurrentDomain.Bas ...
- xshell配置隧道转移规则
钢铁知识库,一个学习python爬虫.数据分析的知识库.人生苦短,快用python. xshell是什么 通俗点说就是一款强大ssh远程软件,可以方便运维人员对服务器进行管理操作,功能很多朋友们自行探 ...
- 一个WPF开发的打印对话框-PrintDialogX
今天五月一号,大家玩的开心哦. 1. 介绍 今天介绍一个WPF开发的打印对话框开源项目-PrintDialogX,该开源项目由<WPF开源项目:AIStudio.Wpf.AClient>作 ...
- C# WPF:快把文件从桌面拖进我的窗体来!
首发公众号:Dotnet9 作者:沙漠之尽头的狼 日期:202-11-27 一.本文开始之前 上传文件时,一般是提供一个上传按钮,点击上传,弹出文件(或者目录选择对话框),选择文件(或者目录)后,从对 ...
- springboot封装统一返回
springboot返回统一的标准格式 定义注解 package com.yaoling.annotation; import java.lang.annotation.*; @Target({Ele ...