Сообщество программистов Autodesk в СНГ
ADN Club => AutoCAD .NET API => Тема начата: alexeyOMG от 22-07-2016, 17:15:51
-
Доброго времени суток, дорогие друзья!
У меня стоит задача, почитать количество каждого объекта в документе.
То есть, если объект скопировали и вставили много раз, то мне нужно узнать это количество.
Просто получить список объектов - я получил. Но вот определить, какие из них являются дублирующими - я не знаю как.
Я могу сравнить некоторые параметры, но нет уверенности, что этого достаточно (вдруг похожий объект тоже попадет под это сравнение, у которого будут эти параметры совпадать, у какие-то нет.)
-
То есть, если объект скопировали и вставили много раз, то мне нужно узнать это количество.
Во-первых, о каких объектах (примитивах AutoCAD) идёт речь?
Во-вторых, если примитив скопировали, а потом поменяли ему цвет (или слой, или тип линии), то это дубликаты или нет?
В-третьих,...
Короче говоря как минимум следует определиться с постановкой задачи. Пока же это чистая абстракция, не имеющая однозначного решения.
-
Можно в принципе отслеживать операции копирования, и тогда можно точно знать дубликаты это или нет. Но! А что делать, если один из дубликатов потом изменили? И какие изменения считать важными, а какие нет?
-
ИМХО, очень похоже на очередную попытку определить производительность чертежника на основе подсчета количества линий...
-
ИМХО, очень похоже на очередную попытку определить производительность чертежника на основе подсчета количества линий...
Думаю, что скорее другое - попытка получения спецификации объектов. Но тут можно долго гадать...
-
Да, мне нужно вывести список типа: деревьев - 10 штук. Только вместо названий нужно выводить картинку.
Я подумал, что можно как-то сравнить объекты по их всем параметрам, чтобы понять, идентичны ли они.
На крайний случай я буду тупо по наименованию сравнивать. Но опять же, не буду застрахован от того, что объект скопировали и видоизменили его. В этом случае сравнение по наименованиям не будет работать.
Можете что-нибудь подсказать? Это реально, сравнить два объекта по всем параметрам? И даст ли это сравнения мне ответ - идентичны ли они (визуально на чертеже)?
-
На крайний случай я буду тупо по наименованию сравнивать
По какому названию? Это реально, сравнить два объекта по всем параметрам?
Ну в принципе да.
И даст ли это сравнения мне ответ - идентичны ли они (визуально на чертеже)?
Да. Но при этом визуально идентичные объекты не обязательно имеют одинаковые свойства.
-
(https://s31.postimg.org/qkhrj947r/123.jpg) (https://postimg.org/image/qkhrj947r/)
Свойство "Имя". У дублированных объектов это поля одинаковое. Я говорил о сравнении этого поля. Если с остальным сравнением не получится, то наверно я хотя бы по одному этому полю буду сравнивать. Это не защитит от "изменения" объекта после дублирования, но все же.
Так, ну в итоге можно как-то так сравнить объекты на чертеже программно, чтобы я точно узнал, являются ли они идентичными (то есть скопировали один объект и вставили кучу раз - получилось много дубликатов)? Мне важна визуальная идентичность. Если да, то подскажите как, пожалуйста. Лучше всего конечно какой-нибудь примерчик. :)
-
Свойство "Имя". У дублированных объектов это поля одинаковое.
Так бы сразу и сказал, что речь идёт о вставке блока (BlockReference). Тогда всё намного проще.
Это не защитит от "изменения" объекта после дублирования, но все же.
Если блок не динамический, то после вставки его изменить нельзя. Можно конечно поменять его положение, масштаб, угол поворота. Но форма от этого не изменится и думаю, что ты можешь их считать одинаковыми. Если блок динамический, то меняя параметр Видимость (Visibility) можно поменять его внешний вид (например, дерево с листьями или дерево без листьев). Если считать, что это разные деревья (тут ты должен сам определиться), то тогда можно сравнивать имя блока и состояние видимости. Если эти два параметра одинаковы, то это одно и тоже дерево.
P.S.: Похоже нужно начать с изучения AutoCAD...
P.S.: Указанный на картинке блок был вставлен через буфер обмена - об этом говорит его имя и он не динамический.
-
Похоже нужно начать с изучения AutoCAD...
Ага и окажется, что для решения поставленной задачи, программирование то и не нужно.
-
Ага и окажется, что для решения поставленной задачи, программирование то и не нужно.
Намекаешь на DataExtraction? Тут скорее всего нужно получить некую ведомость условных знаков, где вместо имени нужно вставить соответствующий блок.
-
Ну на чертежах есть не только блоки (которые я могу по "имени" сравнить).
Но например полилинии, круги как? Их тоже куча на графике. И их тоже надо почитать. И они тоже могут быть дублированы. Их как сравнивать на идентичность? По каким параметрам?
-
По сути у каждого типа объекта (круг, полилиния и тд) есть свой перечень параметров, который может говорить об идентичности.
Неужели нужно будет для каждого типа объекта делать свой механизм сравнения (по своим параметрам, которые вместе будут отвечать за идентичность при сравнении)?
-
И их тоже надо почитать. И они тоже могут быть дублированы. Их как сравнивать на идентичность? По каким параметрам?
А вот это думаю уже тупиковая ветка. Окружность может быть нарисована примитивом CIRCLE (класс Circle), а можно при помощи нескольких дуг ARC (класс Arc) - внешне ты их не отличишь. Дальше можно нарисовать одну полилинию, а потом расчленить её на составляющие (получатся отрезки и дуги). Но внешне оно останется тем же. В общем случае ты эту задачу не решишь. Она бредовая. Так что ставь нормальные ограничения на то, с какими примитивами AutoCAD ты можешь работать. Это и называется постановкой задачи.
-
Неужели нужно будет для каждого типа объекта делать свой механизм сравнения (по своим параметрам, которые вместе будут отвечать за идентичность при сравнении)?
Если ставить задачу именно так, то так и придётся делать. Потому что если использовать для этой цели Reflection, то придётся всё равно отсекать свойства, которые не определяют внешний вид объекта.
Кстати, а что делать с цветом, типом линии, слоём, весом линии и т.д. и т.п.? Считать ли такие объекты одинаковыми? Надеюсь, что ты понимаешь о чем я спрашиваю.
-
Тут скорее всего нужно получить некую ведомость условных знаков, где вместо имени нужно вставить соответствующий блок.
Ну на чертежах есть не только блоки (которые я могу по "имени" сравнить).
Но например полилинии, круги как? Их тоже куча на графике. И их тоже надо почитать.
я бы на такую ведомость посмотрел.
А вообще вопрос к автору топика, не мог бы автор выложить исходный файл для ознакомления с ситуацией и желательно итоговый, для понимания, что нужно в итоге?
-
Ну не рисовать же пример вам)
Исходный файл - обычный чертеж, где имеются блоки и прочие объекты (типа полилиний, кругов и тд).
Нужно сделать список всех элементов документа с указанием их количества (соответственно надо как-то программно определять, идентичны ли любые два объекта).
То есть результат должен быть такой:
"Картинка дерева" - 2 шт.
"Картинка лавочки" - 10 шт.
Скорее всего нужно делать только для блоков. Но изначально я хотел получить понимание, можно ли сделать для всех объектов, не только для блоков.
-
можно ли сделать для всех объектов, не только для блоков.
Вот для оценки возможности и нужен пример.
Пример во вложении, был файл из какого то граф. редактора, который на выходе давал dxf в одном слое и практически всё в простых примитивах, нужно было собрать элементы из отдельных кусков в целые и посчитать идентичные с учетом зеркальности, потом сохранить поэлементно в dxf файлах, для обработке на ЧПУ. С задачей справился.
Без наличия на руках файлов с которыми предстоит работать очень сложно предложить адекватный алгоритм, так что именно рисовать и не абстрактный файл, а тот с которым вы сталкиваетесь по работе.