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

ADN Club => AutoCAD .NET API => Тема начата: VitaliyB от 22-04-2023, 19:14:40

Название: Привязки к определенным слоям
Отправлено: VitaliyB от 22-04-2023, 19:14:40
Добрый день! Есть код, который отключает привязки к выбранным слоям. Все работает, но есть нюанс: тип привязки "пересечение" все равно привязывается ко всем слоям. Остальные типы привязок игнорируют невыбранные слои. В чем тут может ошибка?
(https://i.postimg.cc/bs32V76j/2022-12-20-13-19-32.png) (https://postimg.cc/bs32V76j)
Сам код:
Код - C# [Выбрать]
  1.  public class ViborSnap
  2.     {
  3.         private static string[] Layers = FiltrPerem.namelayerCreate.ToArray();
  4.         private static OsOverrule _osOverrule;
  5.  
  6.         private class OsOverrule : OsnapOverrule
  7.         {
  8.             public override void GetObjectSnapPoints(
  9.                 Entity ent,
  10.                 ObjectSnapModes mode,
  11.                 IntPtr gsm,
  12.                 Point3d pick,
  13.                 Point3d last,
  14.                 Matrix3d view,
  15.                 Point3dCollection snap,
  16.                 IntegerCollection geomIds)
  17.             {
  18.                 if (IsApplicable(ent))
  19.                     return;
  20.  
  21.                 base.GetObjectSnapPoints(ent, mode, gsm, pick, last, view, snap, geomIds);// ТУТ ПОЛУЧАЕМ ПАРАМЕТРЫ ТОЧКИ ПРИВЯЗКИ, MODE - ПАРАМЕТР ОБЪЕКТНОЙ ПРИВЯЗКИ
  22.              
  23.             }
  24.  
  25.  
  26.             public override bool IsContentSnappable(Entity entity)
  27.             {
  28.                 return !IsApplicable(entity);
  29.             }
  30.  
  31.             /// <inheritdoc />
  32.             public override bool IsApplicable(RXObject overruledSubject)
  33.             {
  34.                 //ТУТ ПРОВЕРЯЕМ УДОВЛЕТВОРЯЕТ ЛИ ПРИМИТИВ УСЛОВИЯМ, ЧТОБЫ К НЕМУ ПРИВЯЗАТЬСЯ
  35.                 return base.IsApplicable(overruledSubject) && overruledSubject is Entity ent &&
  36.                        !Layers.Any(x => x.Equals(ent.Layer, StringComparison.OrdinalIgnoreCase));
  37.  
  38.             }
  39.         }
  40.  
  41.         private static void ToggleOverruling(bool on)
  42.         {
  43.             if (on)
  44.             {
  45.                 if (_osOverrule == null)
  46.                 {
  47.                     _osOverrule = new OsOverrule();
  48.                     Overrule.AddOverrule(RXObject.GetClass(typeof(Entity)), _osOverrule, false);
  49.                 }
  50.  
  51.                 Overrule.Overruling = true;
  52.             }
  53.             else
  54.             {
  55.                 if (_osOverrule == null)
  56.                     return;
  57.  
  58.                 Overrule.RemoveOverrule(RXObject.GetClass(typeof(Entity)), _osOverrule);
  59.                 _osOverrule.Dispose();
  60.                 _osOverrule = null;
  61.             }
  62.         }
  63.  
  64.         [CommandMethod("ИгнорSnapSelection_On")]//ЭТОЙ КОМАНДОЙ СНИМАЕМ ПРИВЯЗКУ
  65.         public static void DisableSnapping()
  66.         {
  67.             Layers = FiltrPerem.namelayerCreate.ToArray();
  68.             ToggleOverruling(true);
  69.         }
  70.  
  71.         [CommandMethod("ИгнорSnapSelection_Off")]
  72.         public static void EnableSnapping()
  73.         {
  74.             ToggleOverruling(false);
  75.         }
  76.     }
  77. }



