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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP. Сумма значений аттрибутов блоков.

LISP. Сумма значений аттрибутов блоков.

Ответ
Поиск в этой теме
Непрочитано 11.07.2012, 21:55 #1
LISP. Сумма значений аттрибутов блоков.
dirge
 
Регистрация: 05.09.2011
Сообщений: 38

Ребята, всем привет! Поступило такое задание, а с какой стороны подойти получше не знаю, уж профи наверное подскажут. Сама задача, есть грид размером 500000 x 500000 мм и делением через 1000 мм по вертикали и горизонтали, на нём разбросаны блоки с атрибутами. Нужно каким-то способом вычислить количество блоков в ячейке, если есть и поставить в центр соответствующей ячейки цифру с суммой значений аттрибутов. У блока всего один аттрибут, с дефолтным значением, например 10. Я поделюсь своими мыслями, а быть может вы подскажите как лучше это реализовать.
Идея в лоб, в цикле обойти каждую ячейку и по bounding box ячейки определить попадает ли точка вставки блока в диапазон или нет, простой селекцией не удобно поскольку точка вставки и сам объект могут значительно различаться. Ещё один нюанс, не понятно, каким объектом должен быть грид, просто набором вертикальных и горизонтальных полилиний или квадратом 1000 x 1000 массивом разможенный для более удобной селекции? Буду рад любой помощи! Прикрепил объясняющую схему к теме.

Миниатюры
Нажмите на изображение для увеличения
Название: duct.jpg
Просмотров: 116
Размер:	165.6 Кб
ID:	83638  

Просмотров: 3791
 
Непрочитано 11.07.2012, 23:21
#2
bargool


 
Регистрация: 16.08.2006
Санкт-Петербург
Сообщений: 508
<phrase 1=


по лиспу не подскажу, но:
разбросаны вхождения одного и того же блока? блок динамический/статический/неизвестно? Если статика, то можно легко определить смещение элементов блока в определении блока относительно точки вставки, затем можно путём нехитрых геометрических вычислений (относительно точки вставки вхождения блока) определить попадание блока в ту или иную ячейку. С динамическим блоком сложнее, но тоже можно. Координаты ячеек легко вычислить, даже не надо обращаться к самим объектам, образующим ячейки (если, конечно, размеры ячейки фиксированы, а тем более вообще заранее известны).
Попутно вопрос: что делать, если блок попадает сразу в две ячейки (находится на границе)?
bargool вне форума  
 
Автор темы   Непрочитано 11.07.2012, 23:36
#3
dirge


 
Регистрация: 05.09.2011
Сообщений: 38


Цитата:
Сообщение от bargool Посмотреть сообщение
по лиспу не подскажу, но:
разбросаны вхождения одного и того же блока? блок динамический/статический/неизвестно? Если статика, то можно легко определить смещение элементов блока в определении блока относительно точки вставки, затем можно путём нехитрых геометрических вычислений (относительно точки вставки вхождения блока) определить попадание блока в ту или иную ячейку. С динамическим блоком сложнее, но тоже можно. Координаты ячеек легко вычислить, даже не надо обращаться к самим объектам, образующим ячейки (если, конечно, размеры ячейки фиксированы, а тем более вообще заранее известны).
Попутно вопрос: что делать, если блок попадает сразу в две ячейки (находится на границе)?
Да, вхождение одного и тоже блока. Блоки будут статикой, не хочется усложнять себе жизнь) Грид фиксированой величины и меняться не будет скорей всего. А как он может попасть сразу в две ячейки? Физически конечно может, но ориентир это точка вставки блока, она не может быть сразу в двух ячейках или на границе. Тут либо какой-то другой параметр нужен по которому можно идентифицировать блоки в ячейках.
dirge вне форума  
 
Непрочитано 11.07.2012, 23:45
#4
bargool


 
Регистрация: 16.08.2006
Санкт-Петербург
Сообщений: 508
<phrase 1=


Стоп-стоп-стоп. Как это:
Цитата:
Сообщение от dirge Посмотреть сообщение
простой селекцией не удобно поскольку точка вставки и сам объект могут значительно различаться
Вяжется с этим?
Цитата:
Сообщение от dirge Посмотреть сообщение
но ориентир это точка вставки блока
И, между прочим, точка вставки может лежать на линии, разделяющей ячейки
bargool вне форума  
 
Автор темы   Непрочитано 11.07.2012, 23:57
#5
dirge


 
Регистрация: 05.09.2011
Сообщений: 38


Первая идея была такая, наверное глуповатая (setq grp (ssget "_w" pt1 pt1)) и в цикле наращивать координаты, но window захватывает только явно попадающие объекты или может я чего не понимаю.
dirge вне форума  
 
Автор темы   Непрочитано 13.07.2012, 15:51
#6
dirge


 
Регистрация: 05.09.2011
Сообщений: 38


