Определение примененного OSnap при выборе точки пользователем.

Автор Тема: Определение примененного OSnap при выборе точки пользователем.  (Прочитано 9416 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN OPEN
  • Сообщений: 31
  • Карма: 0
Доброго времени суток.
Задачка: пользователь создает, например, линию (при чем не через команду Line, а через мой плагин, спрашивающий у пользователя, соответственно точку1 и точку2 для последующего построения требуемой линии); при выборе точек конца и начала пользователь применяет объектную привязку на соседних объектах; необходимо програмно определить (C#) какая привязка на каком объекте сработала при таком выборе.

Соответственно, отыскалось у меня пока только вот это: http://adndevblog.typepad.com/autocad/2013/01/how-to-find-out-if-an-acedgetpoint-was-taken-by-an-osnap-override.html. К сожалению, найденный код не для .net, а для ObjectARX. Т.к. для меня и vs, и net, и c# - вновинку (перешла надавно после vba), то добавление к ним освоения objectarx боюсь приведет к передозу новой информации. Отсюда вопросы к решению этой задачки: 1. возможно ли перевести найденный код на c#, если да - буду благодарна за подсказку: как? 2. Может есть под рукой уже что-то близкое на c#, тогда вообще буду на седьмом небе от счастья? 3. Приведенный в ссылке код - только проверяет - что за оснэп был применен и не дает ответа на то - к какому объекту/объектам (если, например, речь идет о пересечении) применен оснэп.Правильно ли я понимают, что для решения этой второй части поставленной задачи нужно проверить принадлежит ли выбранная точка какому-нибудь объекту из всех присутствующих на чертеже (через цикл) или, я бы даже сказала: через selectatpoint (опять же через цикл). Или есть метода еще короче, например, проистекающая из того же Osnapа (может у него какие-то подходящие свойства имеются)?
Не считайте себя умнее! (Даже если Ваш оппонент - женщина.:)))
Лучше день потерять, а потом за 2 минуты долететь!

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

  • Administrator
  • *****
  • Сообщений: 13891
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
необходимо програмно определить (C#) какая привязка на каком объекте сработала при таком выборе.
Если сможете вразумительно и очень подробно объяснить зачем это нужно, то я постараюсь помочь. Я не могу себе представить ситуацию зачем это может понадобится.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 31
  • Карма: 0
вразумительно и очень подробно объяснить зачем это нужно
Необходима последовательная осмысленная запись действий пользователя при осуществлении построения в Автокад конструкции одежды на основании определенных исходных данных (размерных признаков и т.п.), с целью повтора этих действий, но уже с другими исходными данными программным способом. Требуется не только осмысление действий пользователя (т.к. сделать это можно разными способами), но и максимальное упрощение процесса этого "осмысления компьютером" с точки зрения пользователя, в т.ч. с минимизацией усилий (как временных, так и умственных) со стороны пользователя. Пользователь должен думать о конструкции, а не о том, как записать последовательность своих действий. Скажу сразу: блоки - не могут быть решением задачи. Также отмечу, что в этом ответе обозначена глобальная задача, а задача по обработке Оснэп, указанная в теме, является лишь одним из многочисленных средств решения этой глобальной задачи. Ну, и добавлю, что количество конструкций при построении одежды может быть бесконечно огромным и разнообразным, так что оперировать нужно не деталями (это к впоросу применения блоков), а примитивами. Ссылки на применение готовых программных продуктов (типа Графиса) также не интересуют (пробавали - не подходят).
Не считайте себя умнее! (Даже если Ваш оппонент - женщина.:)))
Лучше день потерять, а потом за 2 минуты долететь!

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

  • Administrator
  • *****
  • Сообщений: 13891
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Думаю, что для решение "глобальной задачи" получения OSNAP и выбранного примитива (или примитивов) ничего не дадут. Уверен в этом на 99.9% Но раз обещал, то сделаю. Это будет не так быстро. Нужно убедится, что всё, что работает в ObjectARX будет работать и в .NET API, что бывает не всегда.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 31
  • Карма: 0
ничего не дадут. Уверен в этом на 99.9% Но раз обещал, то сделаю.
Спасибо. Буду ждать. Пока поковыряю другие части своей глобальной задачки. О результатах приложения к ней Osnap обязательно сообщу (надеюсь, что они все-таки будут положительными). Пока ждала Вашего ответа начала самостоятельно разбираться во взаимосвязи ObjectORX / /.net  и наткнулась на class ObjectSnapContext. По описанию, вроде полезен для решения моей задачи. Хотя может я, как не профессионал, сильно ошибаюсь.
Не считайте себя умнее! (Даже если Ваш оппонент - женщина.:)))
Лучше день потерять, а потом за 2 минуты долететь!

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

  • Administrator
  • *****
  • Сообщений: 13891
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Хотя может я, как не профессионал, сильно ошибаюсь.
Именно. Он используется для Custom Osnap. Это созданная средствами ObjectARX (и только с его помощью) собственная нестандартная привязка - в качестве примера, это может быть по аналогии с серединой отрезка - 1/3 или 2/3 отрезка.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

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

