| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp. Выделение нового в чертеже.

Lisp. Выделение нового в чертеже.

Ответ
Поиск в этой теме
Непрочитано 17.04.2014, 08:49 #1
Lisp. Выделение нового в чертеже.
Apelsinov
 
Проектировщик ВК. LISP-любитель.
 
Москва
Регистрация: 15.12.2003
Сообщений: 1,192

Попробую сформулировать задачу :
Есть созданый готовый чертеж, считается что он готов и с этого момента ему присваивается версия ноль
Потом этот чертеж редактируется, разными людьми в разное время, и, наконец, считается, что можно присвоить ему версию "1"
Необходимо выделить облачками (REVCLOUD) в чертеже все изменения произошедшие с чертежом после создания версии "0" до "1".
Облачка эти помещаются на свой слой, с указанием номера версии, допустим "VER_1"
Аналогично создаются слои "VER_2" "VER_3" и т.д. при создании новых версий, при этом слои предыдущих версий замораживаются.

теперь по программированию:
При выпуске VER_0 в чертеж вставляется объект метка, в виде облачка на соот. слое. Время создания этого объекта и есть начало отсчета.
В базе чертежа
Код:
[Выделить все]
 (vla-get-modelspace(vla-get-activedocument(vlax-get-acad-object)))
несомненно есть данные о порядке создания объектов (как получить объекты в порядке создания?), нужно просто определить те из них, что созданы позже объекта метки. Но есть еще редактированные объекты, измененные позже времени их создания - можно ли их определить?
Функция выделения полученного набора объектов облачками - это отдельная песня, нужно как-то определять группы близко расположенных объектов, чтобы не выделять каждый в отдельности. Но для начала нужно понять - возможно ли вообще получить необходимый набор объектов.

Ну вот, собственно, прошу помощи
__________________
apel.fas
Просмотров: 9628
 
Непрочитано 17.04.2014, 09:13
#2
kacugu

начинающий инженер-гидротехник
 
Регистрация: 18.04.2010
Санкт-Петербург
Сообщений: 893


А если использовать для сравнения не dwg, а dwf?
"Для того, чтобы увидеть все произведённые изменения, проверщик выполняет сравнение текущей версии полученного DWF файла с его предыдущей версией, выбрав команду меню Tools -> Compare… (Инструменты -> Сравнить…). В этом случае программа Autodesk Design Review выполнит сравнение указанных файлов и отдельным цветом визуально выделит различия." (это из "Электронной проверки чертежей" Андрея Бушмана)
kacugu вне форума  
 
