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

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

LISP. Подсчет кол-ва прямоугольников, с их маркировкой и offset-ом

Ответ
Поиск в этой теме
Непрочитано 07.05.2013, 13:23 #1
LISP. Подсчет кол-ва прямоугольников, с их маркировкой и offset-ом
AndruxaZ
 
Регистрация: 07.05.2013
Сообщений: 48

Есть небольшой опыт программирования на LISP. Нужна помощь в следующем:

1. В пространстве Модели имеются прямоугольники различных размеров. Требуется выделяя поочередно прямоугольники, оффсетить их все только наружу с задаваемым значением (удаляя затем старый контур). Далее маркировать новые прямоугольники начиная с 1 т.д.
2. Задача: получить список кол-ва прямоугольников одинаковых размеров, их ширину и высоту.

Поскажите с чего начинать? Имеет ли смысл загонять прямоугольники и маркировку (атрибутом) в блоки, а затем подсчитывать стандартными средствами dataextraction. По поиску находил несколько лиспов по offset-ам (http://forum.dwg.ru/showthread.php?t=12154). Такой вот ещё лисп http://www.caduser.ru/forum/index.ph...#message125416

Прилагаю файл, что примерно хочу получить. (Простановка размеров не нужна, просто для наглядности показал, что прямоугольники увеличиваюся).

Вложения
Тип файла: dwg
DWG 2004
Список прямоугольников.dwg (60.1 Кб, 1650 просмотров)

Просмотров: 2676
 
Непрочитано 07.05.2013, 15:01
#2
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


В чертеже кроме прямоугольников есть еще что-то? Если да, то надо как-то "вылавливать" их.
Прямоугольники всегда полилиниями отрисованы, или бывают из отрезков?
Вообще, механизм появления в чертеже прямоугольников каков? А то напишите программу для полилиний, а если их рисуют ручками, то завтра это могут оказаться 3D грани, к примеру.
В примере верхних исходных прямоугольника 2 - один наложен на другой. Программа легко их может распознать как 2 отдельных прямоугольника.
В общем, начинать нужно с осмысления и четкой постановки задачи
Do$ вне форума  
 
Автор темы   Непрочитано 07.05.2013, 15:10
#3
AndruxaZ


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


Исходные прямоугольники будут всегда полилиниями. Вообще (возможно задача ещё более усложняется) исходные прямоугольники будут образовываться от boundary. и выделение прямоугольников (полилиний) должно осуществляться пользователем
AndruxaZ вне форума  
 
Непрочитано 07.05.2013, 23:19
#4
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Если
Цитата:
Сообщение от AndruxaZ Посмотреть сообщение
выделение прямоугольников (полилиний) должно осуществляться пользователем
То на то, как образованы эти прямоугольники ранее - абсолютно все равно. Хоть boundary, хоть не boundary
Do$ вне форума  
 
Автор темы   Непрочитано 11.05.2013, 20:56
#5
AndruxaZ


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


Переговорил с технологами и переделали задачу в следующее:

1. В файле присутствует сетка из прямоугольников (полилиний).
2. Требуется в исходную сетку вставить динамические блоки (стёкла) маркируя их, начиная с единицы и т.д. Стёкла - это соотвественно область, ограниченная 4-мя прямоугольниками.
3. Моя задумка - при запуске команды пользователь должен указывать во внутреннюю область каждого стекла. Соотвественно там должен формироваться блок (прямоугольник с аттрибутами на слое стекло).
4. По окончании будут выведены размеры стёкол и их маркировки с помощью datdaextraction.

Возможно ли что-то такое соорудить?? Если с динамческими блоками заморочка, то тогда по упрощённому варианту - блоки с 3-мя атрибутами "маркировка, ширина, высота" (без черчения прямоугольника). Атрибуты "ширина, высота" скрытые.
Вложения
Тип файла: dwg
DWG 2004
Расстановка стекла.dwg (59.0 Кб, 1499 просмотров)
AndruxaZ вне форума  
 
Непрочитано 12.05.2013, 18:04
#6
VVA

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


AndruxaZ, Файл не смотрел, нет Автокада по рукой. Но похожие задачи решали раньше. Только там замкнутые полилинии обводили маскировками (wipeout) с/без удаления исходных полилиний.
Обрезать все линии внутри нескольких выбранных полилиний
создание множества масок (wipeout)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 12.05.2013, 21:06
#7
AndruxaZ


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


VVA, спасибо за наводку. Будем изучать
AndruxaZ вне форума  
 
Непрочитано 12.05.2013, 22:16
#8
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Попробуй, накидал по-быстрому проверяй сам,
точки указывай в цикле, для окончания Enter или правый клик,
добавил запись в файл CSV разделитель точка с запятой,
измени формат записи по желанию

Код:
[Выделить все]
 (defun c:glass(/ *error* acsp B blk blkRecord coords dataExtract GetDynBlockRefProperty file fn H height  mp num p rec SetDynBlockRefPropertyValue wid )
 (vl-load-com)
   (defun *error*  (msg)			  ; create standard error handler
      (cond ((not msg))				  ; normal exit, no error
	    ((member msg '("Function cancelled" "quit / exit abort"))) ; escape
	    ((princ (strcat "\nError: " msg))	  ; display fatal error
	     (cond (*debug* (vl-bt)))))		  ; if in debug mode, dump backtrace


      ;;(if layer_list (restore_layers layer_list)) ; restore layer state
      (if (and lobj locked) (vla-put-lock lobj :vlax-true))
      (command "._undo" "_end")
      (command)
     (princ)
      )
  
  
   
;; Tony Tanzillo
;; Get a single dynamic block property object by name
;;
(defun GetDynBlockRefProperty (DynBlockRef Name)
   (vl-some
     '(lambda (property)
         (if (eq (vlax-get-property property 'PropertyName) Name)
            property
         )
      )
      (vlax-safearray->list
         (vlax-variant-value
            (vla-getDynamicBlockProperties DynBlockRef)
         )
      )
   )
)
;; Set the vlaue of a single dynamic block property object by name

(defun SetDynBlockRefPropertyValue (DynBlockRef Name NewValue / Property)
   (if (setq property (GetDynBlockRefProperty DynBlockref Name))
      (progn
         (vlax-put-property property 'Value NewValue)
         (vlax-release-object Property)
      )
   )
)
  (command "._undo" "_begin")
  (setq acsp (vla-get-block (vla-get-activelayout (vla-get-activedocument (vlax-get-acad-object)))))
  (setq colset (ssadd))
  (while     
  (and (setq p (getpoint "\nТочка внутри (Enter - завершение): "))(vl-cmdf "-boundary" p "") )
  (setq rec (entlast) )
  
  (setq coords (vl-remove-if 'not (mapcar '(lambda(x)(if (eq 10 (car x))(cdr x) ) )(entget rec) )))
  (ssadd rec colset)
  (setq mp  (mapcar '(lambda (a b) (* 0.5 (+ a b))) (trans (nth 0 coords)1 0)(trans (nth 2 coords) 1 0)))
  (setq H (abs (- (cadr (nth 0 coords))(cadr (nth 2 coords) )))
	B (abs (- (car (nth 0 coords))(car (nth 2 coords) ))))
  (setq num (getstring "\nNumber of glass: "))
  (princ (strcat "\nНомер " num "\tШирина " (rtos B 2 2)"\tВысота " (rtos H 2 2) ))
  (setq blk (vl-catch-all-apply 'vla-insertblock (list acsp (vlax-3d-point mp)"стекло" 1 1 1 0)))
  (vl-catch-all-apply 'vlax-put (list blk 'layer "Стекло"))
  (setq	attInfo (assoc "GLASS"
		   (mapcar '(lambda (x)
				       (list (vla-get-tagstring x)
					     (vla-get-textstring x)
					     x))
			   (vlax-invoke blk 'GetAttributes))))
		   (vla-put-textstring (last attInfo) num)
  (SetDynBlockRefPropertyValue blk "H" H)(SetDynBlockRefPropertyValue blk "B" B)
  (vl-catch-all-apply 'vla-move (list blk (vla-get-insertionpoint blk) (vlax-3d-point mp)))
  (setq blkRecord (strcat "стекло;" num ";"(rtos B 2 2)";"(rtos H 2 2)";"(rtos (car mp) 2 2)";"(rtos (cadr mp) 2 2)))
  (setq dataExtract (cons blkRecord dataExtract))
  )
  (if colset (command "_erase" colset ""))
    (if dataExtract
      (progn
	(setq dataExtract (reverse dataExtract))
	(setq file (strcat (getvar "dwgprefix")(vl-filename-base(getvar "dwgname"))".csv"))
	(setq fn (open file "w"))
	(write-line "Блок;Номер;Ширина;Высота;X;Y" fn)
	(foreach blkRecord dataExtract
	  (write-line blkRecord fn))
	(close fn)))
    (*error* nil)
 (princ)
    )

Последний раз редактировалось Олег (jr.), 13.05.2013 в 00:59. Причина: добавлена запись в файл
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 13.05.2013, 06:42
#9
AndruxaZ


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


Олег (jr.), спасибо огромадное. Буду изучать, тестировать.
Протестировал - всё замечательно.

А возможно сделать, следующим образом, так сказать усовершенствовать?
1. При указании первой области будет запрашивать номер стекла (допусти вводим "4"), а при указании последующих областей автоматически будет присваиватся значение большее на 1 (т.е. 5,6,7 и т.д.). Видимо нужна будет какая-то проверка, если размеры стекол будут одинаковые (тогда их номер должен быть одинаковым)

Последний раз редактировалось AndruxaZ, 13.05.2013 в 07:58.
AndruxaZ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP. Подсчет кол-ва прямоугольников, с их маркировкой и offset-ом



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP для offset Positron LISP 19 02.01.2020 21:04
LISP. Подсчет блоков по значению атрибутов Nike Готовые программы 5 21.09.2016 11:11
Юмор 2013 T-Yoke Разное 1613 01.01.2014 02:27
{Конкурс} Lisp. Задачки для студентов gomer LISP 10 05.01.2011 16:33