本帖最后由 王阿非 于 2025-9-30 14:09 编辑

C#实现自定义实体,脱离C++魔咒,C#就可以实现完美的自定义实体
目前已经稳定可用(2025年9月29日 1.0.10)
更新日志:
2025年9月29日解决:
无法将引用添加到“WfunCharpCustomEntArx_Rxx”。 请确保此文件可访问并且是一个有效的程序集或 COM 组件
  1. dotnet add package WfunCharp.CustomEnt.Arch --version 1.0.10
复制代码

WfunCharp.CustomEnt

不需要学习C++即可实现复杂的自定义实体
规则重定义确实有各种限制,比如:
1.拖动加点消息函数的滞后性
2.数据存储问题

3.复杂的规则重定义绘制 不加载相关dll看不到真实的绘制效果等待
这个包可以帮助cad二次开发人员快速的用C#实现自定义实体实体,不需要学习复杂的C++,样例代码仓库 由于本包内部使用了C++,所以需要严格版本对应,具体对应关系:

如果遇到问题可以反馈到QQ:1504187115
或者在:sample 中提交iss

支持的自定实体功能1.自定义数据归档
protected override void SubDataOut(DataIO data)
{
base.SubDataOut(data);
DataIO dataThis = new DataIO();
dataThis.SetData(value);
data.SetData(dataThis);
}
protected override void SubDataIn(DataIO data)
{base.SubDataIn(data);
DataIO dataThis = data.GetData();
dataThis.GetData(ref value);}
2.自定义绘制
protected override bool SubDraw(DrawEnt mode)
{
mode.Draw(new Circle() {Center = Center, Radius = Radius }
);
return true;
}
3.自定义打印信息到命令行
protected override void SubEntList()
{
ed.WriteMessage($"\n 半径:{Radius}");
}
3.自定义矩阵变换
protected override bool SubEntTransformBy(Matrix3d xform)
{
Center = Center.TransformBy(xform);
return true;
}
4.自定义夹点
protected override bool SubEntGetGripPoints(List<Point3d> gripPts)
{
gripPts.Add(Center); return true;
}
protected override bool SubEntSetGripPoints(Vector3d offset, int nIndex)
{
if (0 == nIndex)
{
Center = Center + offset;
}
return true;
}
以下是视频教程和说明
样例代码仓库










网友答: 本帖最后由 王阿非 于 2025-9-30 14:19 编辑
你有种再说一遍 发表于 2025-9-30 12:36
不需要持久化,主要是替换显示shx文字为ttf文字,或反之.
在C#貌似只有瞬态,但需要隐藏原来的文字则需要处 ...

C#中封装的有这个属性:Entity.Drawable.DrawStream,设置后可以在实体下次写打开之前维持自定义绘制,并且不会归档,正好满足你的需求

  1. class CustomDrawStream : DrawStream
  2. {
  3.     protected override bool SubWorldDraw(WorldDraw wd)
  4.     {
  5.         return true;
  6.     }

  7.     static public void CustomDrawTest()
  8.     {
  9.         Line line = new Line();
  10.         line.DrawStream = new CustomDrawStream();
  11.     }
  12. }



网友答: 本帖最后由 你有种再说一遍 于 2025-9-30 12:38 编辑
王阿非 发表于 2025-9-30 10:43
如果从渲染层来考虑层次就更深了,没有倒腾过
目前已知:AcGiDrawStream可以替换任何实体的绘制,但是貌似 ...

不需要持久化,主要是替换显示shx文字为ttf文字,或反之.
在C#貌似只有瞬态,但需要隐藏原来的文字则需要处理数据层,并且保存时候还需要还原数据层.
我不想改数据层,只想本机更改显示,别人拿到我的图纸之后也能查看原本的数据呈现.
是否能够封装AcGiDrawStream提供给我们?

网友答: 本帖最后由 d1742647821 于 2025-8-27 09:57 编辑
你有种再说一遍 发表于 2025-8-27 09:52
不重要,例如天正就没有写多少代理对象...

天正其实是有设置的,默认关闭,打开就有了,我之前尝试了一个方案,复杂的重定义对象都使用块来处理,这样没插件的图打开就能看到块,这样会有一个问题,不能防止用户不编辑它,用户可能会移动这个块,但是规则重定义的参数其实是记录在xdata里的,用户不装插件的移动并不会更新xdata,导致一但回到有插件的环境,对象又会回到原位置

网友答: 你咋不贴B站视频捏

网友答: 这个真忘了,一会儿就贴上

网友答:
王阿非 发表于 2025-8-26 15:36
这个真忘了,一会儿就贴上

点"回复"建楼别人才可以收到信息哦.

网友答:
你有种再说一遍 发表于 2025-8-26 15:49
点"回复"建楼别人才可以收到信息哦.

哦,这样啊,感谢

网友答: 你上面这个demo有没有拖拽虚线夹点时候卡顿?
毕竟我记得拖拽之后应该进入JIG才对.

网友答:
你有种再说一遍 发表于 2025-8-26 17:36
你上面这个demo有没有拖拽虚线夹点时候卡顿?
毕竟我记得拖拽之后应该进入JIG才对.

这个没有,你说的是夹点编辑?这个是cad内部实现的,不清楚如何实现的,估计也是jig

网友答: 厉害呀,这玩意可以的,无限可能。

网友答: 夹点编辑操作应该与这些 AcDbGripData AcDbGripOperations 有关

网友答:
王阿非 发表于 2025-8-26 17:39
这个没有,你说的是夹点编辑?这个是cad内部实现的,不清楚如何实现的,估计也是jig

夹点编辑应该是我们重写到JIG控制的,需要绕过数据库层,
例如模拟天正墙体,拖拽墙中线的端点a,那么端点b不动,然后JIG界面层根据当前鼠标点高频修改数据.
至于修改自定义图元的集合哪些部分依然需要程序员控制(重写).

具体我也没有做过,嘻嘻
  • 上一篇:C#怎样获取当前CAD已加载ARX程序列表(已解决获取
  • 下一篇:没有了