Непрочитано 17.04.2014, 09:26
#3
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Цитата:
Сообщение от Apelsinov Посмотреть сообщение
(как получить объекты в порядке создания?
Все что (entnext ...) от выбранного примитива - создалось позже, по редактированию - ИХМО никак, либо сравнение с предыдущей версией, либо реакторы добавляющие РД при редактировании (то есть будет "видеть" только то, что написано с активированной программой).

p.s. по облачкам - ИХМО не логично рассматривать близость "новых" объектов между собой как критерий объединения под одну крышу - надо смотреть сколько "лишних" старых объектов влезло в объединение кроме тех, которые уже и так есть (например старые объекты находятся внутри нового круга) и плясать от этого критерия - то есть 2 новых объекта могут находится сколь угодно далеко, лишь бы при их объединении не захватывались еще объекты.
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 17.04.2014 в 09:35.
Дима_ вне форума  
 
Непрочитано 17.04.2014, 13:11
#4
nolte

спринклеры, сантехника
 
Регистрация: 26.01.2010
Сообщений: 188
Отправить сообщение для nolte с помощью Skype™


ежли в пределах одной конторы:
1 сообразить лисп который во все примитивы, в коих нет расш. данных даты, чертежа будет заносить расширенные данные - текущая дата.
2 поставить этот лисп в автозагрузку и автозапускать при открытии чертежа или придумать реактор на закрытие.
вроде это возможно и не очень сложно.

про реактор я не очень уверен.
__________________
Знание лисп: со справочником Н. Полещука
nolte вне форума  
 
Автор темы   Непрочитано 17.04.2014, 14:25
#5
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,192
<phrase 1=


Цитата:
Сообщение от nolte Посмотреть сообщение
сообразить лисп который во все примитивы, в коих нет расш. данных даты, чертежа будет заносить расширенные данные
Мысль интересная, и даже проще - не нужно автозагрузки и реакторов, просто каждый раз при запуске программа будет выделять примитивы без расш. данных, и присваивать им расш.данные с номером версии.
Но, я так понимаю, что нет большой проблемы определить порядок создания примитивов, есть проблема с редактированными примитивами - и это не решается расширенными данными, они же не исчезают при редактировании.
__________________
apel.fas
Apelsinov вне форума  
 
Непрочитано 17.04.2014, 14:55
#6
nolte

спринклеры, сантехника
 
Регистрация: 26.01.2010
Сообщений: 188
Отправить сообщение для nolte с помощью Skype™


а если снести entget примитивов в txt и затем проверять.
это может занять время (обработка всех примитивов), но результат будет достигнут.
__________________
Знание лисп: со справочником Н. Полещука
nolte вне форума  
 
Непрочитано 17.04.2014, 15:33
#7
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


С редактированием вообще отдельная песня - например изменили слой у половины объектов (или даже не сам слой, а его свойства) - они изменены - все выделять? - в общем тут теоретических вопросов больше чем практических - что впрочем в программировании на самом деле всегда так.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 17.04.2014, 23:49
#8
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Цитата:
Сообщение от Apelsinov Посмотреть сообщение
о, я так понимаю, что нет большой проблемы определить порядок создания примитивов, есть проблема с редактированными примитивами - и это не решается расширенными данными, они же не исчезают при редактировании.
В порядке бреда. Если помимо даты хранить подсчитанную хеш-сумму строки entget примитива
Цитата:
Команда: (vl-princ-to-string (entget(entlast)))
"((-1 . <Имя объекта: 7ef03ad8>) (0 . LINE) (330 . <Имя объекта: 7ef01d08>) (5
. 352B) (100 . AcDbEntity) (67 . 0) (410 . Model) (8 . 0) (100 . AcDbLine) (10
1040.42 1210.58 0.0) (11 1710.14 1112.83 0.0) (210 0.0 0.0 1.0))"
Там есть все свойства. Любое изменение как пространственное, так и изменение самих свойств (слой, цвет, вес и т.д.) приведет к тому, что контрольная сумма не будет совпадать. Это и будет признаком, что примитив менялся.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 18.04.2014, 00:16
#9
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,192
<phrase 1=


VVA, почему бред? очень даже,
а как вычислять контрольную сумму?
__________________
apel.fas
Apelsinov вне форума  
 
Непрочитано 18.04.2014, 00:16
#10
nolte

спринклеры, сантехника
 
Регистрация: 26.01.2010
Сообщений: 188
Отправить сообщение для nolte с помощью Skype™


VVA,
исключением бредовых идей достигается правильное решение.
Хеш-сумма это, я так понимаю, сумма всех cdr-ов, являющихся числом плюс название слоя, переведенного в число.
Измениться любая установка - поменяется сумма.
__________________
Знание лисп: со справочником Н. Полещука

Последний раз редактировалось nolte, 18.04.2014 в 04:50.
nolte вне форума  
 
Непрочитано 18.04.2014, 08:55
#11
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Только нужно исключить группу -1 и , возможно, переводить не vl-princ-to-string, а rtos'ом dxf группы 10,11,12,13,14

Цитата:
Сообщение от Apelsinov Посмотреть сообщение
как вычислять контрольную сумму?
Как один из вариантов алгоритма
Готовых решений на лиспе я пока не встречал
Можно объявить {Конкурс}
Если подключатся такие мастера, как Евгений Елпанов и Vov.Ka, засветившийся здесь Дима_ и др., то функция должна получится достаточно быстрой. Возможно, на просторах интернета есть готовое решение в виде com-сервера

