DrawableOverrule и Solid3d

Автор Тема: DrawableOverrule и Solid3d  (Прочитано 19563 раз)

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

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

Оффлайн Алексей КузинАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 116
  • Карма: 8
DrawableOverrule и Solid3d
« : 17-02-2016, 12:57:50 »
использую DrawableOverrule для DuctFitting.

Код - C# [Выбрать]
  1. public override void ViewportDraw(Drawable drawable, ViewportDraw vd)
  2.         {
  3.             Solid3d Solidd = new Solid3d();
  4.             Solidd.CreateBox(100,100,100);//для примера
  5.  
  6.             vd.Geometry.Draw(Solidd);
  7.  
  8.             Solidd.Dispose();
  9.  
  10.             base.ViewportDraw(drawable, vd);
  11.         }

в отображении "2d Wireframe"  всё хорошо. стоит переключиться на "Shaded" или любой другой - солид пропадает и начинает вести себя неадекватно.
« Последнее редактирование: 17-02-2016, 14:12:07 от LmRArtist »

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 534
  • Карма: 117
Re: DrawableOverrule и Solid3d
« Ответ #1 : 17-02-2016, 13:44:53 »
солид пропадает и начинает вести себя неадекватно.
неадекватно это как?

попробуй
//Solidd.Dispose();

или
base.ViewportDraw(drawable, vd);
Solidd.Dispose();

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: DrawableOverrule и Solid3d
« Ответ #2 : 17-02-2016, 14:01:26 »
LmRArtist
Отформатируй код, как указано у меня в подписи.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей КузинАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 116
  • Карма: 8
Re: DrawableOverrule и Solid3d
« Ответ #3 : 17-02-2016, 14:14:42 »
Цитировать
неадекватно это как?

Например: переключаю на "Shaded" - пропал.   делаю OBJRELUPDATE - появился.   масштабирую, переключаю проекции - пропадает.

перенос Dispose() не помог    :( :(

а если Dispose()  убрать вовсе - проблема вроде как решается. Но не думаю что если убрать dispose() хорошая идея.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: DrawableOverrule и Solid3d
« Ответ #4 : 17-02-2016, 14:20:49 »
Попробуй вместо:
Код - C# [Выбрать]
  1. vd.Geometry.Draw(Solidd);
использовать:
Код - C# [Выбрать]
  1. Solidd.ViewportDraw(vd);
Скорее всего не поможет и скорее всего это ограничение, которое накладывает DrawableOverrule.
Если подготовишь тестовый проект - отправлю в ADN DevHelp. Возможно они смогут помочь.

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

Оффлайн Алексей КузинАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 116
  • Карма: 8
Re: DrawableOverrule и Solid3d
« Ответ #5 : 17-02-2016, 14:26:24 »
Цитировать
Попробуй вместо:
Код - C# [Выбрать]
vd.Geometry.Draw(Solidd);
использовать:
Код - C# [Выбрать]
Solidd.ViewportDraw(vd);
Скорее всего не поможет и скорее всего это ограничение, которое накладывает DrawableOverrule.

не помогло. перестало отображать даже в "2D Wireframe"

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 534
  • Карма: 117
Re: DrawableOverrule и Solid3d
« Ответ #6 : 17-02-2016, 14:38:16 »
убрать вовсе - проблема вроде как решается. Но не думаю что если убрать dispose() хорошая идея.
На самом деле Dispose() это несколько сложная тема. Сложнее, чем кажется на первый взгляд.
И описана не очень хорошо.

Для разных объектов:
1 нужно вызывать обязательно
2 можно проигнорировать
3 управляется транзакцией
4 нельзя вызывать, т.к. управляется автокадом.
5 необходимо предотвратить вызов

в твоем случае, возможно 4-5
в 5 случае, возможно нужно вынести из метода. И не вызывать Dispose
static Solid3d Solidd = new Solid3d();

Оффлайн Алексей КузинАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 116
  • Карма: 8
Re: DrawableOverrule и Solid3d
« Ответ #7 : 17-02-2016, 16:22:15 »
добавил cash.

Код - C# [Выбрать]
  1. Dictionary<long, Solid3d> cash = new Dictionary<long, Solid3d>();
  2.  
  3.         public override void ViewportDraw(Drawable drawable, ViewportDraw vd)
  4.         {
  5.             Solid3d Solidd = new Solid3d();
  6.             Solidd.CreateBox(100, 100, 100);//для примера
  7.  
  8.             long key = drawable.Id.Handle.Value;
  9.             if (!cash.ContainsKey(key))
  10.                 cash.Add(key, Solidd);
  11.             else
  12.                 cash[key] = Solidd;
  13.  
  14.             vd.Geometry.Draw(Solidd);
  15.  
  16.             base.ViewportDraw(drawable, vd);
  17.         }

Возникают пропадания когда приближаю/отдаляю объекты.  В остальном вроде работоспособно, спасибо Дмитрию за советы  8)

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: DrawableOverrule и Solid3d
« Ответ #8 : 17-02-2016, 18:31:31 »
Пару замечаний по коду.
1) А почему cash не static?
2) Если уж ты обнаружил, что cash.ContainsKey(key), то зачем вызывать Solidd.CreateBox(100, 100, 100), если этот объект у тебя уже есть в cash и ты можешь им воспользоваться?
3) Вместо drawable.Id.Handle.Value лучше пользоваться drawable.Id (т.е. ObjectId). На случай, когда у тебя открыты несколько чертежей.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: DrawableOverrule и Solid3d
« Ответ #9 : 17-02-2016, 21:22:25 »
Я сделал тестовый проект, записал видео и отправил вопрос в ADN DevHelp.
Подозреваю, что нормально Solid3D может отрисовываться в VisualStyle != 2DWireFrame только в случае если он Database Resident (т.е. содержится в чертеже). В данном случае это не так.
Когда будет ответ - сообщу.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей КузинАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 116
  • Карма: 8
