Сообщество программистов Autodesk в СНГ

ADN Club => Civil 3D API => Тема начата: vermesser от 18-02-2016, 20:05:02

Название: Не перестраивается поверхность из кода
Отправлено: vermesser от 18-02-2016, 20:05:02
Здравствуйте!

У меня такая проблема:
Приходится обновлять вручную.
Использование surface.Rebuild() перед закрытием транзакции не помогает.
Если исключить добавление границы, то всё проходит нормально, но в этом нет никакого смысла.
Название: Re: Не перестраивается поверхность из кода
Отправлено: Александр Ривилис от 18-02-2016, 22:23:43
Вместо всего того, что ты написал, предоставь тестовый проект, в котором это происходит. Тогда сможешь рассчитывать на помощь.
Название: Re: Не перестраивается поверхность из кода
Отправлено: Дмитрий Загорулькин от 19-02-2016, 12:42:59
Присоединяюсь к замечанию Александра Нумовича. Вы поймите, что для того, чтобы проверить проблему, нужно будет создать чертеж, в нем поверхность и др. нужные объекты. Потом нужно будет написать весь код, который выполняет описанные Вами шаги и дальше уже смотреть что там может быть не так. Так как времени свободного немного - мало кто решится этим заниматься. Есть, конечно шанс, что кто-то с этим сталкивался и уже сразу готов указать в чем проблема. Буду очень рад, если такой человек: а) есть, б) посещает форум, в) готов помочь. Но не сильно бы рассчитывал на такой счастливый случай :)
Название: Re: Не перестраивается поверхность из кода
Отправлено: German от 19-02-2016, 14:17:27
Во-первых, surface.Rebuild() точно должен быть в теле транзакции. У меня вообще только так работало (пару лет назад)
Во-вторых, переключатель "Перестраивать автоматически" стоит (он программно не ставится, надо вручную)?
В-третьих, надо проверить двумя surface.Rebuild() после точек и после границы
В-четвертых, аналогично, надо проверить двумя транзакциями с surface.Rebuild()
Название: Re: Не перестраивается поверхность из кода
Отправлено: vermesser от 19-02-2016, 20:44:42
Извините, вот исходники.
Название: Re: Не перестраивается поверхность из кода
Отправлено: vermesser от 19-02-2016, 22:43:18
Во-первых, surface.Rebuild() точно должен быть в теле транзакции. У меня вообще только так работало (пару лет назад)
Во-вторых, переключатель "Перестраивать автоматически" стоит (он программно не ставится, надо вручную)?
В-третьих, надо проверить двумя surface.Rebuild() после точек и после границы
В-четвертых, аналогично, надо проверить двумя транзакциями с surface.Rebuild()
Перенос surface.Rebuild в транзакцию не помогает.
Переключатель "Перестраивать автоматически" изначально стоять не может, так как изначально поверхности нет.
Rebuild после точек и после поверхности не помогает.
Две транзакции не помогают.

Заметил сейчас, что если в качестве границы добавлять не ObjectIdCollection, а Point3dCollection, то всё нормально.
Название: Re: Не перестраивается поверхность из кода
Отправлено: Александр Ривилис от 20-02-2016, 00:26:38
Я внимательно не рассматривал, но обратил внимание на следующую строку:
Код - C# [Выбрать]
  1. struct.Closed = ln.Closed
Так как struct потом используется в качестве внешней границы, то должно быть:
Код - C# [Выбрать]
  1. struct.Closed = True
Название: Re: Не перестраивается поверхность из кода
Отправлено: vermesser от 20-02-2016, 00:58:46
Если сделать так, то не поможет, т.к. Closed - свойство внутреннего класса  SurfaceLine:
Код - vb.net [Выбрать]
  1. Public ReadOnly Property Closed As Boolean
И для внешней границы свойство как раз true.

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

то он у меня сработал как надо и без ошибок, поэтому я его не стал выкладывать, а выложил оригинал.
Не могу понять, где тут разница.
В тестовом проекте даже нет вызова функции, которая перестраивает поверхность.
Название: Re: Не перестраивается поверхность из кода
Отправлено: Александр Ривилис от 20-02-2016, 01:21:16
1. Здесь все точки с одной координатой Z
2. Здесь добавляется одна граница.
На первый взгляд ничего больше я не увидел.
Название: Re: Не перестраивается поверхность из кода
Отправлено: vermesser от 21-02-2016, 15:06:20
Видимо ошибка как-то связана с Polyline3d - то есть если в качестве внешней границы поверхности добавлять Point3dCollection,
а не ObjectIdCollection (содержащий Polyline3d), то всё нормально.
Если вообще не добавлять границу, то тоже всё нормально.
Название: Re: Не перестраивается поверхность из кода
Отправлено: Александр Ривилис от 21-02-2016, 15:11:09
Видимо ошибка как-то связана с Polyline3d.
Я не анализировал что у тебя за точки. У тебя случайно не получается самопересекающаяся граница?
Название: Re: Не перестраивается поверхность из кода
Отправлено: vermesser от 21-02-2016, 15:36:45
Видимо ошибка как-то связана с Polyline3d.
Я не анализировал что у тебя за точки. У тебя случайно не получается самопересекающаяся граница?
Нет.
Название: Re: Не перестраивается поверхность из кода
Отправлено: vermesser от 21-02-2016, 16:21:14
Если вынести добавление границ и структурных линий в отдельную транзакцию, то ошибки не возникает.
.Rebuild не нужен, если ничего из поверхности не удалять.
Название: Re: Не перестраивается поверхность из кода
Отправлено: Александр Ривилис от 21-02-2016, 17:51:04
Если вынести добавление границ и структурных линий в отдельную транзакцию, то ошибки не возникает.
А ведь об этом тебе German намекал в самом начале.
Название: Re: Не перестраивается поверхность из кода
Отправлено: vermesser от 21-02-2016, 18:34:41
Если вынести добавление границ и структурных линий в отдельную транзакцию, то ошибки не возникает.
А ведь об этом тебе German намекал в самом начале.
Да, наверное, я что-то делал не так.