28/12/2013
Определение записи таблицы блоков связанной с Листом
Чтобы добавить примитивы на Лист, необходимо найти запись таблицы блоков, связанную с этим листом. Каждый лист хранит ObjectId записи таблицы блоков, с которой он ассоциирован. Ниже код добавляющий окружность к выбранному Листу.
Код - C#: [Выделить]
- [CommandMethod("EntAddLayout")]
- static public void EntAddLayout()
- {
- Document doc = Application.DocumentManager.MdiActiveDocument;
- Database db = doc.Database;
- Editor ed = doc.Editor;
- // Спрашиваем имя листа
- PromptStringOptions opts = new PromptStringOptions("Укажите имя листа ");
- opts.AllowSpaces = true;
- PromptResult layoutName = ed.GetString(opts);
- if (layoutName.Status != PromptStatus.OK)
- return;
- using (Transaction tx = db.TransactionManager.StartTransaction())
- {
- DBDictionary dLayouts =
- tx.GetObject(db.LayoutDictionaryId, OpenMode.ForRead) as DBDictionary;
- // Проверяем имя листа
- if (dLayouts.Contains(layoutName.StringResult))
- {
- ObjectId id = dLayouts.GetAt(layoutName.StringResult);
- Layout layout = tx.GetObject(id, OpenMode.ForRead) as Layout;
- // layout.BlockTableRecordId – получаем id блока
- BlockTableRecord bt = tx.GetObject(
- layout.BlockTableRecordId,
- OpenMode.ForWrite) as BlockTableRecord;
- // в качестве текста добавим Окружность
- Circle circle = new Circle(Point3d.Origin, Vector3d.ZAxis, 10.0);
- bt.AppendEntity(circle);
- tx.AddNewlyCreatedDBObject(circle, true);
- // сделаем лист текущим
- LayoutManager layoutMgr = LayoutManager.Current;
- layoutMgr.CurrentLayout = layoutName.StringResult;
- }
- tx.Commit();
- }
- }
Источник: http://adndevblog.typepad.com/autocad/2012/06/identifying-the-block-table-record-of-the-layout.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=425
Опубликовано 28.12.2013