9.7. Обработка событий объекта (DBObject Events)

Источник здесь. [перевод не проверен] ;[Переводчик: Богданов Михаил]

    Объектные события используются в ответ на открытие, добавление, изменение и удаление объектов из базы данных чертежа. Есть два типа объектных мероприятий связанных с: объектным уровнем, и уровнем базы данных. События объектного уровня определяются в ответ на конкретный объект в базе данных, в то время как события уровня базы данных реагируют на все объекты в базе данных.

    Вы определяете событие уровня объекта путем регистрации обработчика событий на событие объекта базы данных. События уровня базы данных определяются путем регистрации обработчика событий с одним из событий открытой базы данных объектов.

DBObjects имеет следующие события:

Cancelled

    Срабатывает при показе сообщения об отмене открытия объекта.

Copied

    Срабатывает после клонирования объекта. (прим. переводчика: судя по названию события – Копировании объекта)

Erased

    Срабатывает, когда объект помечается на удаление или восстановление.

Goodbye

    Срабатывает, когда объект вот-вот будет удален из памяти, потому, что связанная с ним база данных будет уничтожена.

Modified

    Срабатывает, когда объект изменен.

ModifiedXData

    Срабатывает, при изменении принадлежащих объекту XDATA

ModifyUndone

    Срабатывает, когда отменены предыдущие изменения объекта.

ObjectClosed

    Срабатывает, когда объект закрыть

OpenedForModify

    Срабатывает перед изменением объекта.

Reappended

    Срабатывает, когда объект удален из базы данных после операции отмены (прим. переводчика: Undo), а затем снова добавлен с операцией повторения (прим. переводчика Redo).

SubObjectModified

    Срабатывает, когда подобъект объекта изменяется.

Unappended

    Срабатывает, когда объект удаляется из базы данных после операции отмены. (прим. переводчика Undo) 

Ниже приводятся некоторые из событий использоваться для реагирования на предмет изменений на уровне базы данных:

ObjectAppended

    Срабатывает, когда объект добавляется в базу данных.

ObjectErased

    Срабатывает, когда объект удаляется или восстанавливается в базе данных.

ObjectModified

    Срабатывает, когда объект был изменен.

ObjectOpenedForModify

    Срабатывает до изменения объекта.

ObjectReappended

    Срабатывает, когда объект удален из базы данных после операции отмены (прим. переводчика: Undo), а затем снова добавлен с операцией повторения (прим. переводчика Redo).

ObjectUnappended

    Срабатывает, когда объект удаляется из базы данных после операции отмены. (прим. переводчика Undo)

Включение объектных событий. 

    Этот пример создает легкую полилинию с событиями. Обработчик событий для полилинии выводит новую площадь, при изменении полилинии. Чтобы вызвать событие, просто измените размер полилинии в AutoCAD. Помните, что вы должны выполнить подпрограмму CreatePLineWithEvents до того, как обработчик событий будет активирован.

Код VB.NET

   1:  Imports Autodesk.AutoCAD.Runtime
   2:  Imports Autodesk.AutoCAD.ApplicationServices
   3:  Imports Autodesk.AutoCAD.DatabaseServices
   4:  Imports Autodesk.AutoCAD.Geometry
   5:   
   6:  '' Глобальная переменная с полилинией
   7:  Dim acPoly As Polyline = Nothing
   8:   
   9:  <CommandMethod("AddPlObjEvent")> _
  10:  Public Sub AddPlObjEvent()
  11:    '' Получаем текущий документ и базу данных, и начинаем транзакцию
  12:    Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
  13:    Dim acCurDb As Database = acDoc.Database
  14:   
  15:    Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
  16:        ''Открываем Block table record для чтения
  17:        Dim acBlkTbl As BlockTable
  18:        acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, _
  19:                                     OpenMode.ForRead)
  20:   
  21:        '' Открываем Block table record для чтения в пространстве модели
  22:        Dim acBlkTblRec As BlockTableRecord
  23:        acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), _
  24:                                        OpenMode.ForWrite)
  25:   
  26:        '' Создаем и закрываем плилинию
  27:        acPoly = New Polyline()
  28:        acPoly.SetDatabaseDefaults()
  29:        acPoly.AddVertexAt(0, New Point2d(1, 1), 0, 0, 0)
  30:        acPoly.AddVertexAt(1, New Point2d(1, 2), 0, 0, 0)
  31:        acPoly.AddVertexAt(2, New Point2d(2, 2), 0, 0, 0)
  32:        acPoly.AddVertexAt(3, New Point2d(3, 3), 0, 0, 0)
  33:        acPoly.AddVertexAt(4, New Point2d(3, 2), 0, 0, 0)
  34:        acPoly.Closed = True
  35:   
  36:        '' Добавляем новый объект в block table record и начинаем транзакцию
  37:        acBlkTblRec.AppendEntity(acPoly)
  38:        acTrans.AddNewlyCreatedDBObject(acPoly, True)
  39:   
  40:        AddHandler acPoly.Modified, AddressOf acPolyMod
  41:   
  42:        '' Сохраняем новый объект в базу данных
  43:        acTrans.Commit()
  44:    End Using
  45:  End Sub
  46:   
  47:  <CommandMethod("RemovePlObjEvent")> _
  48:  Public Sub RemovePlObjEvent()
  49:    If acPoly <> Nothing Then
  50:        '' Получаем текущий документ и базу данных, и начинаем транзакцию
  51:        Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
  52:        Dim acCurDb As Database = acDoc.Database
  53:   
  54:        Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
  55:            '' Открываем полилинию для чтения
  56:            acPoly = acTrans.GetObject(acPoly.ObjectId, _
  57:                                       OpenMode.ForRead)
  58:   
  59:            If acPoly.IsWriteEnabled = False Then
  60:                acPoly.UpgradeOpen()
  61:            End If
  62:   
  63:            RemoveHandler acPoly.Modified, AddressOf acPolyMod
  64:            acPoly = Nothing
  65:        End Using
  66:    End If
  67:  End Sub
  68:   
  69:  Public Sub acPolyMod(ByVal senderObj As Object, _
  70:                       ByVal evtArgs As EventArgs)
  71:    Application.ShowAlertDialog("The area of " & _
  72:                                acPoly.ToString() & " is: " & _
  73:                                acPoly.Area)
  74:  End Sub