Отмечено как Решение sergolga 04-11-2016, 19:28:54

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

  • Administrator
  • *****
  • Сообщений: 13891
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Итак:
Код - C# [Выбрать]
  1. using System;
  2. using System.Collections.Generic;
  3. using Autodesk.AutoCAD.Runtime;
  4. using Autodesk.AutoCAD.ApplicationServices;
  5. using Autodesk.AutoCAD.DatabaseServices;
  6. using Autodesk.AutoCAD.Geometry;
  7. using Autodesk.AutoCAD.EditorInput;
  8.  
  9. [assembly: CommandClass(typeof(Rivilis.OsnapTest))]
  10.  
  11. namespace Rivilis
  12. {
  13.  
  14.   public class OsnapTest
  15.   {
  16.     [CommandMethod("OsTest")]
  17.     public void OsTest()
  18.     {
  19.       Document doc = Application.DocumentManager.MdiActiveDocument;
  20.       if (doc == null) return;
  21.       Editor ed = doc.Editor;
  22.       while (true)
  23.       {
  24.         using (PointMonitor pMon = new PointMonitor())
  25.         {
  26.           PromptPointOptions ppo =
  27.             new PromptPointOptions("\nУкажите точку (ENTER - завершение): ");
  28.           PromptPointResult ppr = ed.GetPoint(ppo);
  29.           if (ppr.Status != PromptStatus.OK) break;
  30.           if (pMon.osnaps != 0)
  31.           {
  32.             ed.WriteMessage("\nОбъектные привязки: {0}", pMon.osnaps);
  33.             ed.WriteMessage("\nУказанная точка: {0}", pMon.pointPick);
  34.             ed.WriteMessage("\nТочка с учетом привязки: {0}", pMon.pointOsnap);
  35.             foreach (FullSubentityPath path in pMon.paths)
  36.             {
  37.               ed.WriteMessage("\nObjectIDs=");
  38.               foreach (ObjectId id in path.GetObjectIds())
  39.                 ed.WriteMessage(" {0}", id);
  40.               if (path.SubentId.IndexPtr != IntPtr.Zero)
  41.                 ed.WriteMessage(" -> SubentId = {0}",
  42.                   path.SubentId.IndexPtr);
  43.             }
  44.           }
  45.         }
  46.       }
  47.     }
  48.   }
  49.   //////////////////////////////////////////////////////////////////////////
  50.   // Класс - обертка для PointMonitor  
  51.   //////////////////////////////////////////////////////////////////////////
  52.   internal class PointMonitor : IDisposable
  53.   {
  54.     public FullSubentityPath[] paths = null;
  55.     public Point3d pointPick = Point3d.Origin;
  56.     public Point3d pointOsnap = Point3d.Origin;
  57.     public ObjectSnapMasks osnaps = (ObjectSnapMasks)0;
  58.  
  59.     public PointMonitor()
  60.     {
  61.       Document doc = Application.DocumentManager.MdiActiveDocument;
  62.       if (doc != null) {
  63.         ed = doc.Editor;
  64.         ed.TurnForcedPickOn();
  65.         ed.PointMonitor += ed_PointMonitor;
  66.       }
  67.     }
  68.     public void Dispose()
  69.     {
  70.       if (ed != null) {
  71.         ed.TurnForcedPickOff();
  72.         ed.PointMonitor -= ed_PointMonitor;
  73.       }
  74.     }
  75.     private Editor ed = null;
  76.     //////////////////////////////////////////////////////////////////////////
  77.     ///             Обработчик события PointMonitor
  78.     //////////////////////////////////////////////////////////////////////////
  79.     void ed_PointMonitor(object sender, PointMonitorEventArgs e)
  80.     {
  81.       InputPointContext context = e.Context;
  82.       if (context.PointComputed && (context.History & PointHistoryBits.ObjectSnapped) != 0)
  83.       {
  84.         // Чистим предыдущее значение
  85.         paths = null; pointOsnap = pointPick; osnaps = (ObjectSnapMasks)0;
  86.         // Привязка
  87.         osnaps = context.ObjectSnapMask;
  88.         // Точка привязки
  89.         pointOsnap = context.ObjectSnappedPoint;
  90.         // Объекты участвующие в вычислении привязки
  91.         paths = context.GetPickedEntities();
  92.       }
  93.       else
  94.       {
  95.         // Указанная пользователем точка (без учета привязок)
  96.         pointPick = context.RawPoint;
  97.       }
  98.     }
  99.   }
  100. }

Пример использования:

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 31
  • Карма: 0
Итак:
Ух, ты, здорово-то как! А я все жду, жду, когда на почту письмо придет с оповещением. То ли не пришло, то ли проглядела. Хорошо, что зашла глянула, а то так бы и ждала долго, как было обещано. Спасибо, огромное за скорость ответа. Буду разбираться, что к чему и как и  активно применять! Еще раз спасибо.
Не считайте себя умнее! (Даже если Ваш оппонент - женщина.:)))
Лучше день потерять, а потом за 2 минуты долететь!

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

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

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

  • ADN OPEN
  • Сообщений: 31
  • Карма: 0
Четыре дня прошло и никакой реакции
Сори. Я, честно, с нетерпением ждала Вашего ответа. Но ждала, что придет уведомление на почту, а его нет, сейчас еще раз проверила - не было уведомлений. Вот прям душой почувствовала, что нужно глянуть в саму тему на всякий случай. Я чуть не подпрыгнула от радости, когда увидела вчера, что ответ то уже давно есть, и постыдилась, что не проверяла раньше. Так что еще раз, огромнейшее спасибо, теперь буду знать, что не нужно ждать милостей от почты, периодически проверять ответы в теме.
Не считайте себя умнее! (Даже если Ваш оппонент - женщина.:)))
Лучше день потерять, а потом за 2 минуты долететь!