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

06/11/2013

Переопределение точек привязки для вставки блока

При переопределении точек привязки примитива BlockReference, мы можем захотеть отключить все остальные точки привязки, в том числе и те, которые получаются из примитивов, составляющих блок. Для этой цели мы переопределяем метод "IsContentSnappable" класса "OsnapOverrule".

Вот пример, который добавляет точку центра блока в качестве точки привязки, а все остальные точки привязки (в том числе и точки привязки составляющих блок примитивов) игнорируются.

Код - C#: [Выделить]
  1. using System.Collections.Generic;
  2.  
  3. public class ExtApp : IExtensionApplication
  4. {
  5.     static ObjectSnapOverrule m_osnapOverrule
  6.                                     = new ObjectSnapOverrule();
  7.     static Overrule[] m_overrules = new Overrule[]
  8.     {
  9.         m_osnapOverrule,
  10.     };
  11.     static List<ObjectId> m_overruledObjects = new List<ObjectId>();
  12.     static bool m_overruleAdded = false;
  13.  
  14.     [CommandMethod("startOverrule")]
  15.     static public void Start()
  16.     {
  17.         Document doc = Application.DocumentManager.MdiActiveDocument;
  18.         Editor ed = doc.Editor;
  19.  
  20.         PromptEntityOptions peo = new PromptEntityOptions(
  21.                         "Выберите вставку блока для переопределения:"
  22.                        );
  23.  
  24.         peo.SetRejectMessage("Это не вставка блока");
  25.         peo.AddAllowedClass(
  26.             typeof(Autodesk.AutoCAD.DatabaseServices.BlockReference),
  27.             false);
  28.  
  29.         PromptEntityResult per = ed.GetEntity(peo);
  30.         if (per.Status != PromptStatus.OK)
  31.             return;
  32.  
  33.         ObjectId brefId = per.ObjectId;
  34.  
  35.         if (!m_overruledObjects.Contains(per.ObjectId))
  36.         {
  37.             m_overruledObjects.Add(brefId);
  38.         }
  39.  
  40.         ObjectId[] ids = m_overruledObjects.ToArray();
  41.         foreach (Overrule o in m_overrules)
  42.         {
  43.             o.SetIdFilter(ids);
  44.             if (!m_overruleAdded)
  45.             {
  46.                 Overrule.AddOverrule(
  47.                     RXObject.GetClass(typeof(BlockReference)),
  48.                     o,
  49.                     false);
  50.             }
  51.         }
  52.  
  53.         Overrule.Overruling = true;
  54.         m_overruleAdded = true;
  55.  
  56.         Application.DocumentManager.MdiActiveDocument.Editor.Regen();
  57.     }
  58.  
  59.     [CommandMethod("stopOverrule")]
  60.     static public void End()
  61.     {
  62.         foreach (Overrule o in m_overrules)
  63.         {
  64.             Overrule.RemoveOverrule(
  65.                 RXObject.GetClass(typeof(BlockReference)),
  66.                 o);
  67.         }
  68.         Overrule.Overruling = false;
  69.         Application.DocumentManager.MdiActiveDocument.Editor.Regen();
  70.     }
  71.  
  72.     void IExtensionApplication.Initialize() { }
  73.  
  74.     void IExtensionApplication.Terminate() { }
  75. }
  76.  
  77. class ObjectSnapOverrule : OsnapOverrule
  78. {
  79.     public override void GetObjectSnapPoints(
  80.                                 Entity entity,
  81.                                 ObjectSnapModes snapMode,
  82.                                 IntPtr gsSelectionMark,
  83.                                 Point3d pickPoint,
  84.                                 Point3d lastPoint,
  85.                                 Matrix3d viewTransform,
  86.                                 Point3dCollection snapPoints,
  87.                                 IntegerCollection geometryIds)
  88.     {
  89.         BlockReference bref = entity as BlockReference;
  90.         if (bref != null)
  91.         {
  92.             Database db = entity.Database;
  93.             using (Transaction t
  94.                     = db.TransactionManager.StartTransaction())
  95.             {
  96.                 BlockTableRecord btr
  97.                     = t.GetObject(
  98.                                     bref.BlockTableRecord,
  99.                                     OpenMode.ForRead
  100.                                  ) as BlockTableRecord;
  101.  
  102.                 // Добавляем только центральную точку в качестве точки привязки
  103.                 Extents3d exts = bref.GeometricExtents;
  104.                 snapPoints.Add(
  105.                     exts.MinPoint + (exts.MaxPoint - exts.MinPoint) * 0.5);
  106.             }
  107.         }
  108.     }
  109.  
  110.     // Возвращаем false для предотвращения получения точек привязки
  111.     // к составляющим блок примитивам
  112.     public override bool IsContentSnappable(Entity entity)
  113.     {
  114.         return false;
  115.     }
  116. }

 

Источник: http://adndevblog.typepad.com/autocad/2013/06/overruling-osnaps-of-blockreference.html

 

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

Опубликовано 06.11.2013
Отредактировано 06.11.2013 в 11:18:35