ObjectARX读取/写入当前未在autocad中打开的.dwg文件

时间:2015-07-16 08:57:29

标签: c# .net objectarx

我试图修改.dwg文件并在完成后覆盖.dwg文件,所有这些都不用在autocad中打开它。我读过关于RealDWG的内容,但这里的目标不是独立模式。 autocad插件从autocad运行,需要修改和写入当前项目中未打开的某些.dwg文件。到目前为止,我创建了一个Database对象并将.dwg文件读入其中,但是当我想要重写它时,我有错误。这是C#中的代码,

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;

namespace ModifyClosedDWG
{
    public class DWGEditor
    {
        private static string filepath = @"E:\...\DrawingTest.dwg";

        [CommandMethod("modifyDWG")]
        public void addTextToDWG()
        {
            Database workingDB = HostApplicationServices.WorkingDatabase;
            Editor ed = doc.Editor;

            Database db = new Database(false, true);

            try
            {
                db.ReadDwgFile(filepath, System.IO.FileShare.ReadWrite, false, "");                    
                db.CloseInput(true);
                HostApplicationServices.WorkingDatabase = db;
            }
            catch (Autodesk.AutoCAD.Runtime.Exception  e)
            {
                ed.WriteMessage("\nUnable to read drawing file : " + e.StackTrace);
                return;
            }

            using (BlockTable bt = db.BlockTableId.Open(OpenMode.ForRead) as BlockTable)
            {
                using (BlockTableRecord btr = bt[BlockTableRecord.ModelSpace].Open(OpenMode.ForWrite) as BlockTableRecord)
                {
                    MText objText = new MText();
                    objText.SetDatabaseDefaults();
                    objText.Location = new Autodesk.AutoCAD.Geometry.Point3d(2, 2, 0);
                    objText.Contents = "added text in a closed .dwg file!";
                    objText.TextStyleId = db.Textstyle;
                    btr.AppendEntity(objText);
                }                    
            }

            HostApplicationServices.WorkingDatabase = workingDB;
            db.SaveAs(filepath, DwgVersion.Current);
        }
    }
}

错误输出:

Autodesk.AutoCAD.Runtime.Exception: eWasOpenForWrite
   at Autodesk.AutoCAD.DatabaseServices.Database.SaveAs(String fileName, DwgVersion version)
   at ModifyClosedDWG.DWGEditor.addTextToDWG() in E:\PROJETS\ELI017\07 In Works documents\VisualC#Projects\ModifyClosedDWG\ModifyClosedDWG\DWGEditor.cs:line 64
   at Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorker(MethodInfo mi, Object commandObject, Boolean bLispFunction)
   at Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorkerWithExceptionFilter(MethodInfo mi, Object commandObject, Boolean bLispFunction)
   at Autodesk.AutoCAD.Runtime.PerDocumentCommandClass.Invoke(MethodInfo mi, Boolean bLispFunction)
   at Autodesk.AutoCAD.Runtime.CommandClass.CommandThunk.Invoke()

我找到了解决方案,所以我将把新代码放在这里......

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;

namespace ModifyClosedDWG
{
    public class DWGEditor
    {
        private static string filepath = @"E:\PROJETS\ELI017\07 In Works documents\dwg\DrawingTest.dwg";

        [CommandMethod("modifyDWG")]
        public void addTextToDWG()
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            Database workingDB = HostApplicationServices.WorkingDatabase;           
            Database db = new Database(false, true);

            try
            {
                db.ReadDwgFile(filepath, System.IO.FileShare.ReadWrite, false, "");   
                db.CloseInput(true);
                HostApplicationServices.WorkingDatabase = db;
            }
            catch (Autodesk.AutoCAD.Runtime.Exception  e)
            {
                ed.WriteMessage("\nUnable to open .dwg file : " + e.StackTrace);
                return;
            }

            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                    BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
                    BlockTableRecord btr = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
                    MText objText = new MText();
                    objText.SetDatabaseDefaults();
                    objText.Location = new Autodesk.AutoCAD.Geometry.Point3d(2, 2, 0);
                    objText.Contents = "added text in a closed .dwg file!";
                    objText.TextStyleId = db.Textstyle;
                    btr.AppendEntity(objText);
                    tr.AddNewlyCreatedDBObject(objText, true);
                    tr.Commit();
            }
            HostApplicationServices.WorkingDatabase = workingDB;
            db.SaveAs(filepath, DwgVersion.Current);              
        }
    }
}

0 个答案:

没有答案