遇到一个口头机遇的答辩准备2(ai告诉的要点)

代码处理的过程,其实已经不是当时的过程了。算是事后的整理过程吧


先来问下CAD二开要点,ai给出了以下十一点:

一、核心原则

一些操作必须包 Transaction (事务,音标:/trænˈzækʃn/)

增删改图形必须用事务

读 用 ForRead ,改 写用 ForWrite

用完自动释放:using(Transaction tr = ......)

看到这里感觉using(Transaction tr = ......)很眼熟,之前写的也用了很多,大概当时也是知道是事务(因为注释有写)。

using(......){......} 这部分是**C#**的,与CAD没有关系,作用是:自动释放资源(防止内存泄漏)

Transaction 这部分是 CAD 的 API(AutoCAD数据库事务,例如:ldb.TransactionManager.StartTransaction() 来自Autodesk.AutoCAD.DatabaseServices,作用是给CAD图纸开一个事务

但是好奇既然他这里给出的Transaction tr = ......说明赋值符号后面可能有变,于是又问了一嘴,他其实是cad的事务类型哦,cad能创建事务的方法有 3 个:

db.TransactionManager.**StartTransaction()**普通新事务,比如:画图、改图、删图、读图(99%第时间都用这个,最安全)

db.TransactionManager.StartTransaction( TransactionFlags.None / NoFlush / NoNotification / NoLocking**)**带参数的普通事务。

TransactionFlags.None 默认,正常事务。

TransactionFlags.NoFlush 不立即刷新数据库(批量优化,减少频繁刷新,1W条以上)。

TransactionFlags.NoNotification 不触发对象事件(ObjectAppended...),不触发任何通知。

TransactionFlags.NoLocking 不加锁(极危险,只读极端优化)。

db.TransactionManager.StartTopTransaction() 嵌套事务,创建顶层事务,不管嵌套多少层,她永远是最外层,只有顶层事务Commit()才真正写入数据库,嵌套事务内部用

db.TransactionManager.**StartOpenClosedTransaction()**重新打开已经关闭(Abort/Commit)的事务,极底层、极特殊,永远不会在业务代码里用,用于CAD内部撤销/重做机制

这时候就开始好奇那前面的是固定的么?问了下ai是固定的。第一个db 很好猜,是数据库,第二个TransactionManager,事务管理器,他管理事务的创建、嵌套、关闭。

嵌套事务工作从上到下:

StartTopTransaction (最外层)==>Transaction ==>Transaction(ActiveTransaction,当前)

只有TopTransaction.Commit()才真正写入数据库,内层Commit只是"标记完成"(当前层ok,不是真正提交),任意一层Abort()都是全部作废(整个事务树全部回滚,所有修改全部作废,不是仅当前层回滚)。

TransactionManager,除了这几个新建事务以外,还有3个核心的获取已有事务,分别是:

db.TransactionManager.TopTransaction****获取 当前已存在的顶层事务

db.TransactionManager.AllClosedTransactions****返回 一堆已关闭的旧事务列表

db.TransactionManager.ActiveTransaction****获取 别人的事务

所以结论是New出来的才能using,Get出来的绝对不能using

不能跨事务持有对象

OnjectId 可存,Entity / Polyline 不能长期持有

必须再正确上下文

命令里跑:CommandMethod

不能在多线程直接操作CAD数据库

异常必须捕获

避免CAD崩溃、卡死

二、最常用命名空间

cs 复制代码
using Autodesk.AutoCAD.ApplicationServices; // 文档、应用
using Autodesk.AutoCAD.DatabaseServices; // 图元、事务、图层
using Autodesk.AutoCAD.EditorInput; // 选择、输入、命令行
using Autodesk.AutoCAD.Geometry; // 点、坐标、矩阵
using Autodesk.AutoCAD.Runtime; // 命令注册、异常

三、标准模板

cs 复制代码
[CommandMethod("MyCmd")]
public void MyCommand()
{
    Document doc = Application.DocumentManager.MdiActiveDocument;
    Database db = doc.Database;
    Editor ed = doc.Editor;

    using (Transaction tr = db.TransactionManager.StartTransaction())
    {
        // 1. 获取模型空间
        BlockTableRecord ms = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;

        // 2. 画图/改图
        // ...

        tr.Commit(); // 提交才生效
    }
}

灰色划掉部分是核对官网发现没有的,去核对官网是因为发现ai说的有前后冲突,提出之后说是混淆了C++的api......

相关推荐
小陈phd4 小时前
深入理解agent学习笔记(七)——动态提示词与Skills
笔记·学习
我命由我123454 小时前
田野笔记极简理解
经验分享·笔记·学习·职场和发展·求职招聘·职场发展·学习方法
一木 之林4 小时前
微信小程序开发全攻略·文章版|00 总览:74集学习路径与知识地图
人工智能·学习·计算机视觉·微信小程序·小程序
小陈phd5 小时前
深入理解agent学习笔记(六)——提示工程-优化系统提示词
笔记·学习
诸神缄默不语6 小时前
小春学习日刊 2026年第1期:2026.10.13
学习
xxwl5856 小时前
三、区域赛算法模版第三章---字符串相关算法
笔记·学习·算法
辣知6 小时前
辣知·化智80 《道德经》和光同尘的智慧
学习
wdfk_prog6 小时前
LWIP教程 15:IPv4 与 IPv6——从网络层工作原理到嵌入式工程取舍
运维·开发语言·网络·笔记·学习·智能路由器·ip
RuixiYc.7 小时前
二油酰磷脂酰乙醇胺-聚乙二醇-丙烯酸酯,DOPE-PEG-Acrylate的性能优势
生活
chde2Wang7 小时前
numpy学习3
学习·numpy