Код C#

   1:  using Autodesk.AutoCAD.Runtime;
   2:  using Autodesk.AutoCAD.ApplicationServices;
   3:  using Autodesk.AutoCAD.DatabaseServices;
   4:  using Autodesk.AutoCAD.Geometry;
   5:   
   6:  // Глобальная переменная с полилинией
   7:  Polyline acPoly = null;
   8:   
   9:  [CommandMethod("AddPlObjEvent")]
  10:  public void AddPlObjEvent()
  11:  {
  12:    // Получаем текущий документ и базу данных, и начинаем транзакцию
  13:    Document acDoc = Application.DocumentManager.MdiActiveDocument;
  14:    Database acCurDb = acDoc.Database;
  15:   
  16:    using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  17:    {
  18:        // Открываем Block table record для чтения
  19:        BlockTable acBlkTbl;
  20:        acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
  21:                                     OpenMode.ForRead) as BlockTable;
  22:   
  23:        // Открываем Block table record для чтения в пространстве модели
  24:        BlockTableRecord acBlkTblRec;
  25:        acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
  26:                                        OpenMode.ForWrite) as BlockTableRecord;
  27:   
  28:        // Создаем и закрываем плилинию
  29:        acPoly = new Polyline();
  30:        acPoly.SetDatabaseDefaults();
  31:        acPoly.AddVertexAt(0, new Point2d(1, 1), 0, 0, 0);
  32:        acPoly.AddVertexAt(1, new Point2d(1, 2), 0, 0, 0);
  33:        acPoly.AddVertexAt(2, new Point2d(2, 2), 0, 0, 0);
  34:        acPoly.AddVertexAt(3, new Point2d(3, 3), 0, 0, 0);
  35:        acPoly.AddVertexAt(4, new Point2d(3, 2), 0, 0, 0);
  36:        acPoly.Closed = true;
  37:   
  38:        // Добавляем новый объект в block table record и начинаем транзакцию
  39:        acBlkTblRec.AppendEntity(acPoly);
  40:        acTrans.AddNewlyCreatedDBObject(acPoly, true);
  41:   
  42:        acPoly.Modified += new EventHandler(acPolyMod);
  43:   
  44:        // Сохраняем новый объект в базу данных
  45:        acTrans.Commit();
  46:    }
  47:  }
  48:   
  49:  [CommandMethod("RemovePlObjEvent")]
  50:  public void RemovePlObjEvent()
  51:  {
  52:    if (acPoly != null)
  53:    {
  54:        // Получаем текущий документ и базу данных, и начинаем транзакцию
  55:        Document acDoc = Application.DocumentManager.MdiActiveDocument;
  56:        Database acCurDb = acDoc.Database;
  57:   
  58:        using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  59:        {
  60:            // Открываем полилинию для чтения
  61:            acPoly = acTrans.GetObject(acPoly.ObjectId,
  62:                                       OpenMode.ForRead) as Polyline;
  63:   
  64:            if (acPoly.IsWriteEnabled == false)
  65:            {
  66:                acPoly.UpgradeOpen();
  67:            }
  68:   
  69:            acPoly.Modified -= new EventHandler(acPolyMod);
  70:            acPoly = null;
  71:        }
  72:    }
  73:  }
  74:   
  75:  public void acPolyMod(object senderObj,
  76:                        EventArgs evtArgs)
  77:  {
  78:    Application.ShowAlertDialog("The area of " +
  79:                                acPoly.ToString() + " is: " +
  80:                                acPoly.Area);
  81:  }

Код VBA / ActiveX

   1:  Public WithEvents PLine As AcadLWPolyline
   2:  Sub CreatePLineWithEvents()
   3:      ' В этом примере лёгкая полилиния
   4:      Dim points(0 To 9) As Double
   5:      points(0) = 1: points(1) = 1
   6:      points(2) = 1: points(3) = 2
   7:      points(4) = 2: points(5) = 2
   8:      points(6) = 3: points(7) = 3
   9:      points(8) = 3: points(9) = 2
  10:   
  11:      Set PLine = ThisDrawing.ModelSpace. _
  12:      AddLightWeightPolyline(points)
  13:      PLine.Closed = True
  14:   
  15:      ThisDrawing.Application.ZoomAll
  16:  End Sub
  17:  Private Sub PLine_Modified _
  18:   (ByVal pObject As AutoCAD.IAcadObject)
  19:      ' Данное событие срабатывает при изменении размеров полилинии.
  20:      ' Если полилиния удаляется - событие так же срабатывает.
  21:      ' Поэтому мы используем обработчик ошибок, чтобы
  22:      ' избежать чтения с удалённого объекта.
  23:   
  24:      On Error GoTo ERRORHANDLER
  25:      MsgBox "The area of " & pObject.ObjectName & " is: " _
  26:      & pObject.Area
  27:      Exit Sub
  28:   
  29:  ERRORHANDLER:
  30:      MsgBox Err.Description
  31:  End Sub

Comments