ADN Open CIS
Сообщество программистов Autodesk в СНГ

10/06/2013

Как получить идентификаторы всех объектов (ObjectId), вставленных через буфер обмена.

Вопрос: Как средствами AutoCAD .NET API получить массив идентификаторов объектов, вставленных при помощи команды ВСТБУФЕР (_PASTECLIP).

 

Ответ: Для этой цели следует подписаться на два типа событий:

1)     события начала и завершения команды.

2)     события базы данных (добавление / удаление объекта в базу).

Ниже приведен код:

 

Код - C#: [Выделить]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.EditorInput;
  7. using AcRx = Autodesk.AutoCAD.Runtime;
  8. using AcAp = Autodesk.AutoCAD.ApplicationServices;
  9. using AcDb = Autodesk.AutoCAD.DatabaseServices;
  10. using AcGe = Autodesk.AutoCAD.Geometry;
  11. using AcEd = Autodesk.AutoCAD.EditorInput;
  12.  
  13.  
  14. [assembly: ExtensionApplication(typeof(Rivilis.MonitorPaste))]
  15.  
  16. namespace Rivilis
  17. {
  18.  
  19.   public class MonitorPaste : IExtensionApplication
  20.   {
  21.     private AcAp.DocumentCollection m_docMan;
  22.     private AcAp.Document m_doc;
  23.     private AcDb.Database m_db;
  24.     private bool m_bBeginPaste;
  25.     private AcDb.ObjectIdCollection ids;
  26.  
  27.     void IExtensionApplication.Initialize()
  28.     {
  29.       ids = new AcDb.ObjectIdCollection();
  30.       m_bBeginPaste = false;
  31.       m_docMan = AcAp.Application.DocumentManager;
  32.       m_doc    = m_docMan.MdiActiveDocument;
  33.       m_db     = m_doc.Database;
  34.       m_doc.CommandWillStart += new AcAp.CommandEventHandler(MonitorCommandWillStarted);
  35.       m_doc.CommandEnded     += new AcAp.CommandEventHandler(MonitorCommandEnded);
  36.       m_doc.CommandCancelled += new AcAp.CommandEventHandler(MonitorCommandCanceled);
  37.       m_doc.CommandFailed    += new AcAp.CommandEventHandler(MonitorCommandCanceled);
  38.       m_db.ObjectAppended    += new AcDb.ObjectEventHandler(MonitorObjectAppended);
  39.       m_db.ObjectUnappended  += new AcDb.ObjectEventHandler(MonitorObjectUnappended);
  40.       m_db.ObjectReappended  += new AcDb.ObjectEventHandler(MonitorObjectReappended);
  41.       m_db.ObjectErased      += new AcDb.ObjectErasedEventHandler(MonitorObjectErased);
  42.     }
  43.  
  44.     void IExtensionApplication.Terminate()
  45.     {
  46.  
  47.     }
  48.     private void MonitorCommandWillStarted(Object o, CommandEventArgs e)
  49.     {
  50.       // Любая из команд _PASTEXXX (т.е., _PASTECLIP, _PASTEORIG, и др.)
  51.       if (e.GlobalCommandName.Substring(0, 5) == "PASTE") 
  52.       {
  53.         m_bBeginPaste = true;
  54.       }
  55.     }
  56.     private void MonitorCommandEnded(Object o, CommandEventArgs e)
  57.     {
  58.       if (e.GlobalCommandName.Substring(0, 5) == "PASTE" && m_bBeginPaste)
  59.       {
  60.         m_doc.Editor.WriteMessage("\nCommand added {0} entities:", ids.Count);
  61.         foreach (ObjectId id in ids)
  62.         {
  63.           m_doc.Editor.WriteMessage("\n\t{0} {1}", id.ObjectClass.Name,id);
  64.         }
  65.       }
  66.       m_bBeginPaste = false; ids.Clear();
  67.     }
  68.     private void MonitorCommandCanceled(Object o, CommandEventArgs e)
  69.     {
  70.       m_bBeginPaste = false; ids.Clear();
  71.     }
  72.  
  73.     private void MonitorObjectAppended(object sender, ObjectEventArgs e)
  74.     {
  75.       if (!m_bBeginPaste) return;
  76.       // Добавляем только примитивы из текущего пространства (Модели или Листа)
  77.       if (!ids.Contains(e.DBObject.ObjectId) && e.DBObject.OwnerId == m_db.CurrentSpaceId)
  78.           ids.Add(e.DBObject.ObjectId);
  79.     }
  80.     private void MonitorObjectUnappended(object sender, ObjectEventArgs e)
  81.     {
  82.       if (!m_bBeginPaste) return;
  83.       if (ids.Contains(e.DBObject.ObjectId)) ids.Remove(e.DBObject.ObjectId);
  84.     }
  85.     private void MonitorObjectReappended(object sender, ObjectEventArgs e)
  86.     {
  87.       if (!m_bBeginPaste) return;
  88.      // Добавляем только примитивы из текущего пространства (Модели или Листа)
  89.       if (!ids.Contains(e.DBObject.ObjectId) && e.DBObject.OwnerId == m_db.CurrentSpaceId)
  90.           ids.Add(e.DBObject.ObjectId);
  91.     }
  92.  
  93.     private void MonitorObjectErased(object sender, ObjectErasedEventArgs e)
  94.     {
  95.       if (!m_bBeginPaste) return;
  96.       if (ids.Contains(e.DBObject.ObjectId)) ids.Remove(e.DBObject.ObjectId);
  97.     }
  98.   }
  99. }
  100.  


Обсуждение: http://adn-cis.org/forum/index.php?topic=96.0

Автор: Александр Ривилис
Автор перевода: Александр Ривилис
Опубликовано 10.06.2013
Отредактировано 14.06.2013 в 13:36:18