Проблема с отображением триангуляции.

Автор Тема: Проблема с отображением триангуляции.  (Прочитано 2302 раз)

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

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

  • ADN OPEN
  • Сообщений: 6
  • Карма: 0
Здравствуйте, ситуация следующая (для удобства непосредственно проблемы буду выделять):
1. Пишу дополнение с функцией подсчёта объёмов через триангуляционные сети аля-САМАРА. Всё что связано с расчётами, построением триангуляции и прочим готово и даже почти не ломается. Триангуляция состоит из следующих частей:
1.1 Пункт - содержит в себе координаты X,Y,Z.
1.2 Отрезок - содержит в себе два пункта и ссылки на два треугольника.
1.3 Треугольник - содержит в себе три отрезка.
2. Проблема в отображении всех сущностей триангуляции в автокаде. По моей задумке должно быть следующее:
2.1 Триангуляция должна только отображаться так, чтобы редактировать её было возможно только специальными командами (сейчас это реализовано через простую проверку есть ли сущность в специальном списке). Очень хочется реализовать этот функционал через временную графику, но я, видимо, не так её использую и через какое-то время автокад выдаёт сообщение что произошла ошибка и закрывается. Ниже представлю старый код для создания треугольника (сейчас создал классы-обёртки, но через них та же проблема), т.к. только с ними возникает вылет. Другие сущности просто отказываются показываться больше чем на секунду :,).
2.2 Триангуляция ни коим образом не должна влиять на данные в чертеже. Т.е. она не должна сохраняться. Это ещё одна причина в копилку временной графики, а то сейчас приходится при каждом сохранении через костыли удалять триангуляции и тут же их отрисовывать в соответствующих документах.

Код создания треугольника:
       
private void CreateTransientFaceFromTriangle(Triangle trian, Transaction tr, BlockTableRecord btr, int colorIndex = 3)
        {
            Point[] trianPoints = trian.GetPoints();
            Face nFace = new Face(MathPointToPoint3d(trianPoints[0]), MathPointToPoint3d(trianPoints[1]), MathPointToPoint3d(trianPoints[2]), false, false, false, false);
            nFace.ColorIndex = colorIndex;
            TransientManager.CurrentTransientManager.AddTransient(nFace, TransientDrawingMode.Main, 0, new IntegerCollection());
        }

Заранее спасибо за ответы.

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
Ещё одни изобретатель Civil'а. Зачем???

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

  • ADN OPEN
  • Сообщений: 6
  • Карма: 0
Ещё одни изобретатель Civil'а. Зачем???
Может для дипломного проекта? Хотя я уже и правда 10 раз успел пожалеть что выбрал именно это. В любом случае осталось доделать мелочь.

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

  • ADN OPEN
  • Сообщений: 6
  • Карма: 0
В общем, понял что вопрос немного размытый, перефразирую:
Как правильно создать объект временной графики из Face так, чтобы он мог просуществовать пока документ не закроют и при этом не выкидывалось исключение через какое-то время?

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Совет №1. В общем случае, если хотите оперативной помощи, выкладывайте полный проект с минимальным функционалом, на котором можно протестировать проблему. Брать предоставленный кусок кода и делать для него недостающую "обвязку" сильно некогда. Может, конечно, повезёт и кто-то точно с такой же проблемой сталкивался и сможет сразу подсказать. Но не всегда так получается.
Совет №2. Поищите по форуму, например, по слову "TransientManager". Топиков на эту темы было несколько уже, что-то скорее всего найдёте полезное. Если на форуме ничего не нашлось - гуглите. Гугл-фу сильно полезный навык в разработке. Если ничего полезного не нашлось - отпишите тут, мол, нашёл такую-то и такую тему на форуме и в гугле, но мне не помогло потому что... Чтобы участники видели, что вы не просто пришли с надеждой что кто-то за вас всё это сделает, а сами стараетесь. Тогда сильно выше шанс, что кто-то подключится и поможет в поиске. Если поиски не помогут - тогда следуйте совету №1.

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

  • ADN OPEN
  • Сообщений: 6
  • Карма: 0
