Accessing the active space or layout in an AutoCAD drawing using .NET

转载 2007年10月15日 13:56:00
 

This question was asked as comment to a previous post by har!s:

Thanks a lot for the code. I have yet to see 2008 and MultiLeader. But I presume that it works on both Model and paper spaces. In that case, what is the best method to make the operation space independent? i.e., it should work on active space irrespective of whether it's model or paper. I think this will be generally applicable to almost all the entity creations.

The question is very valid and does indeed apply to a lot of entity creation - and other - activities. Most of the time I simply show how to open the modelspace in my code, for example:

  Document doc =

    Application.DocumentManager.MdiActiveDocument;

  Editor ed = doc.Editor;

  Database db = doc.Database;

  Transaction tr =

    db.TransactionManager.StartTransaction();

  using (tr)

  {

    BlockTable bt =

      (BlockTable)tr.GetObject(

        db.BlockTableId,

        OpenMode.ForRead

      );

    BlockTableRecord btr =

      (BlockTableRecord)tr.GetObject(

        bt[BlockTableRecord.ModelSpace],

        OpenMode.ForWrite

      );

    // ...

  }

The key statement here is at the end, where we use GetObject() to open the BlockTableRecord to which we want to (for example) append an entity. The form we use is:

  bt[BlockTableRecord.ModelSpace]

Breaking this down: we're actually looking up the ObjectId of the BlockTableRecord with the name of "*MODEL_SPACE", which is the string stored in the static ModelSpace property of the BlockTableRecord class.

Here are a few different options for what we might do here:

  1. Use either BlockTableRecord.ModelSpace or BlockTableRecord.PaperSpace, if we know that we want to access either of these containers (the current approach).
  2. Use foreach() on the BlockTable to iterate through the various BlockTableRecords: you can open each one using GetObject() and check the IsLayout property to find those that are either modelspace or paperspace layouts.
  3. Use db.CurrentSpaceId to open the currently active space in that particular database.

Option 3 is really the answer to this question, which makes the code like this:

  Document doc =

    Application.DocumentManager.MdiActiveDocument;

  Editor ed = doc.Editor;

  Database db = doc.Database;

  Transaction tr =

    db.TransactionManager.StartTransaction();

  using (tr)

  {

    BlockTable bt =

      (BlockTable)tr.GetObject(

        db.BlockTableId,

        OpenMode.ForRead

      );

    BlockTableRecord btr =

      (BlockTableRecord)tr.GetObject(

        db.CurrentSpaceId,

        OpenMode.ForWrite

      );

    // ...

  }

两种方法在.Net中调用AutoCAD中的命令

两种方法在.Net中调用AutoCAD中的命令 1.using wrapper RunCommand: using System; using System.Linq....
  • jingxuan84
  • jingxuan84
  • 2014年07月14日 17:26
  • 2732

转自AutoCAD .NET 开发人员手册——Dimension各参数含义

Each dimension has the capability of overriding the settings assigned to it by a dimension style. Th...
  • u011511587
  • u011511587
  • 2013年12月08日 00:15
  • 1467

AutoCAD for .Net 开发环境配置

AutoCAD for . Net
  • sx341125
  • sx341125
  • 2015年11月13日 17:22
  • 3202

AutoCAD .Net 使用扩展字典存储自定义数据

每个 AutoCAD 数据库元素对象(DBObject)都可以使用扩展字典来存储自定义数据。 通常这一机制用来为图元对象(比如:线、圆等)存储非图形数据。 以下示例代码实现: AddXRecor...
  • wangyao1052
  • wangyao1052
  • 2017年12月13日 21:37
  • 107

AutoCAD二次开发——AutoCAD.NET API开发环境搭建

通过这篇文章,终于实现了第一个基于C#和autocad2010开发第一个小程序 AutoCAD二次开发——AutoCAD.NET API开发环境搭建 AutoCAD二次开发工具:1986年Auto...
  • hailiannanhai
  • hailiannanhai
  • 2016年08月18日 16:43
  • 4267

.NET AutoCAD二次开发之路(一、基础篇)

学习AutoCAD二次开发已经有一段时间了,磕磕碰碰,十分的艰辛枯燥。但回想一下还是会有些小激动,嘿嘿!最近这段时间一直都有这么个想法,就是将我学习CAD二次开发的过程用文字的方式记录下来,形成系列,...
  • zefllj
  • zefllj
  • 2016年01月01日 22:53
  • 3177

AutoCAD二次开发之.net API学习笔记

1、用户交互
  • liupeng_qwert
  • liupeng_qwert
  • 2015年05月07日 10:07
  • 421

AutoCAD界面移植到VB.net应用程序窗体中

最近因为需要将AutoCAD界面移植到VB.net应用程序窗体中,琢磨、搜索了很久,终于搞清楚,贴出来。。。 1.首先涉及两个按钮,第一个是启动CAD进程,第二个是打开图形界面 2.第一个按...
  • HeWaiZhiXing
  • HeWaiZhiXing
  • 2015年12月15日 10:46
  • 1160

AUTOCAD二次开发-----删除一个图层里面的所有对象

private void Test() { // 获取当前文档和数据库 Document acDoc = Application.Doc...
  • aasswwe
  • aasswwe
  • 2014年11月07日 21:37
  • 2450

基于.NET的CAD二次开发学习笔记二:AutoCAD .NET中的对象

1、CAD对象 一个CAD文件(DWG文件)即对应一个数据库,数据库中的所有组成部分,看的见(包括点、多段线、文字、圆等)和看不见(图层、线型、颜色等)的都是对象,数据库本身也是一个对象。 ...
  • mygisforum
  • mygisforum
  • 2015年04月29日 21:39
  • 4540
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Accessing the active space or layout in an AutoCAD drawing using .NET
举报原因:
原因补充:

(最多只允许输入30个字)