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

ADN Club => AutoCAD .NET API => Тема начата: Atomohod от 26-02-2020, 21:28:33

Название: Определить менялся ли объект на чертеже между сессиями
Отправлено: Atomohod от 26-02-2020, 21:28:33
Здравствуйте!
Интересует один вопрос- возможно ли как-нибудь определить менялся ли объект на чертеже между сессиями? Есть чертеж, в нем 500 объектов, происходит работа с чертежом- что-то добавляется, что-то модифицируется(например длина линии), что-то удаляется. Чертеж закрывается. Сессия окончена. На следующий день все то же самое. Наступает час x и надо понять что подвергалось изменению в чертеже. Важно-чертеж один и тот же. С добавлением/удалением я примерно решил так - собрать все HAndle из раннего чертежа, найти разницу и сравнить ее со списком Handle из раннего чертежа, затем из текущего. Но как определить что объекты с тем же HAndle, то есть не добавленные или удаленные, а существующие и там и там, подвергались модификации?
Название: Re: Определить менялся ли объект на чертеже между сессиями
Отправлено: Александр Ривилис от 26-02-2020, 21:35:02
Но как определить что объекты с тем же HAndle, то есть не добавленные или удаленные, а существующие и там и там, подвергались модификации?
Хранить между сессиями их свойства.
Название: Re: Определить менялся ли объект на чертеже между сессиями
Отправлено: Atomohod от 26-02-2020, 22:11:21
Хранить между сессиями их свойства.
А где? В сторонней базе на SQL server или можно по-другому?
Название: Re: Определить менялся ли объект на чертеже между сессиями
Отправлено: Дмитрий Загорулькин от 26-02-2020, 22:27:14
А где? В сторонней базе на SQL server или можно по-другому?
Где угодно. Можно в сторонней базе на SQL, можно прямо в чертеже ну и тд и тп - на что фантазии хватит.
Если есть две версии чертежей - до модификации и после, то можно просто сравнивать на предмет изменений. Даже есть специальный инструмент в AutoCAD - DWG Compare. Сейчас у меня некоторое де-жа-вю: вроде совсем недавно эту тему здесь обсуждали уже?
Название: Re: Определить менялся ли объект на чертеже между сессиями
Отправлено: Александр Ривилис от 26-02-2020, 22:38:03
Сейчас у меня некоторое де-жа-вю: вроде совсем недавно эту тему здесь обсуждали уже?
И неоднократно и в разных контекстах.
Atomohod,
Кстати, есть операции, которые позволяют изменить метки (Handle) примитива. Например, команда _WBLOCK, не говоря уже о программных штучках типа DBObject.SwapIdWith и DBObject.HandOverTo
Название: Re: Определить менялся ли объект на чертеже между сессиями
Отправлено: Atomohod от 26-02-2020, 22:43:04
де угодно. Можно в сторонней базе на SQL, можно прямо в чертеже ну и тд и тп - на что фантазии хватит.
Меня беспокоит объем файла, если я для всех объектов буду хранить все их свойства в течение всего жизненного цикла чертежа то файл будет весом под 10 Гб (сам файл сейчас весит 45 Мб). Или эти данные можно хранить в сжатом виде?
Название: Re: Определить менялся ли объект на чертеже между сессиями
Отправлено: Александр Ривилис от 27-02-2020, 00:31:38
сам файл сейчас весит 45 Мб
Это 500 объектов? Сколько же там мусора??? А хранить лучше вне чертежа.
Название: Re: Определить менялся ли объект на чертеже между сессиями
Отправлено: Александр Ривилис от 27-02-2020, 00:35:50
Или эти данные можно хранить в сжатом виде?
Вот тут всё и упирается в вопрос - что в данном случае данные? Если не разобраться с набором свойств, которые нужно сравнивать - то незачем и браться за эту задачу. Кстати, а что делать в таком случае:
1. Есть отрезок длиной 100.
2. Его укоротили до 80.
3. Его удлинили до 100.
Считать ли что с ним ничего не делали или считать, что что-то делали, но ничего не изменилось?
Постановка задачи столь расплывчата, что до начала программирования ее нужно очень хорошо формализовать.
Название: Re: Определить менялся ли объект на чертеже между сессиями
Отправлено: Привалов Дмитрий от 27-02-2020, 07:21:27
Наступает час x и надо понять что подвергалось изменению в чертеже
Подобные задачи часто возникают в головах у руководства, обсуждаются и благополучно умирают. И не только применительно к чертежам.

Дело в том, что начинаются они с фразы "неплохо бы увидеть что изменилось", а реализация им представляется так: "нажал кнопку и тебе показалось что изменилось".

На деле в ходе обсуждения часто выясняется, что:
1. Кнопка должна быть сложным фильтром с настройками, учитывать изменение слоев/не учитывать и т.д.
2. Предоставленный результат необходимо кому-то анализировать.
3. Обычно оказывается что всем некогда и "заказчики новшества" не готовы тратить свое время. Т.е. готовы только на то чтобы спросить кого-то а что изменилось и им ответили.
4. Часто выясняется, что это нужно очень редко, когда идет обмен с внешним заказчиком. Когда возвращается некий высланный им чертеж-задание с надписью мы "что-то поменяли", примите в работу. Возникает неуверенность, что именно.

