солид пропадает и начинает вести себя неадекватно.неадекватно это как?
неадекватно это как?
Попробуй вместо:
Код - C# [Выбрать]
vd.Geometry.Draw(Solidd);
использовать:
Код - C# [Выбрать]
Solidd.ViewportDraw(vd);
Скорее всего не поможет и скорее всего это ограничение, которое накладывает DrawableOverrule.
убрать вовсе - проблема вроде как решается. Но не думаю что если убрать dispose() хорошая идея.На самом деле Dispose() это несколько сложная тема. Сложнее, чем кажется на первый взгляд.
Спасибо, Александр.Хотел у тебя уточнить. У тебя именно так появляются и пропадают "ящики", как у меня на видео:
И нужно сохранять Solid3d в cash для каждого из этих участков.Ну это был бы уже совсем перебор. И так их плодится слишком много, с учетом того, что в нормальной ситуации в конце ViewportDraw/WorldDraw для них должен вызываться Dispose().
Ну это был бы уже совсем перебор.тоже так думаю.
при включении/выключении Overrulingне совсем корректно только в этих ситуациях будет вызывать. Желательно чтобы при включенном Overruling корректно работало масштабирование, а оно не всегда вызывает перерисовку... :-\ :-\ :-\
REGEN3 спасает конечно ситуацию, если рассматривать вариант когда Solid3d создается каждый раз. в этом случае команда REGEN3 вызывает перерисовку и Solid3d будет подменяться в cash. (к слову для "старого" Solid3d который был в cash вызываю dispose())Не понял. Ты внутри ViewportDraw вызываешь запуск команды REGEN3? Это не годится в любом случае.
А чем эта команда от обычного REGEN отличается?
А чем эта команда от обычного REGEN отличается?Команда недокументированная. Судя по всему отличие от REGEN в том, что REGEN работает только с примитивами в базе данных, а REGEN3 и с транзитной графикой - заставляет её перерисовываться.
Если drawing сохранить, то при масштабировании Solid3d пропадать не будет.Не понял. Поясни о чем ты?
Цитата: LmRArtist от 18-02-2016, 18:36:37
Если drawing сохранить, то при масштабировании Solid3d пропадать не будет.
Не понял. Поясни о чем ты?
Вы должны хранить Solid3D в памяти. Это ожидаемое (запланированное) поведение. AutoCAD в различных условиях сохраняет Drawable в своем списке для оптимального отображения. Если Solid3D удален из памяти, то AutoCAD не сможет его показать.
Кстати при вашем варианте падает автокад, из-за того что для Solid3d не вызывается Dispose(). в Output валит сообщения - "Forgot to call Dispose? (Autodesk.AutoCAD.DatabaseServices.Solid3d): DisposableWrapper"Я в курсе. Это лишь тестовый пример. В какой момент вызывать Dispose нужно продумать.
В какой момент вызывать Dispose нужно продумать.Еще неплохо бы выяснить чем отличаются:
Можно ли ADN потрясти на этот счет?Не вижу в этом смысла. Исчерпывающей информации не будет, так что в любом случае приходится экспериментировать.
Так же нужно добавить очистку кеша при удалении объектов и наверное еще ряде случаев, надо продумать.+При удалении объектов я бы не советовал очищать кеш. Причина в том, что команды OOPS, U и UNDO могут восстановить этот объект, а у тебя относящийся к нему Solid3d уже удалён.
Может кто подскажет есть что то подобное, но чтобы не вызывалось для всего дровинга, а конкретно по объектом. В частности Solid3d которых нет в базе.попробуй вызывать метод RecordGraphicsModified(true);
REGEN оптимизирован чтобы перерисовывать только те примитивы, которые отмечены как измененные.RecordGraphicsModified(true) как-раз помечает, что entity изменен и его нужно перерисовать.
А какова вероятность того, что в нескольких одновременно открытых чертежах будут разные объекты с одинаковым id?Насколько мне известно, ObjectId уникально в рамках сессии.
Может лучше использовать не id, а handle?А вот Handle как раз-таки могут быть одинаковыми в разных чертежах.
А какова вероятность того, что в нескольких одновременно открытых чертежах будут разные объекты с одинаковым id? Может лучше использовать не id, а handle?А что понимать под id? Если ObjectId, то они уникальны, так как хранят в себе информацию о базе данных: ObjectId.Database
Но уникальность не означает, что их следует сравнивать при помощи '=='А что в таком случае будет возвращать для двух ObjectId, у которых одинаковые числовые значения?
Очевидно true. Так что проверять теоретически нужно не так.ЦитироватьНо уникальность не означает, что их следует сравнивать при помощи '=='А что в таком случае будет возвращать для двух ObjectId, у которых одинаковые числовые значения?Код - C# [Выбрать]
cash.ContainsKey(id)
Надо смотреть как ContainsKey сравнивает ключи, возможно, что не с помощью ==, а через EqualsНе поможет. Я посмотрел все методы ObjectId. Ни один из них не использует сравнение Database:
Андрей же откопал в документации, что в ObjectId ссылается на адрес в памяти. Соответственно, он может быть только один на один объект.Там всё-таки всё хитрее. Я бы не стал полагаться на это.
Старый кубик из кэша удалять?Если он не используется для других примитивов - удалять. И рисовать новый и закидывать в кэш. Думаю что так.