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

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

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

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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: Переопределение привязок
« Ответ #15 : 20-12-2022, 13:24:05 »
Добрый день! Опять ломаю голову. Код работает, почему-то отключается все привязки (как и должно быть) кроме привязок типа "пересечение". Пересечение работает везде, ко всем слоям. интересно, почему такое возникает?



Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: Переопределение привязок
« Ответ #16 : 20-12-2022, 15:54:48 »
А как снимается привязка? Я на лиспе знаю минимум 2 варианта. И это только если касаться OSMODE, забыв про 3DOSMODE
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: Переопределение привязок
« Ответ #17 : 22-12-2022, 13:28:08 »
если я всё правильно понимаю (ответ в комментариях к коду):
Код - 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. }
  78.  
  79.