AutoCAD .NET二次开发(三)

简介: 在ArcGIS中,锁是一个经常遇到的东西,在打开一个该当时要锁定,编辑一个文档是再次锁定。要深入理解这个,要学习一下进程与线程。在CAD.NET中,也有Lock与Unlock。 获取一个文档,在进行处理前应当LockDocument,像官网帮助所说,因为修改或访问CAD的请求随时随地都在发生,为避免与其他请求冲突,我们有责任在修改前锁定文档。

在ArcGIS中,锁是一个经常遇到的东西,在打开一个该当时要锁定,编辑一个文档是再次锁定。要深入理解这个,要学习一下进程与线程。在CAD.NET中,也有Lock与Unlock。

获取一个文档,在进行处理前应当LockDocument,像官网帮助所说,因为修改或访问CAD的请求随时随地都在发生,为避免与其他请求冲突,我们有责任在修改前锁定文档。但是,某些情形下的锁定文档会导致在更新数据库过程中锁定犯规。

下列四种情况我们需要锁定:

(1)从无模式对话框与CAD交互时;

(2)访问已调入的文档不是当前文档时;

(3)应用程序作为COM服务器时;

(4)用会话命令标志注册命令时。

例如,向非当前文档的模型或图纸空间添加实体时,就需要锁定文档。我们使用要锁定的数据库对象的LockDocument方法,调用LockDocument方法时,返回一个DocumentLock对象。

一旦修改完已锁定数据库,就要将数据库解锁。解锁数据库,我们调用DocumentLock对象的Dispose方法。我们还可以使用Using语句,Using语句运行结束,数据库也就解锁了。也许,这四种情况我目前并不是很理解,但在以后的学习中,应该用得着。

而我总喜欢看看违背它的意愿来尝试一次,我去掉了锁定代码,结果调试报错:eLockViolation

下是是官网帮助的例子:本例新建一个文档然后绘制一个圆。文档创建后,新文档的数据库被锁定,然后圆添加到文档,添加完圆后数据库解锁,相应文档窗口置为当前。

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

 [CommandMethod("LockDoc", CommandFlags.Session)]
public static void LockDoc()

{

  // Create a new drawing新建图形

  DocumentCollection acDocMgr = Application.DocumentManager;

  Document acNewDoc = acDocMgr.Add("acad.dwt");

  Database acDbNewDoc = acNewDoc.Database;

   // Lock the new document锁定新文档

  using (DocumentLock acLckDoc = acNewDoc.LockDocument())

  {

      // Start a transaction in the new database启动新数据库事务

      using (Transaction acTrans = acDbNewDoc.TransactionManager.StartTransaction())

      {

          // Open the Block table for read打开并读块表,

          BlockTable acBlkTbl;

          acBlkTbl = acTrans.GetObject(acDbNewDoc.BlockTableId, OpenMode.ForRead) as BlockTable;

           // Open the Block table record Model space for write

          //打开并写模型空间的块表记录

          BlockTableRecord acBlkTblRec;

          acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],

                                          OpenMode.ForWrite) as BlockTableRecord;

           // Create a circle with a radius of 3 at 5,5

          //以半径3圆心(5,5)绘圆

          Circle acCirc = new Circle();

          acCirc.Center = new Point3d(5, 5, 0);

          acCirc.Radius = 3;

           // Add the new object to Model space and the transaction

          //向模型空间和事务添加新对象

          acBlkTblRec.AppendEntity(acCirc);

          acTrans.AddNewlyCreatedDBObject(acCirc, true);

           // Save the new object to the database提交事务,保存新对象到数据库

          acTrans.Commit();

      }

       // Unlock the document解锁文档using语句到此结束

  }

   // Set the new document current将新文档置为当前

  acDocMgr.MdiActiveDocument = acNewDoc;

}

  

 

参考:http://www.360doc.com/content/12/0909/12/8463843_235156523.shtml

        http://www.cadkong.com/doc/3732

目录
相关文章
|
C++ 移动开发
【物联网智能网关-17】.NET Micro Framework之MDK C++二次开发
.NET Micro Framework虽然好学易用,但是在一些需要实时,需要高性能的应用领域,却有些勉为其难。毕竟.NET Micro Framework上层应用程序由底层CLR(TinyCLR)解释执行,执行效率被打个折扣是在所难免的。
769 0
|
缓存 NoSQL 数据库
3.NetDh框架之缓存操作类和二次开发模式简单设计(附源码和示例代码)
前言 NetDh框架适用于C/S、B/S的服务端框架,可用于项目开发和学习。目前包含以下四个模块 1.数据库操作层封装Dapper,支持多种数据库类型、多库实例,简单强大; 此部分具体说明可参考博客: https://www.
1305 0
|
数据库 定位技术
AutoCAD .NET二次开发(四)
在CAD中,属性信息一般是以注记的形式存在,但当属性数据内容较多时,显示就成了问题。扩展属性(Xdata)可以解决这一问题,比如南方Cass中就利用了这一点。我们经常用Lisp来读取操作扩展属性。 查看实体属性信息: (entget(car(entsel))'("*")) 但我们为了方便与GIS交互,我们得在.NET中来读取、修改CAD文件中实体的扩展属性。
1479 0
AutoCAD .NET二次开发(二)
今天专门讲一个——CommandMethod。我们都在知道CAD操作要快,必须要熟悉掌握各种命令。在Lisp开发中,在函数后C:即可添加一个命令,非常方法,在.NET API也可以非常方便的设置命令,它需要CommandMethod属性。
1404 0
|
.NET 开发框架 API
AutoCAD .NET二次开发(一)
其他话不多说,直接进入主题,既然是二次开发,当然是用CAD平台已经封装好了很多类,我们需要熟悉和使用它们。常用的AutoCAD .NET API的四个主要DLL文件是: 名称 作用 备注 AcDbMgd.
2849 0
|
3月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
46 7
|
3月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
75 0
|
4月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
55 0