**TestGetSelect命令出错问题遇到的现象和发生背景 **
编译运行环境:win10,visual studio 2022,acad2016,.net framework 4.8;
win10,visual studio 2010sp1,acad2008sp1,.net framework 3.5.
问题:标题中的Netselection类库编译在上述两种环境中军正常编译通过,但在autocad中运行TestGetSelect命令弹出错误窗口。
**TestGetSelect命令出错问题相关代码,请勿粘贴截图 **
using System.Linq;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
using DotNetARX;
namespace NetSelection
{
public class NetSelection
{
[CommandMethod("TestGetSelect")]
public static void TestGetSelect()
{
Document doc=Application.DocumentManager.MdiActiveDocument;
Database db=doc.Database;
Editor ed=doc.Editor;
//生成三个同心圆并添加到当前模型空间
Circle cir1=new Circle(Point3d.Origin, Vector3d.ZAxis, 10);
Circle cir2=new Circle(Point3d.Origin, Vector3d.ZAxis, 20);
Circle cir3=new Circle(Point3d.Origin, Vector3d.ZAxis, 30);
db.AddToModelSpace(new Circle[] { cir1, cir2, cir3 });
//提示用户选择对象
PromptSelectionResult psr = ed.GetSelection();
if (psr.Status != PromptStatus.OK) return;//如果未选择,则返回
//获取选择集
SelectionSet ss=psr.Value;
//信息提示框,给出选择集中包含实体个数的提示
Application.ShowAlertDialog("选择集中实体的数量:" + ss.Count.ToString());
}
}
}
using System;
using System.Text.RegularExpressions;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
namespace DotNetARX
{
/// <summary>
/// 辅助操作类
/// </summary>
public static partial class Tools
{
/// <summary>
/// 将实体添加到模型空间
/// </summary>
/// <param name="db">数据库对象</param>
/// <param name="ent">要添加的实体</param>
/// <returns>返回添加到模型空间中的实体ObjectId</returns>
public static ObjectId AddToModelSpace(this Database db, Entity ent)
{
ObjectId entId;//用于返回添加到模型空间中的实体ObjectId
//定义一个指向当前数据库的事务处理,以添加直线
using (Transaction trans=db.TransactionManager.StartTransaction())
{
//以读方式打开块表
BlockTable bt=(BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
//以写方式打开模型空间块表记录.
BlockTableRecord btr=(BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
entId = btr.AppendEntity(ent);//将图形对象的信息添加到块表记录中
trans.AddNewlyCreatedDBObject(ent, true);//把对象添加到事务处理中
trans.Commit();//提交事务处理
}
return entId; //返回实体的ObjectId
}
/// <summary>
/// 将实体添加到模型空间
/// </summary>
/// <param name="db">数据库对象</param>
/// <param name="ents">要添加的多个实体</param>
/// <returns>返回添加到模型空间中的实体ObjectId集合</returns>
public static ObjectIdCollection AddToModelSpace(this Database db, params Entity[] ents)
{
ObjectIdCollection ids=new ObjectIdCollection();
var trans=db.TransactionManager;
BlockTableRecord btr=(BlockTableRecord)trans.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForWrite);
foreach (var ent in ents)
{
ids.Add(btr.AppendEntity(ent));
trans.AddNewlyCreatedDBObject(ent, true);
}
btr.DowngradeOpen();
return ids;
}
}
**TestGetSelect命令运行结果及报错内容 **
Autodesk.AutoCAD.Runtime.Exception: eNoActiveTransactions
在 Autodesk.AutoCAD.DatabaseServices.TransactionManager.GetObjectInternal(AcDbTransactionManager* pTM, ObjectId id, OpenMode mode, Boolean openErased, Boolean forceOpenOnLockedLayer)
在 Autodesk.AutoCAD.DatabaseServices.TransactionManager.GetObject(ObjectId id, OpenMode mode)
在 DotNetARX.Tools.AddToModelSpace(Database db, Entity[] ents)
在 NetSelection.NetSelection.TestGetSelect() 位置 G:\visuallisp练习\20220305\Chap03(vs2022)\NetSelection\NetSelection.cs:行号 22
在 Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorker(MethodInfo mi, Object commandObject, Boolean bLispFunction)
在 Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorkerWithExceptionFilter(MethodInfo mi, Object commandObject, Boolean bLispFunction)
在 Autodesk.AutoCAD.Runtime.CommandClass.CommandThunk.Invoke()
**我的解答思路和尝试过的方法 **
启用VS调试模式,发现问题在
db.AddToModelSpace(new Circle[] { cir1, cir2, cir3 });
这一行
进一步执行AddToModelSpace,问题提示在该方法的第二个重载方法的
BlockTableRecord btr=(BlockTableRecord)trans.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForWrite);
这一行
我想要达到的结果:
能够按教材作者的思路执行完该程序