Название: Re: Привязки к определенным слоям
Отправлено: Александр Ривилис от 22-04-2023, 20:20:12
VitaliyB,
Inersect следует обрабатывать отдельно:
https://through-the-interface.typepad.com/through_the_interface/2013/12/disabling-snapping-to-specific-autocad-objects-using-net-part-2.html
Название: Re: Привязки к определенным слоям
Отправлено: VitaliyB от 23-04-2023, 17:44:51
Частично получилось. теперь почему-то пересечение вообще не работает.  :-\
Код - C# [Выбрать]
  1.  private class OsOverrule : OsnapOverrule
  2.         {
  3.             public override void GetObjectSnapPoints(
  4.                 Entity ent,
  5.                 ObjectSnapModes mode,
  6.                 IntPtr gsm,
  7.                 Point3d pick,
  8.                 Point3d last,
  9.                 Matrix3d view,
  10.                 Point3dCollection snap,
  11.                 IntegerCollection geomIds)
  12.             {
  13.                 if (IsApplicable(ent))
  14.                     return;
  15.  
  16.                 base.GetObjectSnapPoints(ent, mode, gsm, pick, last, view, snap, geomIds);// ТУТ ПОЛУЧАЕМ ПАРАМЕТРЫ ТОЧКИ ПРИВЯЗКИ, MODE - ПАРАМЕТР ОБЪЕКТНОЙ ПРИВЯКИ
  17.              
  18.             }
  19.  
  20.             public override void GetObjectSnapPoints(
  21.                Entity ent,
  22.                ObjectSnapModes mode,
  23.                IntPtr gsm,
  24.                Point3d pick,
  25.                Point3d last,
  26.                Matrix3d view,
  27.                Point3dCollection snaps,
  28.                IntegerCollection geomIds,
  29.                Matrix3d insertion)
  30.             {
  31.                 if (IsApplicable(ent))
  32.                     return;
  33.  
  34.                 base.GetObjectSnapPoints(ent, mode, gsm, pick, last, view, snaps, geomIds, insertion);
  35.             }
  36.  
  37.             public override bool IsContentSnappable(Entity entity)
  38.             {
  39.                 return !IsApplicable(entity);
  40.             }
  41.  
  42.             /// <inheritdoc />
  43.             public override bool IsApplicable(RXObject overruledSubject)
  44.             {
  45.                 //ТУТ ПРОВЕРЯЕМ УДОВЛЕТВОРЯЕТ ЛИ ПРИМИТИВ УСЛОВИЯМ, ЧТОБЫ К НЕМУ ПРИВЯЗАТЬСЯ
  46.                 return base.IsApplicable(overruledSubject) && overruledSubject is Entity ent &&
  47.                        !Layers.Any(x => x.Equals(ent.Layer, StringComparison.OrdinalIgnoreCase)); //Знак НЕ, что выбиралось то что только в коллеции("!")
  48.  
  49.             }
  50.         }
  51.        
  52.         public class IntOverrule : GeometryOverrule
  53.  
  54.         {
  55.  
  56.             public override void IntersectWith(
  57.               Entity ent1,
  58.               Entity ent2,
  59.               Intersect intType,
  60.               Plane proj,
  61.               Point3dCollection points,
  62.               IntPtr thisGsm,
  63.               IntPtr otherGsm)
  64.             {
  65.  
  66.             }
  67.             public override void IntersectWith(
  68.               Entity ent1,
  69.               Entity ent2,
  70.               Intersect intType,
  71.               Point3dCollection points,
  72.               IntPtr thisGsm,
  73.               IntPtr otherGsm)
  74.  
  75.             {
  76.  
  77.             }
  78.         }
  79.  
  80.        
  81.  
  82.         private static void ToggleOverruling(bool on)
  83.         {
  84.             if (on)
  85.             {
  86.                 if (_osOverrule == null)
  87.                 {
  88.                     _osOverrule = new OsOverrule();
  89.                     Overrule.AddOverrule(RXObject.GetClass(typeof(Entity)), _osOverrule, false);
  90.                 }
  91.                
  92.                 if (_geoOverrule == null)
  93.  
  94.                 {
  95.                     _geoOverrule = new IntOverrule();
  96.                     ObjectOverrule.AddOverrule(RXObject.GetClass(typeof(Entity)), _geoOverrule, false);
  97.                 }
  98.                
  99.  
  100.  
  101.                 Overrule.Overruling = true;
  102.             }
  103.             else
  104.             {
  105.                 if (_osOverrule == null)
  106.                     return;
  107.  
  108.                 Overrule.RemoveOverrule(RXObject.GetClass(typeof(Entity)), _osOverrule);
  109.                 _osOverrule.Dispose();
  110.                 _osOverrule = null;
  111.                
  112.                 if (_geoOverrule == null)
  113.                     return;
  114.                 Overrule.RemoveOverrule(RXObject.GetClass(typeof(Entity)), _geoOverrule);
  115.                 _geoOverrule.Dispose();
  116.                 _geoOverrule = null;
  117.                
  118.             }
  119.  
  120.  
  121.  
  122.         }
  123.  
  124.         [CommandMethod("ИгнорSnapSelection_On")]
  125.         public static void DisableSnapping()
  126.         {
  127.             Layers = FiltrPerem.namelayerCreate.ToArray();
  128.             ToggleOverruling(true);
  129.         }
  130.  
  131.         [CommandMethod("ИгнорSnapSelection_Off")]
  132.         public static void EnableSnapping()
  133.         {
  134.             ToggleOverruling(false);
  135.         }
  136.     }
  137. }
Название: Re: Привязки к определенным слоям
Отправлено: Александр Ривилис от 23-04-2023, 18:05:05
Частично получилось. теперь почему-то пересечение вообще не работает. 
Ну и как оно может работать, если ты его заблокировал? В методах IntersectWith тебе нужно проверять слой примитивов и в зависимости от этого вызывать или не вызывать base.IntersectWith(...)
Название: Re: Привязки к определенным слоям
Отправлено: VitaliyB от 01-05-2023, 13:43:13
Частично получилось. теперь почему-то пересечение вообще не работает. 
Ну и как оно может работать, если ты его заблокировал? В методах IntersectWith тебе нужно проверять слой примитивов и в зависимости от этого вызывать или не вызывать base.IntersectWith(...)
Точно. Все получилось. Спасибо