Начал делать какую-то часть кода на простом примере и возник вопрос, как обратиться из одного поля видимости цикла в другое поле?
Сейчас объект ename виден только на вехнем уровне цикла, а внутри другого его нет уже или я что-то не понимаю?



Код:
[Выделить все]
 
(setq count 0
      k 0)

(setq obj (ssget "_x" '((0 . "CIRCLE"))))
(setq grid (ssget "_x" '((0 . "LWPOLYLINE") (8 . "MP.M.Dimension"))))


(if obj
	(progn
	(while (< count (sslength obj))
	  
		(setq ename (ssname obj count))
		(setq inpt (cdr (assoc 10 (entget ename))))

		(while (< k (sslength grid))
		  
	                (setq bbox (vla-GetBoundingBox (vlax-ename->vla-object (ssname grid k)) 'minpt 'maxpt)
		  	      minpt (vlax-safearray->list minpt)
		   	      maxpt (vlax-safearray->list maxpt))

			(if (and (and (> (car inpt) (car minpt)) (< (car inpt) (car maxpt)))
			    (and (> (cadr inpt) (cadr minpt)) (< (cadr inpt) (cadr maxpt))))

			  	(vla-put-color (vlax-ename->vla-object ename) 10)
			)

	  		(setq k (1+ k))
		)
	  
	  	
	(setq count (1+ count))
	)
     )
)
dirge вне форума  
 
Автор темы   Непрочитано 14.07.2012, 22:34
#7
dirge


 
Регистрация: 05.09.2011
Сообщений: 38


Ребят, подскажите как реализовать такой момент, чтобы количество объектов которые мы по опеределяем по условию попадали в нужную группу. Результать на выходе, группа grpPrim_0 (2 объекта), группа grpPrim_1 (5 объектов) и т.д. Сейчас создаётся просто группа с одним объектом внутри.

Код:
[Выделить все]
 (vl-load-com)

(setq actDoc (vla-get-ActiveDocument (vlax-get-acad-object)))

(setq i 0
      j 0)
(setq obj (ssget "_x" '((0 . "CIRCLE")))
      grid (ssget "_x" '((0 . "LWPOLYLINE"))))

(if (and grid obj)
  
	(while (< i (sslength obj))
		(while (< j (sslength grid))
		  
			(setq ename (ssname obj i)
			      inpt (cdr (assoc 10 (entget ename))))

		  	(setq gname (ssname grid j))
		  	(setq bbox (vla-GetBoundingBox (vlax-ename->vla-object
							 gname) 'minpt 'maxpt)
			      minpt (vlax-safearray->list minpt)
			      maxpt (vlax-safearray->list maxpt))

			  
		  	(if (and (and (>= (car inpt) (car minpt)) (<= (car inpt) (car maxpt)))
				 (and (>= (cadr inpt) (cadr minpt)) (<= (cadr inpt) (cadr maxpt))))

			    	;; Create a groups primitive
			         (vla-add (vla-get-groups actDoc) (strcat "grpPrims_" (itoa i)))

			  	 (vla-AppendItems (vla-item (vla-get-groups actDoc) i)
					(vlax-make-variant (vlax-safearray-fill
						(vlax-make-safearray vlax-vbObject
						  (cons 0 (1- (length (list gname))))
						  )
						(list (vlax-ename->vla-object gname)))
					  )
				   )	  	      
			)
		(setq j (1+ j))
		)
	  (setq j 0)
	(setq i (1+ i))
	)
 )
dirge вне форума  
 
Непрочитано 15.07.2012, 01:41
#8
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от dirge Посмотреть сообщение
Ребят, подскажите как реализовать такой момент, чтобы количество объектов которые мы по опеределяем по условию попадали в нужную группу. Результать на выходе, группа grpPrim_0 (2 объекта), группа grpPrim_1 (5 объектов) и т.д. Сейчас создаётся просто группа с одним объектом внутри.
разверни алгоритм, а про ename молодец, что догадался, что это никакой не ename
gomer вне форума  
 
Автор темы   Непрочитано 16.07.2012, 19:05
#9
dirge


 
Регистрация: 05.09.2011
Сообщений: 38


Решено! Чтобы каждая группа накапливала необходимое количество объектов её надо создавать до условия проверки на пересечение массивов.
dirge вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP. Сумма значений аттрибутов блоков.

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Очистка рисунка от "пустых" блоков Makswell Готовые программы 15 26.10.2022 15:24
LISP. Нормализация блоков текущего файла. Кулик Алексей aka kpblc Готовые программы 82 06.07.2016 20:38
LISP. Выделение блоков с динамическими свойствами Composter LISP 14 16.02.2012 22:42
Тормозит команда расчленения набора блоков batmax Программирование 4 31.08.2010 17:37
Порядок опроса значений для аттрибутов? Mikhail AutoCAD 13 16.10.2003 13:44