Совет №1. В общем случае, если хотите оперативной помощи, выкладывайте полный проект с минимальным функционалом, на котором можно протестировать проблему. Брать предоставленный кусок кода и делать для него недостающую "обвязку" сильно некогда. Может, конечно, повезёт и кто-то точно с такой же проблемой сталкивался и сможет сразу подсказать. Но не всегда так получается.
Совет №2. Поищите по форуму, например, по слову "TransientManager". Топиков на эту темы было несколько уже, что-то скорее всего найдёте полезное. Если на форуме ничего не нашлось - гуглите. Гугл-фу сильно полезный навык в разработке. Если ничего полезного не нашлось - отпишите тут, мол, нашёл такую-то и такую тему на форуме и в гугле, но мне не помогло потому что... Чтобы участники видели, что вы не просто пришли с надеждой что кто-то за вас всё это сделает, а сами стараетесь. Тогда сильно выше шанс, что кто-то подключится и поможет в поиске. Если поиски не помогут - тогда следуйте совету №1.

1. Полный комплект выложить для меня проблемно, т.к., если повезёт, то скоро код окажется под NDA (а тот кусочек что выложил - совсем старый и уже исключён из основного проекта) + проблема не моментальная, обычно возникает где-то через 1-2 часа от момента создания временной графики, а может вообще не возникнуть, так что "сильно некогда" будет так и так.

2. Сюда я как раз таки написал от отчаяния что не могу решить проблему более полугода и уже успел изменить концепцию с временной графики на обычную с морем костылей. Облазил и стак, и форум автодеска, и keanw.com и, собственно, этот форум. Единственное что я нашёл прямо по теме вылетов - старенький пост с typepad в котором говорится при добавлении как в коде ниже автокад вылетает, вот только там нет ни описания причин, ни правильного способа создания (хотя я и подозреваю что там имелось в виду что не используется Transaction).

P.S. Заранее ответ на вопрос: "зачем же задавать вопрос, если уже реализовано другое решение?" - потому что оно кривое и непроизводительное, а время на перепись ещё есть.

Код - C# [Выбрать]
  1. [CommandMethod("CrashAutoCAD13")]
  2. public static void CrashAutoCAD13_Method()
  3. {
  4.     Editor ed = MgdAcApplication.DocumentManager.MdiActiveDocument.Editor;
  5.     try
  6.     {
  7.             TransientManager.CurrentTransientManager.AddTransient(
  8.                 new Line(new Point3d(0, 0, 0), new Point3d(10, 10, 0)),
  9.                 TransientDrawingMode.Main, 0, new IntegerCollection());
  10.     }
  11.     catch (System.Exception ex)
  12.     {
  13.         ed.WriteMessage(Environment.NewLine + ex.Message);
  14.     }
  15. }

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Как минимум, не учтено это: https://adn-cis.org/forum/index.php?topic=2827.msg10197#msg10197

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

  • ADN OPEN
  • Сообщений: 6
  • Карма: 0
Как минимум, не учтено это: https://adn-cis.org/forum/index.php?topic=2827.msg10197#msg10197

Тут уж я и правда выбрал неправильный пример кода. На статьи про то что следует добавлять объекты сначала в базу данных натыкался, вот только тогда после удаления и повторной отрисовки  50/50 вылетает ошибка (помню как перепробовал несколько методов удаления и только через базу и только через transient manager и от туда и от туда одновременно). Использовать Jig не стал из-за того что не разобрался как при таких раскладах реализовать удаление/изменение точек/рёбер/треугольников без нужды фиксировать камеру, а с временной графикой наткнулся на это: https://www.keanw.com/2012/09/creating-reactive-transient-autocad-geometry-using-net.html


Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Я же именно на сообщение давал ссылку. Не надо в базу добавлять, надо вот что делать:
Цитировать
Только одно уточнение обязательно сделать глобальными/статическими, если хотим использовать объекты после завершения работы функции.
Иначе в 2014 версии происходит крах "unhandled access violation reading" через различные промежутки времени.
Вероятнее как раз во время работы сборщика мусора.

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

  • ADN OPEN
  • Сообщений: 6
  • Карма: 0
Дмитрий Загорулькин

Сонный, не так понял (всё ещё спасибо за ответы). Пробовал заносить объекты в статический массив, всё равно выдаёт ошибку через какое-то время (помню что быстрее если много удалять\редактировать), уже не помню какую, но по моему не "ungandled access" её выдавало после того как я начал пытаться через BlockTableRecord и Transaction объекты сохранять и потом в TransientManager передавать.


« Последнее редактирование: 13-05-2022, 19:43:39 от Ventiron »