----- добавлено через ~5 мин. -----
PS Я пока нашел только это File Checksums VB 2005
и это hash-table.lisp
General purpose hash function algorithms library
Простая и быстрая хэш функция (hash)
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 20.04.2014 в 13:37. Причина: орфография
VVA вне форума  
 
Автор темы   Непрочитано 18.04.2014, 09:28
#12
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,192
<phrase 1=


Цитата:
Сообщение от VVA Посмотреть сообщение
Только нужно исключить группу -1 и , возможно, переводить не vl-princ-to-string, а rtos'ом dxf группы 10,11,12,13,14
ну этого, конечно мало, DXF кодов будет гораздо больше - все точки, строковые текстов, атрибутов, радиусы, масштабные коэфф.... и т.д. - придется с этим позаморачиваться.
__________________
apel.fas
Apelsinov вне форума  
 
Непрочитано 18.04.2014, 13:26
#13
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Цитата:
Сообщение от VVA Посмотреть сообщение
возможно, переводить не vl-princ-to-string, а rtos'ом dxf группы 10,11,12,13,14
Почему?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 18.04.2014, 15:29
#14
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Дима_, я же написал возможно. Чтобы не получилось типа такого
Цитата:
Команда:
Команда: (setq pt (getpoint "\nТОчка"))

ТОчка(295.823 183.245 0.0)

Команда: (vl-princ-to-string (car pt))
"295.823"

Команда: (rtos (car pt) 2 15)
"295.8226932800583"
Цитата:
Сообщение от Apelsinov Посмотреть сообщение
придется с этим позаморачиваться
Я думаю проще решить, какие коды оставить
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 18.04.2014, 15:56
#15
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


То VVA - по моему это не принципиально - если изменения будут в пределах 1 тысячной (то есть и 295.82765 и 295.82999 приведутся в итоге в 295.83) - я думаю пользоваетль лекго переживет если это не засчитается как изменение, программа же будет запускать одну и ту же функцию к одним и тем-же данным - строке полученной от (vl-princ-to-string (cdr (entget ent))), после чего, чтоб не перегружать чертеж внесением в РД всей строки, считать от нее контрольную сумму разрядностью подходящей для задачи.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 19.04.2014, 08:31
#16
nolte

спринклеры, сантехника
 
Регистрация: 26.01.2010
Сообщений: 188
Отправить сообщение для nolte с помощью Skype™


тестите, у меня работает. проверял на нескольких чертежах примерно 10000 примитивов первый проход 40 сек, второй, когда уже есть данные получилось чуть меньше. воспользовался советом VVA пошел через хеш-сумму, через файл txt тоже возможно, только много головняка с dxf кодами да и долго сильно код работает.
на выходе лисп выдает измененные или новые примитивы, список которых можно в дальнейшем занести в таблицу, файл, обвести и так далее. запуск - 21.

Код:
[Выделить все]
 
