10/06/2013
Как получить идентификаторы всех объектов (ObjectId), вставленных через буфер обмена.
Вопрос: Как средствами AutoCAD .NET API получить массив идентификаторов объектов, вставленных при помощи команды ВСТБУФЕР (_PASTECLIP).
Ответ: Для этой цели следует подписаться на два типа событий:
1) события начала и завершения команды.
2) события базы данных (добавление / удаление объекта в базу).
Ниже приведен код:
Код - C#: [Выделить]
- using System;
- using Autodesk.AutoCAD.Runtime;
- using Autodesk.AutoCAD.ApplicationServices;
- using Autodesk.AutoCAD.DatabaseServices;
- using Autodesk.AutoCAD.Geometry;
- using Autodesk.AutoCAD.EditorInput;
- using AcRx = Autodesk.AutoCAD.Runtime;
- using AcAp = Autodesk.AutoCAD.ApplicationServices;
- using AcDb = Autodesk.AutoCAD.DatabaseServices;
- using AcGe = Autodesk.AutoCAD.Geometry;
- using AcEd = Autodesk.AutoCAD.EditorInput;
- [assembly: ExtensionApplication(typeof(Rivilis.MonitorPaste))]
- namespace Rivilis
- {
- public class MonitorPaste : IExtensionApplication
- {
- private AcAp.DocumentCollection m_docMan;
- private AcAp.Document m_doc;
- private AcDb.Database m_db;
- private bool m_bBeginPaste;
- private AcDb.ObjectIdCollection ids;
- void IExtensionApplication.Initialize()
- {
- ids = new AcDb.ObjectIdCollection();
- m_bBeginPaste = false;
- m_docMan = AcAp.Application.DocumentManager;
- m_doc = m_docMan.MdiActiveDocument;
- m_db = m_doc.Database;
- m_doc.CommandWillStart += new AcAp.CommandEventHandler(MonitorCommandWillStarted);
- m_doc.CommandEnded += new AcAp.CommandEventHandler(MonitorCommandEnded);
- m_doc.CommandCancelled += new AcAp.CommandEventHandler(MonitorCommandCanceled);
- m_doc.CommandFailed += new AcAp.CommandEventHandler(MonitorCommandCanceled);
- m_db.ObjectAppended += new AcDb.ObjectEventHandler(MonitorObjectAppended);
- m_db.ObjectUnappended += new AcDb.ObjectEventHandler(MonitorObjectUnappended);
- m_db.ObjectReappended += new AcDb.ObjectEventHandler(MonitorObjectReappended);
- m_db.ObjectErased += new AcDb.ObjectErasedEventHandler(MonitorObjectErased);
- }
- void IExtensionApplication.Terminate()
- {
- }
- private void MonitorCommandWillStarted(Object o, CommandEventArgs e)
- {
- // Любая из команд _PASTEXXX (т.е., _PASTECLIP, _PASTEORIG, и др.)
- if (e.GlobalCommandName.Substring(0, 5) == "PASTE")
- {
- m_bBeginPaste = true;
- }
- }
- private void MonitorCommandEnded(Object o, CommandEventArgs e)
- {
- if (e.GlobalCommandName.Substring(0, 5) == "PASTE" && m_bBeginPaste)
- {
- m_doc.Editor.WriteMessage("\nCommand added {0} entities:", ids.Count);
- foreach (ObjectId id in ids)
- {
- m_doc.Editor.WriteMessage("\n\t{0} {1}", id.ObjectClass.Name,id);
- }
- }
- m_bBeginPaste = false; ids.Clear();
- }
- private void MonitorCommandCanceled(Object o, CommandEventArgs e)
- {
- m_bBeginPaste = false; ids.Clear();
- }
- private void MonitorObjectAppended(object sender, ObjectEventArgs e)
- {
- if (!m_bBeginPaste) return;
- // Добавляем только примитивы из текущего пространства (Модели или Листа)
- if (!ids.Contains(e.DBObject.ObjectId) && e.DBObject.OwnerId == m_db.CurrentSpaceId)
- ids.Add(e.DBObject.ObjectId);
- }
- private void MonitorObjectUnappended(object sender, ObjectEventArgs e)
- {
- if (!m_bBeginPaste) return;
- if (ids.Contains(e.DBObject.ObjectId)) ids.Remove(e.DBObject.ObjectId);
- }
- private void MonitorObjectReappended(object sender, ObjectEventArgs e)
- {
- if (!m_bBeginPaste) return;
- // Добавляем только примитивы из текущего пространства (Модели или Листа)
- if (!ids.Contains(e.DBObject.ObjectId) && e.DBObject.OwnerId == m_db.CurrentSpaceId)
- ids.Add(e.DBObject.ObjectId);
- }
- private void MonitorObjectErased(object sender, ObjectErasedEventArgs e)
- {
- if (!m_bBeginPaste) return;
- if (ids.Contains(e.DBObject.ObjectId)) ids.Remove(e.DBObject.ObjectId);
- }
- }
- }
Обсуждение: http://adn-cis.org/forum/index.php?topic=96.0
Автор: Александр Ривилис
Автор перевода: Александр Ривилис
Опубликовано 10.06.2013
Отредактировано 14.06.2013 в 13:36:18
Автор перевода: Александр Ривилис
Опубликовано 10.06.2013
Отредактировано 14.06.2013 в 13:36:18