Привязки к определенным слоям

Автор Тема: Привязки к определенным слоям  (Прочитано 3126 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн VitaliyBАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Добрый день! Есть код, который отключает привязки к выбранным слоям. Все работает, но есть нюанс: тип привязки "пересечение" все равно привязывается ко всем слоям. Остальные типы привязок игнорируют невыбранные слои. В чем тут может ошибка?

Сам код:
Код - 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. }




Отмечено как Решение VitaliyB 23-04-2023, 17:40:12

Онлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн VitaliyBАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: Привязки к определенным слоям
« Ответ #2 : 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. }

Онлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Привязки к определенным слоям
« Ответ #3 : 23-04-2023, 18:05:05 »
Частично получилось. теперь почему-то пересечение вообще не работает. 
Ну и как оно может работать, если ты его заблокировал? В методах IntersectWith тебе нужно проверять слой примитивов и в зависимости от этого вызывать или не вызывать base.IntersectWith(...)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн VitaliyBАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: Привязки к определенным слоям
« Ответ #4 : 01-05-2023, 13:43:13 »
Частично получилось. теперь почему-то пересечение вообще не работает. 
Ну и как оно может работать, если ты его заблокировал? В методах IntersectWith тебе нужно проверять слой примитивов и в зависимости от этого вызывать или не вызывать base.IntersectWith(...)
Точно. Все получилось. Спасибо