





二等奖:1名,奖品为价值500元的【飞利浦空气炸锅】
三等奖:1名,奖品为价值300元的【华为FreeBuds 6i无线蓝牙耳机】
参与奖:凡提交参赛作品的用户,均可获得3000社区积分奖励!
望仔可是诚意满满,下血本儿啦!
彩蛋主题:中秋与AI相伴
望仔







二等奖:1名,奖品为价值500元的【飞利浦空气炸锅】
三等奖:1名,奖品为价值300元的【华为FreeBuds 6i无线蓝牙耳机】
参与奖:凡提交参赛作品的用户,均可获得3000社区积分奖励!
望仔可是诚意满满,下血本儿啦!
彩蛋主题:中秋与AI相伴
望仔

周二我们介绍了中望Plant 3D,今天我们来看看中望Plant P&ID又能带来怎样的惊喜!
中望 Plant P&ID 是一款专门用来画"工艺流程图(PID 图)"的软件。简单说,它帮工程师把一座化工厂、炼油厂、制药厂里成千上万根管子、阀门、仪表怎么连、怎么走,又快又规范地画出来,而且画出来的图是"活的"——能自动统计、能检查对错、还能和三维模型对上号。


望仔

细心的小伙伴们会发现,近期我们新上了两套教程——中望Plant 3D 2026 基础教程、中望Plant P&ID基础教程。那Plant 3D和Plant P&ID到底是什么呢?今天我们用5分钟的时间,先讲清楚中望Plant 3D这个神秘的软件是做什么的,以及能够帮你解决什么问题!

一、中望Plant 3D 是给谁用的?
行业:主要用在石油、化工、医药、环保、轻工、冶金、核电、电子这些"要建厂、要铺管道"的行业。



望仔

零部件加工场景中,往往会是包含工装、夹具、零件、毛坯等模型零件,单零件编程往往无法考虑到工装等真实加工场景,容易产生过切撞机的风险,装配体编程更加符合真实加工场景。
在中望3D 悟空 2027的全新CAM平台不仅带来了新UI和新交互的新体验,还实现了CAD/CAM 环境一键无卡顿切换。全新CAM平台
中望3D 悟空 2027中新增了3轴倒角去毛刺、3轴点曲线工序,等高线加工和区域铣削工序新增优化步距功能。
3轴快速铣削改进
一键电极自动编程
DYH(小白)
Reactive Extensions,是一套用于处理事件流和异步数据流的编程模型。
在传统事件编程中,我们通常分别订阅事件、编写事件处理方法,并在适当的时候解除订阅。Rx 则把事件、定时器、异步结果等随时间产生的数据统一表示为数据流,再使用类似 LINQ 的方式进行处理。
可以把 Rx 简单理解为:
使用可组合的方式处理随时间不断产生的数据。Rx学习成本较低,为了方便C#开发者使用,微软将大部分方法设计的和
Linq非常相似,可以非常容易的入手。
安装起来也非常简单,只需要在nuget里引用System.Reactive包即可
IObservable<T>:表示可以被订阅的数据流。Subscribe():订阅数据流并接收数据。OnNext:数据流产生了一个新数据。OnError:数据流发生错误并结束。OnCompleted:数据流正常结束。IDisposable:表示一次订阅,调用 Dispose() 可以取消订阅。| 操作符 | 作用 |
|---|---|
Select |
转换数据 |
Where |
过滤数据 |
Take |
只接收指定数量的数据 |
Merge |
合并多个数据流 |
CombineLatest |
组合多个数据流的最新值 |
Throttle |
等待事件暂时停止后再处理 |
DistinctUntilChanged |
忽略与上一次相同的数据 |
IObservable<int> numbers = Observable.Range(1, 5);
IDisposable subscription = numbers.Subscribe(value =>
{
Console.WriteLine(value);
});
subscription.Dispose();
Subscribe() 返回一个 IDisposable。当不再需要接收数据时,调用 Dispose() 即可结束本次订阅。
Editor.PointMonitor事件。
使用鼠标事件替代Jig实现预览
其实cad中有很多其他类似的事件,如果你每次用的时候都要定义一个类似PointMonitorEventManager的容器封装一下,其实是件非常麻烦的事情,如果你的使用频率不高,那么使用Rx简化是一个不错的选择。也可以选择使用Rx进行封装。
Rx中将事件注册成数据流的方法有很多,由于CAD中的事件不遵循微软的 EventArgs<T> 标准,所以我们可以采用名字的方式来注册。
using var iDisposable = Observable.FromEventPattern(ed, nameof(ed.PointMonitor))
.Select(x => (PointMonitorEventArgs)x.EventArgs)
.Subscribe(args =>
{
// var pt = args.Context.ComputedPoint;
}
Subscribe订阅的时候,事件被注册,在iDisposable被释放时事件被拆除。
private static IDisposable? documentManagerSubscribe;
public static void Init()
{
documentManagerSubscribe = Observable
.FromEventPattern(Application.DocumentManager, nameof(Application.DocumentManager.DocumentActivated))
.Select(x => x.EventArgs)
.OfType<DocumentCollectionEventArgs>()
.Select(x => x.Document)
.Subscribe(DocumentActivatedHandler);
DocumentActivatedHandler(Application.DocumentManager.MdiActiveDocument);
}
private static readonly SerialDisposable _serialDisposable = new();
private static void DocumentActivatedHandler(Document? doc)
{
if(doc is null)
return;
_serialDisposable.Disposable = Observable.FromEventPattern(doc,nameof(doc.CommandWillStart))
.Select(x=>(CommandEventArgs)x.EventArgs)
.Publish()
.RefCount()
.Subscribe(x =>
{
try
{
var command = x.GlobalCommandName;
// do something
}
catch (Exception ex)
{
Log.Error("CommandWillStart事件发生错误" + ex.Message);
}
});
}
DocumentActivatedHandler方法。
在DocumentActivatedHandler方法中对文档的CommandWillStart事件进行订阅,并在事件触发时执行某些操作。
documentManagerSubscribe变量的作用是保持事件的生命周期,在此变量销毁时事件将被Rx自动拆除,所以将其放在静态变量中持久化。
SerialDisposable是Rx中的一个单IDisposable接口管理容器,每次对其Disposable属性进行赋值时,它将自动将旧的对象进行释放(如果有),并将其赋上新值,这样非常符合我们的使用场景,有新的文档变成了活动文档,那么刚刚的活动文档就变成了非活动文档,正好通过此特性将旧文档上的事件进行拆除,这里不需要判断旧文档是否还在,Rx会帮你处理。
这里注意到,订阅CommandWillStart事件时使用了Publish和RefCount,他们起到的作用是:如果在程序的不同地方多次订阅了同一事件,那么Rx只会实际上在对象上订阅一次,再通过委托进行二次分发。
完
之前