Не перестраивается поверхность из кода

Автор Тема: Не перестраивается поверхность из кода  (Прочитано 7186 раз)

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

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

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

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 2
Здравствуйте!

У меня такая проблема:
  • ...
  • Открывается транзакция.
  • Запрашивается группа точек.
  • Используя коды из описаний точек, автоматически создаётся 3D полилиния - будущая граница поверхности.
  • Создаётся поверхность.
  • В поверхность добавляются точки из группы.
  • В поверхность добавляется граница.
  • Закрывается транзакция.
  • ...
  • Захожу в область инструментов, а у созданной поверхности висит статус "Поверхность устарела".
Приходится обновлять вручную.
Использование surface.Rebuild() перед закрытием транзакции не помогает.
Если исключить добавление границы, то всё проходит нормально, но в этом нет никакого смысла.
« Последнее редактирование: 18-02-2016, 20:36:27 от vermesser »

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

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Присоединяюсь к замечанию Александра Нумовича. Вы поймите, что для того, чтобы проверить проблему, нужно будет создать чертеж, в нем поверхность и др. нужные объекты. Потом нужно будет написать весь код, который выполняет описанные Вами шаги и дальше уже смотреть что там может быть не так. Так как времени свободного немного - мало кто решится этим заниматься. Есть, конечно шанс, что кто-то с этим сталкивался и уже сразу готов указать в чем проблема. Буду очень рад, если такой человек: а) есть, б) посещает форум, в) готов помочь. Но не сильно бы рассчитывал на такой счастливый случай :)

Оффлайн German

  • ADN Club
  • **
  • Сообщений: 84
  • Карма: 13
Во-первых, surface.Rebuild() точно должен быть в теле транзакции. У меня вообще только так работало (пару лет назад)
Во-вторых, переключатель "Перестраивать автоматически" стоит (он программно не ставится, надо вручную)?
В-третьих, надо проверить двумя surface.Rebuild() после точек и после границы
В-четвертых, аналогично, надо проверить двумя транзакциями с surface.Rebuild()

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

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 2
Извините, вот исходники.

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

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 2
Во-первых, surface.Rebuild() точно должен быть в теле транзакции. У меня вообще только так работало (пару лет назад)
Во-вторых, переключатель "Перестраивать автоматически" стоит (он программно не ставится, надо вручную)?
В-третьих, надо проверить двумя surface.Rebuild() после точек и после границы
В-четвертых, аналогично, надо проверить двумя транзакциями с surface.Rebuild()
Перенос surface.Rebuild в транзакцию не помогает.
Переключатель "Перестраивать автоматически" изначально стоять не может, так как изначально поверхности нет.
Rebuild после точек и после поверхности не помогает.
Две транзакции не помогают.

Заметил сейчас, что если в качестве границы добавлять не ObjectIdCollection, а Point3dCollection, то всё нормально.
« Последнее редактирование: 19-02-2016, 23:42:01 от vermesser »

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Я внимательно не рассматривал, но обратил внимание на следующую строку:
Код - C# [Выбрать]
  1. struct.Closed = ln.Closed
Так как struct потом используется в качестве внешней границы, то должно быть:
Код - C# [Выбрать]
  1. struct.Closed = True
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 2
Если сделать так, то не поможет, т.к. Closed - свойство внутреннего класса  SurfaceLine:
Код - vb.net [Выбрать]
  1. Public ReadOnly Property Closed As Boolean
И для внешней границы свойство как раз true.

Я когда быстренько накидал для вас тестовый проект:
Извините, вам запрещён просмотр содержимого спойлеров.

то он у меня сработал как надо и без ошибок, поэтому я его не стал выкладывать, а выложил оригинал.
Не могу понять, где тут разница.
В тестовом проекте даже нет вызова функции, которая перестраивает поверхность.

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

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

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

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 2
Видимо ошибка как-то связана с Polyline3d - то есть если в качестве внешней границы поверхности добавлять Point3dCollection,
а не ObjectIdCollection (содержащий Polyline3d), то всё нормально.
Если вообще не добавлять границу, то тоже всё нормально.

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

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

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

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 2
Видимо ошибка как-то связана с Polyline3d.
Я не анализировал что у тебя за точки. У тебя случайно не получается самопересекающаяся граница?
Нет.

Отмечено как Решение vermesser 21-02-2016, 16:21:18

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

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 2
Если вынести добавление границ и структурных линий в отдельную транзакцию, то ошибки не возникает.
.Rebuild не нужен, если ничего из поверхности не удалять.
« Последнее редактирование: 22-02-2016, 23:35:19 от vermesser »

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

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

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

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 2
Если вынести добавление границ и структурных линий в отдельную транзакцию, то ошибки не возникает.
А ведь об этом тебе German намекал в самом начале.
Да, наверное, я что-то делал не так.