C#CAD点击计数器实现

在 C# CAD 二次开发中,要实现鼠标点击处生成一个递增数字,核心是处理鼠标点击事件、获取点击位置、创建并更新文字实体。以下是基于 AutoCAD .NET API 的完整实现方案。

核心实现步骤与代码

  1. 定义全局变量与初始化

    首先,需要声明一个静态变量来记录当前的点击次数,并在命令初始化时将其重置。

    csharp 复制代码
    using Autodesk.AutoCAD.DatabaseServices;
    using Autodesk.AutoCAD.EditorInput;
    using Autodesk.AutoCAD.Geometry;
    using Autodesk.AutoCAD.Runtime;
    
    public class ClickCounter
    {
        // 用于记录当前点击次数的静态变量
        private static int _clickCount = 0;

}

```

  1. 实现点击计数命令

    创建一个命令,该命令将启动一个循环,等待用户点击,并在每次点击时在对应位置创建递增的数字文本。

    csharp 复制代码
    [CommandMethod("StartClickCounter")]
        public static void StartClickCounter()
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;
    
            // 重置计数器
            _clickCount = 0;
            ed.WriteMessage("

点击计数已开始,点击图形区域进行计数,按ESC或右键取消。");

复制代码
        // 进入点击循环 while (true)
        {
            // 获取用户点击的点
            PromptPointResult ppr = ed.GetPoint("

请点击位置: ");

if (ppr.Status != PromptStatus.OK)

{

// 用户取消(按ESC或右键)

break;

}

复制代码
            // 点击计数加1 _clickCount++;
            Point3d clickPoint = ppr.Value;

            // 在事务中创建文字实体 using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                // 以写模式打开块表记录(模型空间)
                BlockTable bt = trans.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
                BlockTableRecord btr = trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;

                // 创建显示数字的单行文字对象
                DBText text = new DBText {
                    Position = clickPoint, // 文字位置为点击点
                    TextString = _clickCount.ToString(), // 文字内容为当前计数 Height = 2.5, // 设置文字高度,可根据需要调整
                    Justify = AttachmentPoint.MiddleCenter // 设置文字对齐方式为居中 };

                // 将文字添加到模型空间并提交事务 btr.AppendEntity(text);
                trans.AddNewlyCreatedDBObject(text, true);
                trans.Commit();
            }

            // 在命令行提示当前计数 ed.WriteMessage($"

已记录第 {_clickCount} 次点击。");

}

复制代码
        ed.WriteMessage($"

点击计数结束。总点击次数: {_clickCount}");

}

}

```

关键要点说明

要点 说明与代码示例
获取点击位置 使用 Editor.GetPoint() 方法等待用户点击并返回一个 Point3d 对象 。
创建文字实体 使用 DBText 类创建单行文字,其 TextString 属性设置为当前计数值 。
文字定位与样式 Position 属性设定插入点;HeightJustify 属性控制文字大小和对齐方式,使数字在点击点居中显示。
事务处理 所有数据库对象的创建和修改必须在事务 (Transaction) 内完成,以确保数据完整性和性能 。
循环与退出 使用 while 循环持续监听点击,当 GetPoint() 返回状态非 OK(如用户按ESC)时退出循环。

扩展:优化与增强若需实现更复杂的功能,如数字样式可配置、计数持久化等,可参考以下方向修改代码:

  1. 使用图层与文字样式

    复制代码
     
  2. 添加引线或背景遮罩

    csharp 复制代码
    MText mText = new MText();
    mText.SetContentsRtf(@"{\rtf1\ansi \b " + _clickCount.ToString() + @"}");
    mText.Location = clickPoint;
    mText.BackgroundFill = true; // 开启背景填充
  3. 将计数保存为扩展数据

    csharp 复制代码
    text.XData = rb;

将此代码编译为.NET DLL,通过 NETLOAD 命令加载到AutoCAD后,执行 StartClickCounter 命令即可开始交互式点击计数。

相关推荐
心平气和量大福大3 小时前
C#-WPF-UserControl-生命周期(加载 退出)
开发语言·c#·wpf
sunywz3 小时前
【c#】 Web Deploy一键发布,IIS部署全流程
开发语言·前端·c#
玖玥拾5 小时前
Unity 3D 笔记(十二)Unity/C# Socket 网络笔记1
网络·unity·c#
EIP低代码平台6 小时前
EIP低代码平台 - 系统日志
低代码·c#·权限·工作流·netcore
玖玥拾6 小时前
Unity 3D 笔记(十五)Unity/C# Socket 网络笔记4
服务器·网络·unity·c#
EIP低代码平台15 小时前
EIP 低代码平台 - 角色维护
低代码·c#·权限·工作流·netcore
心平气和量大福大19 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
-银雾鸢尾-1 天前
C#中HashTable相关方法
开发语言·c#
geovindu1 天前
CSharp: Flyweight Pattern
开发语言·后端·c#·.net·享元模式·结构型模式