(defun l-sum-real (x)
(distof(rtos x 2 4))
)
(defun l-sum-lst (lst)
(apply '+ (mapcar '(lambda (x) (cond ((eq (type x) 'str) (l-sum-str x)) ((eq (type x) 'real) (l-sum-real x)))) lst))
)
(defun l-hesh-sum-obj (lst / f doc)
(vl-load-com)
(setq doc (vla-get-activedocument(vlax-get-acad-object)))
(+ (length lst)
	(apply '+
		(mapcar '(lambda (x)
							(cond
								((eq (car x) 8)
									(if (setq f (vlax-for n (vla-get-layers doc) (if (eq (vla-get-name n) (cdr(assoc 8 lst))) (vla-get-objectid32 n)))) f '0)
								)
								((eq (type (cdr x)) 'ename) '0)
								((eq (type (cdr x)) 'list) (l-sum-lst(cdr x)))
								((eq (type (cdr x)) 'real) (l-sum-real(cdr x)))
								((eq (type (cdr x)) 'int) (cdr x))
								((eq (type (cdr x)) 'str) '0)
							)
						)
				lst
		)
	)
)
)
(defun c:21 (/ i lst lst_new obj_set)
(vl-load-com)
(setq ech (getvar 'cmdecho))
(setvar 'cmdecho 0)
(repeat (setq i (sslength (setq obj_set (ssget "_X")))) (setq lst (cons (ssname obj_set (setq i (1- i))) lst)))
(mapcar '(lambda (x / obj)
					(setq obj (vlax-ename->vla-object x))
					(if (vlax-ldata-get obj "SUM_ENT")
						(if (not(equal (vlax-ldata-get obj "SUM_ENT") (l-hesh-sum-obj (entget x)) 0.0001))
							(progn
								(setq lst_new (cons x lst_new))
								(mapcar '(lambda (a b)
													(vlax-ldata-put obj a b)
												)
										(list "L_VER" "L_DATE" "RAB" "SUM_ENT")
										(list
											(+ 1 (if (vlax-ldata-get obj "L_VER") (vlax-ldata-get obj "L_VER") '0))
											(substr (rtos (getvar 'cdate) 2 10) 1 8)
											(getenv "Username")
											(l-hesh-sum-obj (entget x))
										)
								)
							)
						)
						(progn
							(setq lst_new (cons x lst_new))
							(mapcar '(lambda (a b)
												(vlax-ldata-put obj a b)
											)
									(list "L_ID" "L_VER" "L_DATE" "RAB" "SUM_ENT")
									(list
										(vla-get-objectid32 obj)
										(+ 1 (if (vlax-ldata-get obj "L_VER") (vlax-ldata-get obj "L_VER") '0))
										(substr (rtos (getvar 'cdate) 2 10) 1 8)
										(getenv "Username")
										(l-hesh-sum-obj (entget x))
									)
							)
						)
					)
				)
		lst
)
(foreach n lst_new (print n))
(setvar 'cmdecho ech)
(princ (strcat "\n" (itoa (length lst_new))))
lst_new
)
__________________
Знание лисп: со справочником Н. Полещука

Последний раз редактировалось nolte, 20.04.2014 в 04:49.
nolte вне форума  
 
Непрочитано 19.04.2014, 09:55
#17
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Цитата:
Сообщение от Apelsinov Посмотреть сообщение
а как вычислять контрольную сумму?
Цитата:
Сообщение от VVA Посмотреть сообщение
Готовых решение на лиспе я пока не встречал
Что-то я сразу не догадался покопаться в закромах Lee-Mac'а Оказывается все уже давно написано
MD5 Cryptographic Hash Function
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 19.04.2014, 12:59
#18
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Цитата:
Сообщение от nolte Посмотреть сообщение
(apply '+ (vl-string->list x))
Боюсь "коллизийность" у такой суммы будет высоковата.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 19.04.2014, 13:25
#19
nolte

спринклеры, сантехника
 
Регистрация: 26.01.2010
Сообщений: 188
Отправить сообщение для nolte с помощью Skype™


Дима_, откуда такой страх.
__________________
Знание лисп: со справочником Н. Полещука
nolte вне форума  
 
Непрочитано 19.04.2014, 16:22
#20
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


С первого класса - от перестановки мест слагаемых сумма не меняется.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp. Выделение нового в чертеже.

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Lisp. Как выбрать три последних не удаленных примитива на чертеже используя ent* Yura Agafonov LISP 17 27.06.2012 01:25
LISP. Выделение блоков с динамическими свойствами Composter LISP 14 16.02.2012 22:42
LISP / AutoCAD2008 / Как программно снять выделение у примитивов, не используя sssetfirst TararykovDG LISP 7 14.01.2011 10:48
LISP. Автоматическое замораживание нового слоя на выбраных вьюпортах Yuzer LISP 2 25.12.2010 02:37
Произведение нескольких чисел на чертеже? Нужен Lisp по типу sum.lsp UnAtom LISP 2 24.11.2010 20:18