06/11/2013
Переопределение точек привязки для вставки блока
При переопределении точек привязки примитива BlockReference, мы можем захотеть отключить все остальные точки привязки, в том числе и те, которые получаются из примитивов, составляющих блок. Для этой цели мы переопределяем метод "IsContentSnappable" класса "OsnapOverrule".Вот пример, который добавляет точку центра блока в качестве точки привязки, а все остальные точки привязки (в том числе и точки привязки составляющих блок примитивов) игнорируются.
Код - C#: [Выделить]
- using System.Collections.Generic;
- public class ExtApp : IExtensionApplication
- {
- static ObjectSnapOverrule m_osnapOverrule
- = new ObjectSnapOverrule();
- static Overrule[] m_overrules = new Overrule[]
- {
- m_osnapOverrule,
- };
- static List<ObjectId> m_overruledObjects = new List<ObjectId>();
- static bool m_overruleAdded = false;
- [CommandMethod("startOverrule")]
- static public void Start()
- {
- Document doc = Application.DocumentManager.MdiActiveDocument;
- Editor ed = doc.Editor;
- PromptEntityOptions peo = new PromptEntityOptions(
- "Выберите вставку блока для переопределения:"
- );
- peo.SetRejectMessage("Это не вставка блока");
- peo.AddAllowedClass(
- typeof(Autodesk.AutoCAD.DatabaseServices.BlockReference),
- false);
- PromptEntityResult per = ed.GetEntity(peo);
- if (per.Status != PromptStatus.OK)
- return;
- ObjectId brefId = per.ObjectId;
- if (!m_overruledObjects.Contains(per.ObjectId))
- {
- m_overruledObjects.Add(brefId);
- }
- ObjectId[] ids = m_overruledObjects.ToArray();
- foreach (Overrule o in m_overrules)
- {
- o.SetIdFilter(ids);
- if (!m_overruleAdded)
- {
- Overrule.AddOverrule(
- RXObject.GetClass(typeof(BlockReference)),
- o,
- false);
- }
- }
- Overrule.Overruling = true;
- m_overruleAdded = true;
- Application.DocumentManager.MdiActiveDocument.Editor.Regen();
- }
- [CommandMethod("stopOverrule")]
- static public void End()
- {
- foreach (Overrule o in m_overrules)
- {
- Overrule.RemoveOverrule(
- RXObject.GetClass(typeof(BlockReference)),
- o);
- }
- Overrule.Overruling = false;
- Application.DocumentManager.MdiActiveDocument.Editor.Regen();
- }
- void IExtensionApplication.Initialize() { }
- void IExtensionApplication.Terminate() { }
- }
- class ObjectSnapOverrule : OsnapOverrule
- {
- public override void GetObjectSnapPoints(
- Entity entity,
- ObjectSnapModes snapMode,
- IntPtr gsSelectionMark,
- Point3d pickPoint,
- Point3d lastPoint,
- Matrix3d viewTransform,
- Point3dCollection snapPoints,
- IntegerCollection geometryIds)
- {
- BlockReference bref = entity as BlockReference;
- if (bref != null)
- {
- Database db = entity.Database;
- using (Transaction t
- = db.TransactionManager.StartTransaction())
- {
- BlockTableRecord btr
- = t.GetObject(
- bref.BlockTableRecord,
- OpenMode.ForRead
- ) as BlockTableRecord;
- // Добавляем только центральную точку в качестве точки привязки
- Extents3d exts = bref.GeometricExtents;
- snapPoints.Add(
- exts.MinPoint + (exts.MaxPoint - exts.MinPoint) * 0.5);
- }
- }
- }
- // Возвращаем false для предотвращения получения точек привязки
- // к составляющим блок примитивам
- public override bool IsContentSnappable(Entity entity)
- {
- return false;
- }
- }
Источник: 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