среда, 17 октября 2012 г.

Tooltip для BlockReference в AutoCAD

Если вы хотите назначить определению блока некоторую текстовую информацию, которая должна отображаться в виде всплывающей подсказки при наведении курсора мыши на вхождения этого блока, то в качестве варианта можно воспользоваться обозначенным далее решением.

За основу взят код Kean Walmsley, с учётом поправок от Tony Tanzillo. Во всплывающей подсказке будет отображаться тот текст, который будет задан пользователем в редакторе блока, для свойства Description:



 Для начала, маленький мультик, демонстрирующий работу библиотеки:



Теперь, собственно сам исходный код:


// Based on http://through-the-interface.typepad.com/through_the_interface/2009/07/providing-information-on-autocad-objects-in-a-tooltip-using-net.html

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

public class PointMonitorTooltips : IExtensionApplication {

       public static void StartMonitor() {
             Document doc = Application.DocumentManager.MdiActiveDocument;            
             Editor ed = doc.Editor;
             ed.PointMonitor += new PointMonitorEventHandler(ed_PointMonitor);
       }

       static void DocumentManager_DocumentActivated(object sender, DocumentCollectionEventArgs e) {
             StopMonitor();
             StartMonitor();           
       }

       public static void StopMonitor() {
             Document doc = Application.DocumentManager.MdiActiveDocument;
             Editor ed = doc.Editor;
             ed.TurnForcedPickOn();
             ed.PointMonitor -= new PointMonitorEventHandler(ed_PointMonitor);
       }

       static void ed_PointMonitor(object sender, PointMonitorEventArgs e) {
             Editor ed = (Editor)sender;
             Document doc = ed.Document;
             try {
                    FullSubentityPath[] paths = e.Context.GetPickedEntities();

                    StringBuilder sb = new StringBuilder();

                    Transaction tr = doc.TransactionManager.StartTransaction();
                    using (tr) {
                           foreach (FullSubentityPath path in paths) {
                                  ObjectId[] ids = path.GetObjectIds().Where(n => n.ObjectClass.Name
                                        == "AcDbBlockReference").ToArray();
                                  foreach (ObjectId id in ids) {
                                        BlockReference blockRef = tr.GetObject(id, OpenMode.ForRead)
                                               as BlockReference;
                                        BlockTableRecord tabRec = tr.GetObject(blockRef.BlockTableRecord,
                                                      OpenMode.ForRead) as BlockTableRecord;
                                        sb.AppendLine(tabRec.Comments);
                                  }
                           }
                           tr.Commit();
                    }
                    if (sb.ToString() != "")
                           e.AppendToolTipText(sb.ToString());
             }
             catch {
                    // Not sure what we might get here, but not real action
                    // needed (worth adding an Exception parameter and a
                    // breakpoint, in case things need investigating).
             }
       }

       public void Initialize() {
             StopMonitor();
             StartMonitor();           
             Application.DocumentManager.DocumentActivated +=
                    new DocumentCollectionEventHandler(DocumentManager_DocumentActivated);
       }

       public void Terminate() {
             //throw new System.NotImplementedException();
       }
}



Комментариев нет: