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

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

Эспликация блоков из выбранного

Ответ
Поиск в этой теме
Непрочитано 26.08.2009, 15:58 #1
Эспликация блоков из выбранного
G-RAV
 
Геодезист
 
г.Новосибирск
Регистрация: 16.08.2009
Сообщений: 86

Опять возникла какая то невероятная идея.... Которую сам реализую вряд ли..
Допустим на чертеже есть несколько разных блоков (условные знаки), у каждого по одному атрибуту (номер). Я представляю себе задачу сл. образом:
Выбираешь необходимую область, в которой находятся необходимые блоки.."Ентер"
В свою очередь в лист (в любые координаты) вставляется список в виде текста (можно конечно и таблицу, но не принципиально), в котором
1-имя блока________2-сам блок (с пустым атрибутом)_______ 3-номера (например 1...5, 12,13)________ 4-количество блоков.

В качестве исходника прикрепляю dwg...

Вложения
Тип файла: dwg
DWG 2004
пример_экспликация.dwg (44.6 Кб, 1514 просмотров)

Просмотров: 7706
 
Автор темы   Непрочитано 02.09.2009, 20:12
#2
G-RAV

Геодезист
 
Регистрация: 16.08.2009
г.Новосибирск
Сообщений: 86
<phrase 1=


Попытался сам что-нибудь накалякать, но на выходе совсем не то, что хотелось бы... Пока решил вывод результата делать через promt. У меня получается список всех блоков
1 UZ1 86
2 UZ12 85
3 UZ12 84
4 UZ12 83
5 UZ12 82
6 UZ12 81
, а мне необходимо, для начала, их названия и количество
Например:
UZ1 - 22 шт.
UZ12 - 123 шт.
Ничего не получается , от функций по работе с примитивами уже мозги кипят , так что любой помощи буду рад....
Вот, собственно, мое безобразие:
Код:
[Выделить все]
(defun C:EKSPL (/ Nabor N NN old_cmdecho Objekt$Name SelEnt Objekt)
  (setq old_cmdecho (getvar "cmdecho"))
  (setvar "cmdecho" 0)
  (setq Objekt$Name "")
 
  (setq Nabor nil
 N 0
  )
 
  (setq Nabor (ssget))
  (repeat (sslength Nabor)
    (setq SelEnt (ssname Nabor N))
    (setq Objekt (entget SelEnt))
    (setq Objekt$Name (cdr (assoc 2 Objekt)))
    (if (/= Objekt$Name nil)
      (progn
 (setq SelEnt (entnext SelEnt))
 (setq NN (cdr (assoc 1 (entget SelEnt))))
 (setq N (+ N 1))
 (prompt (strcat "\n" (itoa N) "  " Objekt$Name " " NN))
      )
    )
  )
  (setvar "cmdecho" old_cmdecho)
)
G-RAV вне форума  
 
Непрочитано 03.09.2009, 08:47
#3
Do$

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


Если я правильно понял, тебе надо подсчитать количество блоков каждого типа в выбранном наборе? Так ведь уже есть готовые программы для этого - поиск.
Если сам хочешь написать такую, то я бы предложил следующий алгоритм: создаешь набор->преобразуешь набор в список с именами блоков->ведешь подсчет наименований в списке->выводишь результат в файл/на экран/в таблицу на чертеже
Самое сложное тут - преобразовать набор в список, тут тебе поможет ф-ция (производная от _kpblc-conv-selset-to-ename):
Код:
[Выделить все]
  (defun conv-selset-to-property-list (selset dxf / tab item)
                                     ;|
*    Преобразование набора, полученного через ssget, в список свойств
*    с определенным DXF-кодом
*    Параметры вызова:
	selset	набор примитивов
             dxf        dxf-код свойства
*    Примеры вызова:
(conv-selset-to-property-list (ssget) 0)
*    Ф-ция получена модификацией функции  _kpblc-conv-selset-to-ename,
      взятой отсюда: http://forum.dwg.ru/showpost.php?p=436453&postcount=6
|;

    (cond
      ((not selset) nil)
      ((= (type selset) 'pickset)
       (repeat (setq tab  nil
		     item (sslength selset)
	       ) ;_ end setq
	 (setq tab
		(cons
		  (cdr (assoc dxf
			      (entget (ssname selset (setq item (1- item))))
		       ) ;_ end of assoc
		  ) ;_ end of cdr
		  tab
		) ;_ end of cons
	 ) ;_ end of setq
       ) ;_ end repeat
      )
      ((listp selset) selset)
    ) ;_ end of cond
  ) ;_ end of defun

Последний раз редактировалось Do$, 03.09.2009 в 09:23. Причина: Авторские права
Do$ вне форума  
 
Автор темы   Непрочитано 03.09.2009, 10:27
#4
G-RAV

Геодезист
 
Регистрация: 16.08.2009
г.Новосибирск
Сообщений: 86
<phrase 1=


Цитата:
Сообщение от Do$ Посмотреть сообщение
Если я правильно понял, тебе надо подсчитать количество блоков каждого типа в выбранном наборе?
Да..Для начала.
Цитата:
Если сам хочешь написать такую, то я бы предложил следующий алгоритм: создаешь набор->преобразуешь набор в список с именами блоков->ведешь подсчет наименований в списке->выводишь результат в файл/на экран/в таблицу на чертеже
Самое сложное тут - преобразовать набор в список, тут тебе поможет ф-ция (производная от _kpblc-conv-selset-to-ename)
Присвоил dxf значение 2 - получил список с именами, даже отсортировал его с помощью acad_strlsort... Теперь не может до меня дойти - как подсчитать наименования в списке...
G-RAV вне форума  
 
Непрочитано 03.09.2009, 11:01
#5
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Цитата:
Сообщение от G-RAV Посмотреть сообщение
Присвоил dxf значение 2 - получил список с именами, даже отсортировал его с помощью acad_strlsort... Теперь не может до меня дойти - как подсчитать наименования в списке...
Допустим lst - твой список.
Берёшь первый элемент списка: (setq el (car lst))
Создаёшь новый список без этого элемента (setq new_lst (vl-remove el lst)
Вычисляешь разницу между длинами этих списков - это и будет количество элементов равных первому элементу списка.
На выходе остаётся new_lst - список не содержащий элементы, которые были равны первому элементу. К этому списку применяешь тот же алгоритм.
И так далее, пока new_lst не станет nil.

Как-то так короче.
Makswell вне форума  
 
Непрочитано 03.09.2009, 11:12
#6
Do$

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


Можно по такому алгоритму:
Цикл:
Берешь первое наименование списка->проходишь по списку, сравнивая каждое наиенование с выбранным, если одинаково: счетчик увеличиваем на 1, если нет, счетчик без изменений->в результирующий список заносишь наименование и количество->удаляешь из списка выбранное наименование (vl-remove)->берешь первое наименование получившегося списка... и так до тех пор, пока список не опустеет

О... это уже второй вариант...
Do$ вне форума  
 
Автор темы   Непрочитано 03.09.2009, 11:34
#7
G-RAV

Геодезист
 
Регистрация: 16.08.2009
г.Новосибирск
Сообщений: 86
<phrase 1=


УРААА! Вроде работает!!

Код:
[Выделить все]
(defun conv-selset-to-property-list (selset dxf  / tab item)
                                ;|
*    Преобразование набора, полученного через ssget, в список свойств
*    с определенным DXF-кодом
*    Параметры вызова:
 selset набор примитивов
             dxf        dxf-код свойства
*    Примеры вызова:
(conv-selset-to-property-list (ssget) 0)
*    Ф-ция получена модификацией функции  _kpblc-conv-selset-to-ename,
      взятой отсюда: http://forum.dwg.ru/showpost.php?p=436453&postcount=6
|;
(setq dxf 2)
    (cond
      ((not selset) nil)
      ((= (type selset) 'pickset)
       (repeat (setq tab  nil
       item (sslength selset)
        ) ;_ end setq
  (setq tab
  (acad_strlsort (cons
    (cdr (assoc dxf
         (entget (ssname selset (setq item (1- item))))
         ) ;_ end of assoc
    ) ;_ end of cdr
    tab
  ) ;_ end of cons
    )
  ) ;_ end of setq
       ) ;_ end repeat
      )
      ((listp selset) selset)
    ) ;_ end of cond
(While (/= tab nil)  
(setq el (car tab))
(setq new_lst (vl-remove el tab))
(setq kol (-(length tab) (length new_lst)))
  (prompt (strcat "\n" el "  " (itoa kol) "шт."))
(setq tab new_lst))  
  ) ;_ end of defun
Теперь мне необходимо добавить еще один пункт: у каждого блока по одному отрибуту (номера блоков на чертеже), необходимо, напротив имени и количества, указать еще и номера, в таком виде 1-17,22, 27... Пока не знаю как это сделать, но буду мучить этот же код.
G-RAV вне форума  
 
Непрочитано 03.09.2009, 11:40
#8
Сергей Богатов


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


это обязательно программно сделать? может dataextraction подойдёт? тем более автоматическое обновление данных
__________________
Я-проектировщик бывший проектировщик!
Сергей Богатов вне форума  
 
Автор темы   Непрочитано 03.09.2009, 11:42
#9
G-RAV

Геодезист
 
Регистрация: 16.08.2009
г.Новосибирск
Сообщений: 86
<phrase 1=


Да... Эти данные потом пойдут в таблицу... Получится автоматическая экспликация...
G-RAV вне форума  
 
Непрочитано 03.09.2009, 11:50
#10
Сергей Богатов


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


с помощью dataextraction тоже будет таблица(автоматическая экспликация). другое дело что если массив ещё в каких то других целях надо будет использовать... а если только чтоб табличку создать которая будет изменяться при появлении новых блоков, то dataextraction лучше всего
__________________
Я-проектировщик бывший проектировщик!
Сергей Богатов вне форума  
 
Автор темы   Непрочитано 03.09.2009, 11:52
#11
G-RAV

Геодезист
 
Регистрация: 16.08.2009
г.Новосибирск
Сообщений: 86
<phrase 1=


а можно подробнее про dataextraction?...
G-RAV вне форума  
 
Непрочитано 03.09.2009, 11:57
#12
Сергей Богатов


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


из хелпа
Цитата:
You can extract property data from objects in drawings and export the output to a table or to an external file.
Using the Data Extraction wizard, you select objects and their properties from which to extract data and save the parameters in a file. You can also combine the extracted data with information in a Microsoft Excel spreadsheet. Using table styles, you can quickly create a pre-formatted table that has a title and column labels.
When the extracted data is no longer current with the drawing, you can be notified that the table needs to be updated.
проще говоря - то что вам нужно
__________________
Я-проектировщик бывший проектировщик!
Сергей Богатов вне форума  
 
Автор темы   Непрочитано 03.09.2009, 12:06
#13
G-RAV

Геодезист
 
Регистрация: 16.08.2009
г.Новосибирск
Сообщений: 86
<phrase 1=


Если речь идет об извлечении атрибутов, то не подходит т.к. имеет не тот вид
Цитата:
Количество NN_PR Имя
1 13 UZ1
1 63 UZ2
1 36 UZ7
1 66 UZ2
1 37 UZ7
1 83 UZ12
1 10 UZ1
1 2 UZ1
1 52 UZ6
1 23 UZ2
1 40 UZ7
1 38 UZ7
1 33 UZ4
1 42 UZ7
1 49 UZ1
1 85 UZ12
1 51 UZ6
1 41 UZ7
1 46 UZ7
1 53 UZ6
1 43 UZ7
G-RAV вне форума  
 
Непрочитано 03.09.2009, 12:09
#14
Do$

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


Цитата:
Сообщение от G-RAV Посмотреть сообщение
УРААА! Вроде работает!!

Код:
[Выделить все]
(defun conv-selset-to-property-list (selset dxf  / tab item)
                                ;|
*    Преобразование набора, полученного через ssget, в список свойств
*    с определенным DXF-кодом
*    Параметры вызова:
 selset набор примитивов
             dxf        dxf-код свойства
*    Примеры вызова:
(conv-selset-to-property-list (ssget) 0)
*    Ф-ция получена модификацией функции  _kpblc-conv-selset-to-ename,
      взятой отсюда: http://forum.dwg.ru/showpost.php?p=436453&postcount=6
|;
(setq dxf 2)
    (cond
      ((not selset) nil)
      ((= (type selset) 'pickset)
       (repeat (setq tab  nil
       item (sslength selset)
        ) ;_ end setq
  (setq tab
  (acad_strlsort (cons
    (cdr (assoc dxf
         (entget (ssname selset (setq item (1- item))))
         ) ;_ end of assoc
    ) ;_ end of cdr
    tab
  ) ;_ end of cons
    )
  ) ;_ end of setq
       ) ;_ end repeat
      )
      ((listp selset) selset)
    ) ;_ end of cond
(While (/= tab nil)  
(setq el (car tab))
(setq new_lst (vl-remove el tab))
(setq kol (-(length tab) (length new_lst)))
  (prompt (strcat "\n" el "  " (itoa kol) "шт."))
(setq tab new_lst))  
  ) ;_ end of defun
Теперь мне необходимо добавить еще один пункт: у каждого блока по одному отрибуту (номера блоков на чертеже), необходимо, напротив имени и количества, указать еще и номера, в таком виде 1-17,22, 27... Пока не знаю как это сделать, но буду мучить этот же код.
Просьба небольшая - если изменил функцию, смени название...
Do$ вне форума  
 
Автор темы   Непрочитано 03.09.2009, 12:17
#15
G-RAV

Геодезист
 
Регистрация: 16.08.2009
г.Новосибирск
Сообщений: 86
<phrase 1=


Do$, хорошо! Это просто пробный вариант - поиск истины

Сергей Богатов, я сейчас поэксперементировал, получается, что если не использовать атрибуты, то имеет подходящий вид, а вот если же включать атрибуты(номера) идет перечисление всех блоков...
G-RAV вне форума  
 
Непрочитано 03.09.2009, 12:44
#16
Сергей Богатов


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


виноват, не дочитал условия задачи до конца
__________________
Я-проектировщик бывший проектировщик!
Сергей Богатов вне форума  
 
Автор темы   Непрочитано 03.09.2009, 12:47
#17
G-RAV

Геодезист
 
Регистрация: 16.08.2009
г.Новосибирск
Сообщений: 86
<phrase 1=


прокоментируйте кто-нибудь сл. момент:
Код:
[Выделить все]
(= (type selset) 'pickset)
особенно интересно про 'pickset
G-RAV вне форума  
 
Непрочитано 03.09.2009, 12:58
#18
Do$

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


Цитата:
Сообщение от G-RAV Посмотреть сообщение
прокоментируйте кто-нибудь сл. момент:
Код:
[Выделить все]
(= (type selset) 'pickset)
особенно интересно про 'pickset
Проверка, является ли selset набором
Do$ вне форума  
 
Автор темы   Непрочитано 03.09.2009, 17:17
#19
G-RAV

Геодезист
 
Регистрация: 16.08.2009
г.Новосибирск
Сообщений: 86
<phrase 1=


У меня опять ступор ... Короче подправил код, да простит меня Алексей, навводил туда кучу переменных (просто так соображается лучше).... Сейчас у меня получается список из элементов типа - "название блока - номер".... и соответсвенно старая схема подсчета количества не подходит, плюс ко всему мне еще необходимо перечислить номера каждого наименования... Вот собственно код:
Код:
[Выделить все]
 
(defun C:ESP (/ selset SelEnt tab objekt objektname NN item)
  (setq selset (ssget))
  (cond
    ((not selset) nil)
    ((= (type selset) 'pickset)
     (repeat
       (setq tab  nil
      item (sslength selset)
       ) ;_ end setq
 (setq SelEnt  (ssname selset (setq item (1- item)))
       objekt  (entget SelEnt)
       objektname (cdr (assoc 2 objekt))
       SelEnt  (entnext SelEnt)
       NN  (cdr (assoc 1 (entget SelEnt)))
       tab  (cons (strcat objektname " " NN) tab)
 ) ;_ end of setq

     ) ;_ end repeat
    )
    ((listp selset) selset)
  ) ;_ end of cond
) ;_ end of defun
А вот то, что получается на выходе:
Цитата:
("UZ1 86" "UZ12 85" "UZ12 84" "UZ12 83" "UZ12 82" "UZ12 81" "UZ12 80" "UZ12 79"
"UZ12 78" "UZ12 77" "UZ12 76" "UZ12 75" "UZ12 74" "UZ12 73" "UZ1 72" "UZ2 71"
"UZ2 70" "UZ2 69" "UZ2 68" "UZ2 67" "UZ2 66" "UZ2 65" "UZ2 64" "UZ2 63" "UZ2
62" "UZ2 61" "UZ2 60" "UZ2 59" "UZ6 58" "UZ6 57" "UZ6 56" "UZ6 55" "UZ6 54"
"UZ6 53" "UZ6 52" "UZ6 51" "UZ6 50" "UZ1 49" "UZ7 48" "UZ7 47" "UZ7 46" "UZ7
45" "UZ7 44" "UZ7 43" "UZ7 42" "UZ7 41" "UZ7 40" "UZ7 39" "UZ7 38" "UZ7 37"
"UZ7 36" "UZ4 35" "UZ4 34" "UZ4 33" "UZ4 32" "UZ4 31" "UZ4 30" "UZ4 29" "UZ4
28" "UZ4 27" "UZ2 26" "UZ2 25" "UZ2 24" "UZ2 23" "UZ2 22" "UZ2 21" "UZ2 20"
"UZ2 19" "UZ2 18" "UZ2 17" "UZ2 16" "UZ2 15" "UZ2 14" "UZ1 13" "UZ1 12" "UZ1
11" "UZ1 10" "UZ1 9" "UZ1 8" "UZ1 7" "UZ1 6" "UZ1 5" "UZ1 4" "UZ1 3" "UZ1 2"
"UZ1 1")
Если есть у кого какие-нибудь мысли, поможите
G-RAV вне форума  
 
Непрочитано 03.09.2009, 19:19
#20
Do$

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


Мысль номер один: зря ты в одну строку сгоняешь наименование и номер
Мысль номер два: на выходе еще надо поставить реверс списка
Мысль номер три:
Код:
[Выделить все]
tab  (cons (strcat objektname " " NN) tab)
замени на
Код:
[Выделить все]
tab  (cons (list objektname NN) tab)
На выходе получишь двухуровненвый список, с ним полегче будет.
Мысль номер четыре: алгоритм подсчета тот же (пост номер 5 и 6), только вместо vl-remove используй vl-remove-if.

Последний раз редактировалось Do$, 03.09.2009 в 20:46.
Do$ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Эспликация блоков из выбранного

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Очистка рисунка от "пустых" блоков Makswell Готовые программы 15 26.10.2022 15:24
Обновление атрибутов всех блоков (Attsync для всех блоков) Vildar AutoCAD 3 18.05.2022 14:28
VBA: утечка памяти при вставке блоков Mikha Программирование 13 03.04.2009 09:18
Изменить параметры у всех объектов внутри блоков 800x600 AutoCAD 5 25.03.2008 14:21
Взрыв блоков Filcarpenter Разное 19 28.01.2007 09:57