可能是因为AddTransient对象在调用完其绘制函数后就立即被销毁,而图像被绘制时还需保持其持续存在。因此,可以通过在AddTransient之前添加对象的代码,来使图像持续存在。示例代码如下:
public void MyCommand() { Document doc = Application.DocumentManager.MdiActiveDocument; Transaction tr = doc.TransactionManager.StartTransaction(); using (tr) { BlockTable bt = tr.GetObject(doc.Database.BlockTableId, OpenMode.ForRead) as BlockTable; BlockTableRecord btr = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; Line line = new Line(new Point3d(0,0,0), new Point3d(100, 100, 0)); btr.AppendEntity(line); tr.AddNewlyCreatedDBObject(line, true); MyTransient myTransient = new MyTransient(line); Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.TransientManager.AddTransient(myTransient); tr.Commit(); } }
public class MyTransient : IDisposable { DBObject _objectToDraw; public MyTransient(DBObject obj) { _objectToDraw = obj; }
public void Draw(Graphics gs, Point p)
{
// draw the object
}
public void Dispose()
{
Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.TransientManager.EraseTransient(_objectToDraw.ObjectId, new ObjectIdCollection());
_objectToDraw.Dispose();
}
}
此示例中,我们在AddTransient之前创建了一个Line对象,并将其添加到了BlockTableRecord.ModelSpace中。我们还创建了一个MyTransient对象,该对象将持有Line对象的引用并实现了Draw方法。MyTransient对象将通过AddTransient方法来添加到AutoCAD中,并绘制Line对象。最后,在完成绘制后,我们将持有的DBObject和添加的Transient对象一同进行了释放操作。
通过以上的方法,我们可以实现在AutoCAD 2023 .net c#中正确地绘制对象。