нужно при изменении объекта изменить его XData и другой объект связанный с измененнымВот пример:
_breakLineObjectOverrule.SetXDataFilter(BreakLineDescriptor.Instance.Name);
это значит что Close() вызовется только для объектов с этим приложением в xdata?Это значит, что блоки дополнительно фильтруются по наличию XData с AppName равным тому, что у меня записано в переменной BreakLineDescriptor.Instance.Name
причину б узнать почему на транзакции падаетПотому что гладиолус! :)
в "продвинутых" случаях использовать транзакцию не стоитИногда прокатывает OpenCloseTransaction, что по сути примерно тоже самое. Но в случае с overrule - только методом проб ошибок можно выявить рабочий вариант)
Иногда прокатывает OpenCloseTransaction, что по сути примерно тоже самое.Если имеется в виду, что OpenCloseTransaction - это примерно то же самое, что и транзакция, то это не так. Это её эмуляция с помощью спрятанных внутри вызовов Open и Close. Может облегчить жизнь при работе с несколькими одновременно открываемыми объектами. Но иногда из-за того, что объекты долго остаются открытыми (до самого вызова Commit) могут возникнуть ошибки. А по сути - это то же самое, что и использование Open-Close, но с интерфейсом транзакции.
Просто надо взять себе за правило - в "продвинутых" случаях использовать транзакцию не стоит: в обработчиках событий с объектами БД чертежа, в методах любых Overrule и т.п.А можно "и т.п." развернуть?
А по сути - это то же самое, что и использование Open-Closeя это и имел ввиду )
А можно и т.п. развернуть?Официальных данных по этому вопросу либо совсем нет, либо их мало. Поэтому - всё опытным путём, методом проб и ошибок. Поэтому, я стараюсь вообще не использовать транзакции. Нигде. Но это не всегда получается. Например, в Civil 3D API, с которым я чаще всего имею дело, есть несколько методов, для корректной работы которых требуется явный запуск транзакции.
Например, в Civil 3D API, с которым я чаще всего имею дело, есть несколько методов, для корректной работы которых требуется явный запуск транзакции.еще немного подробностей) какие?
еще немного подробностей) какие?Опять же - выясняется методом проб и ошибок: http://adn-cis.org/forum/index.php?topic=8589.0
GetObject с OpenCloseTransaction работает?Нет. Только с обычной транзакцией.
Т е вы не используете даже OpenCloseTransaction? ну стараетесь..Open/Close и OpenCloseTransaction - это тоже самое, но иногда важно закрыть объект/примитив принудительно в нужный момент. И в этом случае OpenCloseTransaction неудобна.
Т е "устаревший" Open/Close самый надежный выходит, если внимательно использовать)Я чаще всего использую конструкцию вида:
Спасибо за ответы)
после создания объекта еще раз возникает isModified
как его отфильтровать?
у меня вот так
Код - C# [Выбрать]
dbObject.IsModified && !dbObject.IsNewObject && dbObject.IsWriteEnabled
хотелось бы чтоб один раз попадал в эту веткуВ метод Close? Но это нереально. Труба же закрывается, значит, метод вызывается. Можно лишь проверять условия и если они неподходящие, то не выполнять обработку.
Не знаю какие еще условия можно прописать чтоб в идеале 1 раз туда зайти.Думаю, что никак...
просто нужно узнать измененную точку конца и начала трубыИзменяется пользователем или твоим кодом?
получается что по 5 раз ее перезаписываетКуда перезаписывает?
пользователь двигает, я записываю в XDataКогда пользователь двигает Close может происходить несколько раз даже без твоего кода.
получается так, что в попытке открыть соседние объекты, получаю ошибку, что один из них уже открыт для записиЗначит, придётся открывать соседние объекты в каком-то другом месте (в какой-то другой момент). Метод Close для этого не подходит, получается.
работаю с OpenCloseTransaction
Open/Close не спасет да?
как быть?
и играет ли роль когда вызывать base.Close(dbObject) до своих инструкций или после?Смотря что эти инструкции делают.
и играет ли роль когда вызывать base.Close(dbObject) до своих инструкций или после?Только если ты его же пытаешься открыть.
В методе Open - получение начальной и конечной точки. В методе Close - снова их получаем и сравниваем с теми значениями, которые получены в Open. Если не совпадают - перезаписываем XData.
что тогда словарь создавать и соотносить точки с конкретным объектом, их и сравнивать?Конечно. А как иначе?
наивно рассчитывал..Конечно наивно рассчитывал. Если используют транзакцию, то условно говоря идут последовательные Open для всех объектов, открываемых в транзакции, а затем последовательные Close при вызове Transaction.Commit().
Логично, понял!Думаю, что подойдёт.
еще одно уточнение словарь такого вида Dictionary<ObjectId,Point3d[]> ?
или можно прям вот так Dictionary<Pipe,Point3d[]> ?Нет. Нарвёшься, на ошибки.
GetObject с OpenCloseTransaction работает?
Нет. Только с обычной транзакцией.
Но универсальнее и надёжнее передавать ObjectIdПри условии, что этот объект еще не открыт.