本帖最后由 王阿非 于 2025-9-30 14:09 编辑
C#实现自定义实体,脱离C++魔咒,C#就可以实现完美的自定义实体
目前已经稳定可用(2025年9月29日 1.0.10)
更新日志:
2025年9月29日解决:
无法将引用添加到“WfunCharpCustomEntArx_Rxx”。 请确保此文件可访问并且是一个有效的程序集或 COM 组件复制代码
WfunCharp.CustomEnt
不需要学习C++即可实现复杂的自定义实体
规则重定义确实有各种限制,比如:
1.拖动加点消息函数的滞后性
2.数据存储问题
3.复杂的规则重定义绘制 不加载相关dll看不到真实的绘制效果等待
这个包可以帮助cad二次开发人员快速的用C#实现自定义实体实体,不需要学习复杂的C++,样例代码仓库 由于本包内部使用了C++,所以需要严格版本对应,具体对应关系:
如果遇到问题可以反馈到QQ:1504187115
或者在:sample 中提交iss
支持的自定实体功能1.自定义数据归档
样例代码仓库
网友答: 本帖最后由 王阿非 于 2025-9-30 14:19 编辑
C#中封装的有这个属性:Entity.Drawable.DrawStream,设置后可以在实体下次写打开之前维持自定义绘制,并且不会归档,正好满足你的需求

网友答: 本帖最后由 你有种再说一遍 于 2025-9-30 12:38 编辑
不需要持久化,主要是替换显示shx文字为ttf文字,或反之.
在C#貌似只有瞬态,但需要隐藏原来的文字则需要处理数据层,并且保存时候还需要还原数据层.
我不想改数据层,只想本机更改显示,别人拿到我的图纸之后也能查看原本的数据呈现.
是否能够封装AcGiDrawStream提供给我们?网友答: 本帖最后由 d1742647821 于 2025-8-27 09:57 编辑
天正其实是有设置的,默认关闭,打开就有了,我之前尝试了一个方案,复杂的重定义对象都使用块来处理,这样没插件的图打开就能看到块,这样会有一个问题,不能防止用户不编辑它,用户可能会移动这个块,但是规则重定义的参数其实是记录在xdata里的,用户不装插件的移动并不会更新xdata,导致一但回到有插件的环境,对象又会回到原位置网友答: 你咋不贴B站视频捏网友答: 这个真忘了,一会儿就贴上网友答:
点"回复"建楼别人才可以收到信息哦.网友答:
哦,这样啊,感谢网友答: 你上面这个demo有没有拖拽虚线夹点时候卡顿?
毕竟我记得拖拽之后应该进入JIG才对.网友答:
这个没有,你说的是夹点编辑?这个是cad内部实现的,不清楚如何实现的,估计也是jig网友答: 厉害呀,这玩意可以的,无限可能。网友答: 夹点编辑操作应该与这些 AcDbGripData AcDbGripOperations 有关网友答:
夹点编辑应该是我们重写到JIG控制的,需要绕过数据库层,
例如模拟天正墙体,拖拽墙中线的端点a,那么端点b不动,然后JIG界面层根据当前鼠标点高频修改数据.
至于修改自定义图元的集合哪些部分依然需要程序员控制(重写).
具体我也没有做过,嘻嘻
C#实现自定义实体,脱离C++魔咒,C#就可以实现完美的自定义实体
目前已经稳定可用(2025年9月29日 1.0.10)
更新日志:
2025年9月29日解决:
无法将引用添加到“WfunCharpCustomEntArx_Rxx”。 请确保此文件可访问并且是一个有效的程序集或 COM 组件
- 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,设置后可以在实体下次写打开之前维持自定义绘制,并且不会归档,正好满足你的需求

- class CustomDrawStream : DrawStream
- {
- protected override bool SubWorldDraw(WorldDraw wd)
- {
- return true;
- }
- static public void CustomDrawTest()
- {
- Line line = new Line();
- line.DrawStream = new CustomDrawStream();
- }
- }
网友答: 本帖最后由 你有种再说一遍 于 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界面层根据当前鼠标点高频修改数据.
至于修改自定义图元的集合哪些部分依然需要程序员控制(重写).
具体我也没有做过,嘻嘻