Алгоритм решения, подойдет всем в 95% случаев:
1. За разработку программы не браться!
2. Предложить сохранять копии файлов и использовать готовые средства сравнения файлов.
3. Максимум сделать инструкцию.
4. Выждать месяца три и спросить пользуются нет. Получить ответ один раз использовали, потом некогда.
5. Успокоиться.
Задача решена. :-)
Название: Re: Определить менялся ли объект на чертеже между сессиями
Отправлено: Дмитрий Загорулькин от 27-02-2020, 16:42:08
Алгоритм решения, подойдет всем в 95% случаев:
1. За разработку программы не браться!
2. Предложить сохранять копии файлов и использовать готовые средства сравнения файлов.
3. Максимум сделать инструкцию.
4. Выждать месяца три и спросить пользуются нет. Получить ответ один раз использовали, потом некогда.
5. Успокоиться.
Задача решена. :-)

(https://i.ibb.co/dfzN403/magic-stamp.png) (https://imgbb.com/)

 :D
Название: Re: Определить менялся ли объект на чертеже между сессиями
Отправлено: Atomohod от 27-02-2020, 20:44:22
1. Есть отрезок длиной 100.
2. Его укоротили до 80.
3. Его удлинили до 100.
Считать ли что с ним ничего не делали или считать, что что-то делали, но ничего не изменилось?
Интересует только видимые глазом изменения геометрии - типа переехало в другой край чертежа, изменило геометрию. DWG compare есть в поздних версиях акада, а их у нас нет. Кроме того нужно реализовать перелет к измененному объекту(зумирование на него) по его handle. Такие дела.
Название: Re: Определить менялся ли объект на чертеже между сессиями
Отправлено: Александр Ривилис от 27-02-2020, 21:35:36
Кроме того нужно реализовать перелет к измененному объекту(зумирование на него) по его handle.
Ну это самое простое. Правда если таких изменённых объектов несколько сотен, тысяч - что с этим делать?
Интересует только видимые глазом изменения геометрии - типа переехало в другой край чертежа, изменило геометрию.
Достаточно того, что объект засунули в блок - уже в этом случае не так просто понять одно ли и то же получилось. Про вложенные блоки я молчу. А что с расчленёнными полилиниями? А с аппроксимированными сплайнами или сглаженными полилиниями?
Короче говоря. Привалов Дмитрий абсолютно прав и добавить мне к этому нечего.
Название: Re: Определить менялся ли объект на чертеже между сессиями
Отправлено: Atomohod от 27-02-2020, 22:14:22
Достаточно того, что объект засунули в блок - уже в этом случае не так просто понять одно ли и то же получилось. Про вложенные блоки я молчу. А что с расчленёнными полилиниями? А с аппроксимированными сплайнами или сглаженными полилиниями?
Тогда обращаюсь к Вашему опыту - как эти моменты обрабатывает DWG compare? Как он устроен, хотя бы принципиально, внутри себя?
Название: Re: Определить менялся ли объект на чертеже между сессиями
Отправлено: Александр Ривилис от 27-02-2020, 22:29:41
Тогда обращаюсь к Вашему опыту - как эти моменты обрабатывает DWG compare? Как он устроен, хотя бы принципиально, внутри себя?
Это Know-How Autodesk. Такой информацией они не делятся. А вот как это внешне проявлется они описывают: https://knowledge.autodesk.com/ru/support/autocad/learn-explore/caas/CloudHelp/cloudhelp/2019/RUS/AutoCAD-Core/files/GUID-2D69E78D-5C82-464F-B864-CD29D5720EB9-htm.html
Название: Re: Определить менялся ли объект на чертеже между сессиями
Отправлено: Владимир Шу от 28-02-2020, 09:24:16
DWG compare есть в поздних версиях акада, а их у нас нет.
https://apps.autodesk.com/ACD/en/Detail/Index?id=1050435430275763742 ... с 2016 версии можно использовать, какие уж тут поздние/последние версии.
Название: Re: Определить менялся ли объект на чертеже между сессиями
Отправлено: Привалов Дмитрий от 28-02-2020, 10:36:22
Ну вот условия задачи все еще меняются на глазах, что говорит о том что проект скорее всего не будет реализован.
Интересует только видимые глазом изменения геометрии

нужно реализовать перелет к измененному объекту(зумирование на него) по его handle

Вот тут уже сам задумайся.
Видимые глазом изменения и изменения объекта это уже разные вещи.
Полилинию разбили на отрезки, изменения есть, а видимых изменений нет.
Сбросили Z координаты в чертеже. Скорее всего  видимых изменений нет, если чертеж плоский.
Чаще всего у "заказчика сравнения" в голове именно визуальное сравнение, и определение места изменения. "Заказчику" скорее всего наплевать на "микро изменения", т.к. суть чертежа от этого не меняется.
Про это Александр Ривилис и намекает.

Возможно что тебе нужен не DWG Compare, т.е. не средство сверки dwg, а сверка визуальных изменений.

Для этого можно(нужно) распечатать чертеж в PDF или dwf. И использовать программы для сравнения этих файлов.

По PDF не подскажу, скорее всего бесплатных программ нет.
Для сравнения dwf есть бесплатная программа  Design Review 2013  https://www.autodesk.ru/products/design-review/overview

Покажи "заказчику" сперва результат сравнения в  Design Review.
И если услышишь "ой как сложно", "у меня весь чертеж цветной изменений не видно будет", "Так у меня такой большой генпланчик как я увижу что изменилось", "это же долго просматривать"
То знай, что "заказчик" при первых трудностях уже в кусты, и программа для сравнения ему уже не нужна.
Смело возвращайся к "универсальному алгоритму решения" и будет тебе счастье!