基于.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 ...
随机推荐
- C++右值引用与转移语义简要介绍
在 C++11 之前,值类型变量的传递会导致把它完整的拷贝一份 比如说把一个 vector 作为函数返回值赋值给某个局部变量,他就会调用 vector 的拷贝构造函数创建一个完整的副本,把这个副本作为 ...
- KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200)(AB水题,C思维,D搜索,E DP)
补题链接:Here A - Century 整除 \(200\) 并且判断能否整除完全 B - 200th ABC-200 按题意即可 C - Ringo's Favorite Numbers 2 求 ...
- Codeforces Round #715 (Div. 2) (A~D 补题记录)
补题链接:Here 经典手速场 1509A. Average Height 题意:要找出最大不平衡对序列 先输出奇数,然后输出偶数 void solve() { int n; cin >> ...
- 时空图预测的方法论,以及 diffusion model 基本概念
前天和善良的同学聊天,请教了 ① 时空图预测的方法论,② diffusion model 基本概念,记录下来. ① 时空图预测的方法论: 首先,构造 0 ~ t-1 时刻的 t 个图,每个图都有 n ...
- 国庆学go,完成了博客基本功能,迫不及待的发布上线了
大家好,我是沙漠尽头的狼. 国庆7天,利用带娃之余的空闲时间学习了go,并做了一个不是很完善的博客前台网站. 网站发布地址:https://go.dotnet9.com 源码 边做边上传Github, ...
- js - 元素 scrollTop 设置无效的原因 及 解决办法
原因 : 元素 display : flex ; 解决方法 : display : block;
- CSS 3D - rotate旋转90度看不到的原理 和 解决方法
原理: 旋转元素的坐标有三个 :X(向右), Y(向左) , Z(向电脑屏幕的你) 当没有位移旋转元素时,元素 Z 坐标也会同着一起旋转 ,当一个物品旋转到90度时,我们只能看到它的厚度,而d ...
- SpringBoot03:首页国际化
页面国际化 有的时候,我们的网站会去涉及中英文甚至多语言的切换,这时候我们就需要学习国际化! 1.配置文件编写 首先在resources资源文件下新建一个i18n目录,存放国际化配置文件 新建一个lo ...
- [转帖]【split】Linux上用 split实现大文件的拆分和合并
https://www.jianshu.com/p/87748b8563a9 有没有遇到某些网站上传复件时,单个文件有大小限制,导致上传失败呢?当然你可以采用更高的压缩率重新生成压缩包来解决,但如果还 ...
- Windows平台文件拆分与完整性检查的过程
Windows平台文件拆分与完整性检查的过程 场景 有时候在没有linux主机的情况下, 自己下载下来的文件比较大. 比较难以上传到一些特殊的系统/主机上面. 这个时候需要将文件进行拆分. 所以可以通 ...