Re: DrawableOverrule и Solid3d
« Ответ #10 : 18-02-2016, 15:15:03 »
Спасибо, Александр.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: DrawableOverrule и Solid3d
« Ответ #11 : 18-02-2016, 15:22:00 »
Спасибо, Александр.
Хотел у тебя уточнить. У тебя именно так появляются и пропадают "ящики", как у меня на видео:

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

Оффлайн Алексей КузинАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 116
  • Карма: 8
Re: DrawableOverrule и Solid3d
« Ответ #12 : 18-02-2016, 15:41:36 »
Да. именно так как у вас на видео.
Есть подозрение что при scale есть определенные участки (уровни детализации). И нужно сохранять Solid3d в cash для каждого из этих участков. Если вы понимаете о чем речь. Возможно я не прав.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: DrawableOverrule и Solid3d
« Ответ #13 : 18-02-2016, 15:48:53 »
И нужно сохранять Solid3d в cash для каждого из этих участков.
Ну это был бы уже совсем перебор. И так их плодится слишком много, с учетом того, что в нормальной ситуации в конце ViewportDraw/WorldDraw для них должен вызываться Dispose().
Пока из ADN DevHelp мне предложили при включении/выключении Overruling запускать команду Regen3:
Код - C# [Выбрать]
  1. doc.SendStringToExecute("_REGEN3\n", true, false, false);
На всякий случай попробуй, но думаю что это из другой оперы. А сейчас проверить у меня возможности нет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей КузинАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 116
  • Карма: 8
Re: DrawableOverrule и Solid3d
« Ответ #14 : 18-02-2016, 16:04:44 »
Цитировать
Ну это был бы уже совсем перебор.
тоже так думаю.

Код - C# [Выбрать]
  1. doc.SendStringToExecute("_REGEN3\n", true, false, false);

REGEN3 спасает конечно ситуацию, если рассматривать вариант когда Solid3d создается каждый раз. в этом случае команда REGEN3 вызывает перерисовку и Solid3d будет подменяться в cash. (к слову для "старого" Solid3d который был в cash вызываю dispose())

Цитировать
при включении/выключении Overruling
не совсем корректно только в этих ситуациях будет вызывать. Желательно чтобы при включенном Overruling корректно работало масштабирование, а оно не всегда вызывает перерисовку...  :-\ :-\ :-\