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

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

Lisp. Взрыв блоков со схожими названиями

Ответ
Поиск в этой теме
Непрочитано 28.07.2014, 19:10 #1
Lisp. Взрыв блоков со схожими названиями
Composter
 
Отопление и вентиляция
 
Москва
Регистрация: 31.10.2008
Сообщений: 445

Добрый день. Часто архитекторы выдают чертежи из архикада или ревита где в файле каждый элемент это отдельный блок. Т.е. если колонн на чертеже 200 штук, то в чертеже будет 200 блоков с именем "Колонна_двутавр_составной -" и какой нить номер на конце.Решил написать лисп который бы искал блоки с похожими именами и взрывал их.на данный момент вот что у меня есть
Код:
[Выделить все]
 
(defun fun_get-name (ent)
(if (vlax-property-available-p ent 'effectivename)
  (vla-get-effectivename ent)
  (vla-get-name ent)
  )
)

(defun zod107 ( / blocks1 zzz spisok1)
(setq zzz (vl-string-elt "*" 0))
(setq blocks1 (vla-get-blocks(vla-get-activedocument (vlax-get-acad-object))))
(vlax-for blk_def blocks1
	(if (equal (vla-get-isxref blk_def) :vlax-false)
			(setq spisok1(append spisok1 (list(fun_get-name blk_def))))
	  )
)
(setq spisok1(vl-sort (vl-remove-if(function (lambda(x)(= (vl-string-elt x 0) zzz)))spisok1) '<))
)
возникла загвоздка с сортировкой имен блоков .я не знаю как отсортировать все имена блоков в которых у которых есть совпадения с именами других блоков .т.е. у меня есть список примерно вот такой
Цитата:
"A$C32466ED2"
"Прямоугольный импост - 50 x 150 мм-V92-_А1_ Этаж 6"
"Прямоугольный импост - 50 x 150 мм-V93-_А1_ Этаж 6"
"Прямоугольный импост - 50 x 150 мм-V93-_А1_ Этаж 6"
"Прямоугольный импост - 50 x 150 мм-V94-_А1_ Этаж 6"
"Прямоугольный импост - 50 x 150 мм-V94-_А1_ Этаж 6"
"Раковина-Для швабры-2D - Раковина 600х500-5555421-_А1_ Этаж 6"
"Раковина-Для швабры-2D - Раковина 600х500-5555421-_А1_ Этаж 6"
"Раковина-Для швабры-2D - Раковина 600х500-5555423-_А1_ Этаж 6"
"Раковина-Для швабры-2D - Раковина 600х500-5555423-_А1_ Этаж 6"
"С_Умывальник малый _без основы_ - Малый без основы-568095-_А1_ Этаж 6"
"С_Умывальник малый _без основы_ - Малый без основы-568095-_А1_ Этаж 6"
"С_Умывальник малый _без основы_ - Малый без основы-568891-_А1_ Этаж 6"
"С_Умывальник малый _без основы_ - Малый без основы-568891-_А1_ Этаж 6"
"Системная панель - Глухая панель 25 мм белая-5837456-_А1_ Этаж 6"
"Системная панель - Глухая панель 25 мм белая-5837456-_А1_ Этаж 6"
мне соответсвенно нужно получить новый список кроме первого номера в списке.

я так понимаю что нужно вычленять список с помощью vl-string-mismatch но как это сделать не могу догнать
Просмотров: 2299
 
Непрочитано 28.07.2014, 19:36
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,848


ИМХО надо сделать следующее:
1. Определить закон "похожести" имен
2. Прочитать про wcmatch - ее более чем достаточно.
3. Разобраться с разницей между описаниями блоков и их вхождениями.
П.1 самый сложный и самый важный.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.07.2014, 22:32
#3
VVA

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


1. Если блоки не динамические, то выбрать по фильтру ssget
Код:
[Выделить все]
 (ssget "_X" '((0 . "insert") (2 . "Прямоугольный импост - *,Раковина-Для швабры-2D -*,С_Умывальник малый*,Системная панель -*")))
В поле 2 можно использовать шаблон для выбора по правилам функции wcmatch
А потом взорвать одним махом _explode с учетом значения QAFLAGS
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 29.07.2014, 13:51
#4
Composter

Отопление и вентиляция
 
Регистрация: 31.10.2008
Москва
Сообщений: 445


вот что у меня вышло
Код:
[Выделить все]
 
(defun fun_get-name (ent)
(if (vlax-property-available-p ent 'effectivename)
  (vla-get-effectivename ent)
  (vla-get-name ent)
  )
)

(defun _kpblc-list-dublicates-remove (lst / result)
(foreach x lst
	(if (not (member x result))
		(setq result (cons x result))
	)
)
(reverse result)
)

(defun zod107 ( / blocks1 zzz spisok1 spisok2 num1 n m flag1 )
(setq spisok3 nil sel nil)
(setq zzz (vl-string-elt "*" 0) num1 3 n 0 m 0 spisok3 "")
(setq blocks1 (vla-get-blocks(vla-get-activedocument (vlax-get-acad-object))))
(vlax-for blk_def blocks1
	(if (equal (vla-get-isxref blk_def) :vlax-false)
			(setq spisok1(append spisok1 (list(fun_get-name blk_def))))
	  )
)
(setq spisok1(vl-sort (vl-remove-if(function (lambda(x)(= (vl-string-elt x 0) zzz)))spisok1) '<))
(while (< n (length spisok1))
	(while (and (null flag1) (< m (length spisok1)))
		(if 	(and (/= n m)(> (vl-string-mismatch (nth n spisok1) (nth m spisok1) 0 0 T) num1))
				(setq flag1 T 
					spisok2	(append spisok2 (list 
						(vl-string-subst 
							"*" 
							(substr (nth n spisok1)(vl-string-mismatch (nth n spisok1) (nth m spisok1) 0 0 T)) 
							(nth n spisok1)))) 
				)
				(setq m (1+ m))
		)
	)
(setq n (1+ n) flag1 nil m 0)
)
(setq spisok2 (_kpblc-list-dublicates-remove spisok2))
(mapcar '(lambda(x)(setq spisok3 (strcat spisok3 "," x ))) spisok2)
(setq spisok3(vl-string-left-trim "," spisok3))
(princ)
)
я вот не могу понять почему следущем образом не происходит взрыв блоков?
Код:
[Выделить все]
 
(vla-clear(setq sel (vla-get-ActiveSelectionSet(vla-get-ActiveDocument (vlax-get-acad-object)))))
(pl:obj-filter-select-all sel (list '(0 . "insert") (cons 2 spisok3)))
(vlax-for x sel
	(vla-Explode x )
)
Composter вне форума  
 
Непрочитано 29.07.2014, 14:45
#5
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,848


Потому что после vla-explode надо вхождение удалять.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 29.07.2014, 15:00
#6
Composter

Отопление и вентиляция
 
Регистрация: 31.10.2008
Москва
Сообщений: 445


а как это осуществить?
Composter вне форума  
 
Непрочитано 29.07.2014, 15:12
#7
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,848


vla-erase, например.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 29.07.2014, 15:24
#8
Composter

Отопление и вентиляция
 
Регистрация: 31.10.2008
Москва
Сообщений: 445


ура получилось! спасибо всем.
остался еще вопрос . после вот этого
Код:
[Выделить все]
 
(vla-clear(setq sel (vla-get-ActiveSelectionSet(vla-get-ActiveDocument (vlax-get-acad-object)))))
(pl:obj-filter-select-all sel (list '(0 . "insert") (cons 2 spisok3)))
(vlax-for x sel
	(vla-Explode x )
)
(vlax-for x sel
	(vla-erase x )
)
нужно ли в конце добавлять
Код:
[Выделить все]
 
(vla-clear sel)
(vla-erase sel)
Composter вне форума  
 
Непрочитано 10.12.2015, 16:28
#9
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


А функцию (acad_strlsort) нельзя применить?
Profan вне форума  
 
Непрочитано 10.12.2015, 17:21
#10
VVA

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


Хоть и прошло уже 2 года, но "раз пошла такая пьянка", то есть еще SortStringWithNumberAsNumber, которая сортирует строки в соответствие с названием (в отличие от acad_strlsort)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 10.12.2015, 18:20
#11
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Очистка рисунка от "пустых" блоков Makswell Готовые программы 15 26.10.2022 15:24
Какой язык перспективен для инженера-конструктора с условием The_Mercy_Seat Программирование 705 17.03.2021 14:19
(Lisp) Работа с объектами внутри блоков maotai LISP 12 25.10.2018 15:22
Lisp. Как вставить описания всех блоков библиотеки блоков? Kirill_Ja LISP 5 11.04.2013 10:22
Тормозит команда расчленения набора блоков batmax Программирование 4 31.08.2010 17:37