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

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

Выбор блоков по значению атрибутов.

Ответ
Поиск в этой теме
Непрочитано 18.01.2007, 19:11 #1
Выбор блоков по значению атрибутов.
Sleekka
 
-
 
Москва
Регистрация: 24.07.2005
Сообщений: 1,335

Кто нибудь может помощь модифицировать макрос данной программы дело в том что она выбирает только вхождения обычных блоков а хотелось бы еще и динамических.
http://dwg.ru/dnl/254
Просмотров: 29546
 
Непрочитано 10.09.2009, 16:33
#2
zenon

Остекляем!!! Алюминим!!!
 
Регистрация: 21.02.2005
Москва
Сообщений: 3,825
<phrase 1=


Реанимирую данную тему.
Вопрос собственно расширился.
Нужно выбрать вхождения блоков из указанной области, либо со всего чертежа по значению атрибута.
Условия:
1. Блоки обычные и динамические
2. Различные как по имени, так и по др. параметрам, лишь бы было наличие атрибута.
3. Выбор производится по значению атрибута, тэг атрибута может быть различным.
__________________
Мы можем делать быстро, качественно и недорого, выбирайте любые 2 условия.:search:
zenon вне форума  
 
Непрочитано 10.09.2009, 16:41
#3
Кулик Алексей aka kpblc
Moderator

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


В результате надо получить список указателей на блоки?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.09.2009, 16:54
#4
zenon

Остекляем!!! Алюминим!!!
 
Регистрация: 21.02.2005
Москва
Сообщений: 3,825
<phrase 1=


Нет, нужно получить выбранный набор блоков аналогичный простому выбору мышкой.
__________________
Мы можем делать быстро, качественно и недорого, выбирайте любые 2 условия.:search:
zenon вне форума  
 
Непрочитано 10.09.2009, 17:08
#5
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 5,989


Цитата:
Сообщение от zenon Посмотреть сообщение
Условия:
1. Блоки обычные и динамические
2. Различные как по имени, так и по др. параметрам, лишь бы было наличие атрибута.
3. Выбор производится по значению атрибута, тэг атрибута может быть различным.
выбирайте любые 2 условия

Код:
[Выделить все]
;;;CADALYST 07/06  Tip2128: ATT-SELECT.lsp  Attribute Filter   (c) Raymond Rizkallah


(defun rt1 ()                            ;;; only ATTRIB or NULL will be selected

    (setq e1 (nentsel "\nSelect attribute to filter: "))

    (if (null e1) 
      (progn (setq ex_tag nil) (QUIT)) 
      (progn
        (while (/= (cdr (assoc 0 (entget (car e1)))) "ATTRIB") 
          (PRINC "Attribute not found. ") (princ (cdr (assoc 0 (entget (car e1)))))   
          (RT1) 
        ) ;end while
         
      )   ;end progn
    )     ;end if
) 

;__________________________________________________________
(defun C:TT ()

  
   (RT1) 
;  (setq e1 (nentsel "\nSelect attribute to filter: "))
   (setvar "cmdecho" 0)
   (setq eget (entget (car e1))) 
   (setq EX_STR (cdr (assoc 1 EGET)))   ;EXISTING TEXTSTRING
   (setq ex_tag (cdr (assoc 2 EGET)))   ;EXISTING tag

  (SETQ PT1 (CADR E1))
  (SETQ SS0 (SSGET PT1))
  (SETQ BLKNAME (CDR (ASSOC 2 (ENTGET (SSNAME SS0 0)))))
 
  (prompt (strcat "\n Block: " blkname "   Attribute tag: " ex_tag "   >: " ex_str))
  
  
;______________ SELECTING BLOCKS "BLKNAME" _________________

  (SETQ LST1 (LIST '(0 . "INSERT") (CONS 2 BLKNAME)) )
  (SETQ SS1 (SSGET "_X" LST1))
; (SETQ SS1 (SSGET LST1))
; (IF (NULL SS1) (SETQ SS1 (SSGET "_X" LST1)) )

  (setq SSM (SSADD))
  (setq len1 (sslength ss1) n1 0 ssx (ssadd))


  (WHILE (< n1 len1) ;WHILE 1
    (setq ename1 (ssname ss1 n1) eget1 (entget ename1) CTRL1 nil COUNTER 0 str1 "") 
    (SETQ en1 ename1)
    ;____ Find Tag Level
    (while (and (null ctrl1) (/= (CDR (ASSOC 0 (ENTGET (setq en1 (ENTNEXT en1))))) "SEQEND"))
           (setq tag1 (CDR (ASSOC 2 (ENTGET en1))))
           (if (= tag1 ex_tag) (setq str1 (CDR (ASSOC 1 (ENTGET en1))) ctrl1 T))
           (setq counter (1+ counter))
    ) ;end while2
    ;_____
 
    ;(if (= str1 ex_str) (princ str1))
    (if (= (STRCASE str1) (STRCASE ex_str)) (setq ssx (ssadd ename1 ssx)))
    (setq n1 (1+ n1))
  ) ; end WHILE1
              

  (setq lenx (sslength ssx))  
  (command "_.select" ssx "") 
  (PROMPT (strcat "\n Match found : [" (itoa lenx) "].   Selected objects are stored in Previous Selection."))
  (setvar "cmdecho" 1) 
  (princ)
)
;_____________________________________________________________

(prompt "\n Start command with [TT]  - by Raymond Rizkallah -  April 06. ")
(PRINC)
программа не работает с динамческими блоками.
kpblc-а Вам в помощь!

Последний раз редактировалось Nike, 10.09.2009 в 17:16.
Nike вне форума  
 
Непрочитано 10.09.2009, 17:12
#6
zenon

Остекляем!!! Алюминим!!!
 
Регистрация: 21.02.2005
Москва
Сообщений: 3,825
<phrase 1=


Nike, поддержка ? и * (выбор любого знака или любого количества знаков), а также операторов < > = и т.д. присутствует??
__________________
Мы можем делать быстро, качественно и недорого, выбирайте любые 2 условия.:search:
zenon вне форума  
 
Непрочитано 10.09.2009, 17:14
#7
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 5,989


zenon, если ты имеешь в виду "маски" то увы, нет
Nike вне форума  
 
Непрочитано 11.09.2009, 08:30
#8
Кулик Алексей aka kpblc
Moderator

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


Без масок:
Код:
[Выделить все]
(defun get-blocks-by-attr (/                            ent                          fun_get-attr
                           _kpblc-conv-selset-to-ename  _kpblc-conv-vla-to-list      _kpblc-conv-ent-to-vla
                           _kpblc-conv-ent-to-ename     _kpblc-conv-list-to-string   _kpblc-conv-value-to-string
                           res
                           )

  (defun _kpblc-conv-list-to-string (lst sep)
                                    ;|
*    Преобразование списка в строку
*    Параметры вызова:
	lst	обрабатываемй список
	sep	разделитель. nil -> " "
|;
    (setq lst (mapcar (function _kpblc-conv-value-to-string) lst)
          sep (if sep
                sep
                " "
                ) ;_ end of if
          ) ;_ end of setq
    (strcat (car lst)
            (apply (function strcat)
                   (mapcar
                     (function
                       (lambda (x)
                         (strcat sep x)
                         ) ;_ end of lambda
                       ) ;_ end of function
                     (cdr lst)
                     ) ;_ end of mapcar
                   ) ;_ end of apply
            ) ;_ end of strcat
    ) ;_ end of defun

  (defun _kpblc-conv-value-to-string (value /)
                                     ;|
*    конвертация значения в строку.
|;
    (cond
      ((= (type value) 'str) value)
      ((= (type value) 'int) (itoa value))
      ((= (type value) 'real) (rtos value 2 14))
      ((not value) "")
      (t (vl-princ-to-string value))
      ) ;_ end of cond
    ) ;_ end of defun


  (defun fun_get-attr (blk)
    (append (_kpblc-conv-vla-to-list (vla-getattributes blk))
            (_kpblc-conv-vla-to-list (vla-getconstantattributes blk))
            ) ;_ end of append
    ) ;_ end of defun

  (defun _kpblc-conv-selset-to-ename (selset / tab item)
                                     ;|
*    Преобразование набора, полученного через ssget, в список ename-представлени
* примитивов.
*    Параметры вызова:
	selset	набор примитивов
*    Примеры вызова:
(_kpblc-conv-selset-to-ename (ssget))
|;
    (cond
      ((not selset) nil)
      ((= (type selset) 'pickset)
       (repeat (setq tab  nil
                     item (sslength selset)
                     ) ;_ end setq
         (setq tab (cons (ssname selset (setq item (1- item))) tab))
         ) ;_ end repeat
       )
      ((= (type selset) 'vla-object)
       (_kpblc-conv-vla-to-list selset)
       )
      ((listp selset) selset)
      ) ;_ end of cond
    ) ;_ end of defun

  (defun _kpblc-conv-vla-to-list (value / res)
                                 ;|
*    Преобразовывает vlax-variant или vlax-safearray в список.
|;
    (cond
      ((listp value)
       (mapcar '_kpblc-conv-vla-to-list value)
       )
      ((= (type value) 'variant)
       (_kpblc-conv-vla-to-list (vlax-variant-value value))
       )
      ((= (type value) 'safearray)
       (if (>= (vlax-safearray-get-u-bound value 1) 0)
         (_kpblc-conv-vla-to-list (vlax-safearray->list value))
         ) ;_ end of if
       )
      ((and (member (type value) (list 'ename 'str 'vla-object))
            (= (type (_kpblc-conv-ent-to-vla value)) 'vla-object)
            (vlax-property-available-p (_kpblc-conv-ent-to-vla value) 'count)
            ) ;_ end of and
       (vlax-for sub (_kpblc-conv-ent-to-vla value)
         (setq res (cons sub res))
         ) ;_ end of vlax-for
       )
      (t value)
      ) ;_ end of cond
    ) ;_ end of defun

  (defun _kpblc-conv-ent-to-ename (ent_value /)
                                  ;|
*    Функция преобразования полученного значения в ename
*    Параметры вызова:
*	ent_value	значение, которое надо преобразовать в примитив. Может
*			быть именем примитива, vla-указателем или просто
*			списком.
*			Если не принадлежит ни одному из указанных типов,
*			возвращается nil
*    Примеры вызова:
(_kpblc-conv-ent-to-ename (entlast))
(_kpblc-conv-ent-to-ename (vlax-ename->vla-object (entlast)))
|;
    (cond
      ((= (type ent_value) 'vla-object)
       (vlax-vla-object->ename ent_value)
       )
      ((= (type ent_value) 'ename) ent_value)
      ((= (type ent_value) 'str) (handent ent_value))
      ((= (type ent_value) 'list) (cdr (assoc -1 ent_value)))
      (t nil)
      ) ;_ end of cond
    ) ;_ end of defun

  (defun _kpblc-conv-ent-to-vla (ent_value / res)
                                ;|
*    Функция преобразования полученного значения в vla-указатель.
*    Параметры вызова:
*	ent_value	значение, которое надо преобразовать в указатель. Может
*			быть именем примитива, vla-указателем или просто
*			списком.
*			Если не принадлежит ни одному из указанных типов,
*			возвращается nil
*    Примеры вызова:
(_kpblc-conv-ent-to-vla (entlast))
(_kpblc-conv-ent-to-vla (vlax-ename->vla-object (entlast)))
|;
    (cond
      ((= (type ent_value) 'vla-object) ent_value)
      ((= (type ent_value) 'ename) (vlax-ename->vla-object ent_value))
      ((setq res (_kpblc-conv-ent-to-ename ent_value))
       (vlax-ename->vla-object res)
       )
      ) ;_ end of cond
    ) ;_ end of defun


  (vl-load-com)
  (if (and (= (type (setq ent (vl-catch-all-apply
                                (function
                                  (lambda ()
                                    (car (nentsel "\nУкажите атрибут <Отмена> : "))
                                    ) ;_ end of lambda
                                  ) ;_ end of function
                                ) ;_ end of vl-catch-all-apply
                          ) ;_ end of setq
                    ) ;_ end of type
              'ename
              ) ;_ end of =
           (= (cdr (assoc 0 (entget ent))) "ATTRIB")
           ) ;_ end of and
    (progn
      (setq ent (vla-get-textstring (vlax-ename->vla-object ent))
            res (vl-remove-if-not
                  (function
                    (lambda (x / lst)
                      (and (setq lst (fun_get-attr x))
                           (wcmatch
                             ent
                             (strcase (_kpblc-conv-list-to-string (mapcar (function vla-get-textstring) lst) ","))
                             ) ;_ end of wcmatch
                           ) ;_ end of and
                      ) ;_ end of lambda
                    ) ;_ end of function
                  (mapcar (function vlax-ename->vla-object)
                          (_kpblc-conv-selset-to-ename (ssget "_X" '((0 . "INSERT"))))
                          ) ;_ end of mapcar
                  ) ;_ end of vl-remove-if-not
            ) ;_ end of setq
      ) ;_ end of progn
    ) ;_ end of if
  res
  ) ;_ end of defun
С поддержкой маски не очень понял - где и как ее задавать?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.09.2009, 08:59
#9
tutanhamon


 
Блог
 
Регистрация: 06.09.2007
Архангельск/СПб
Сообщений: 460


Кулик Алексей aka kpblc ,
мне кажется, что маски тут подразумевается использование символов * и ? в значении атрибута. Например, если плиты перекрытий обозначать как ПП01..П25, то к примеру маска вида ПП1* будет обоначать выбор всех блоков, у которых атрибут в диапазоне ПП10-ПП19.
Такое сравнение строк легко реализуется с помощью wcmatch
tutanhamon вне форума  
 
Непрочитано 11.09.2009, 09:07
#10
Кулик Алексей aka kpblc
Moderator

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


Это я понимаю. Вопрос - где (и, самое главное, как?) будет пользователь указывать место расположения маски? Допустим, выбран атрибут со значением ПП-123. Надо добавить маску, к примеру, [A-Z]. Каков должен получиться критерий: П[A-Z]П-123? [A-Z]ПП-123? [A-Z]П[A-Z]П-123? Вариантов-то немеряно.
Это и есть в данный момент основная проблема. Остальное - не сложно.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.09.2009, 09:24
#11
zenon

Остекляем!!! Алюминим!!!
 
Регистрация: 21.02.2005
Москва
Сообщений: 3,825
<phrase 1=


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Это я понимаю. Вопрос - где (и, самое главное, как?) будет пользователь указывать место расположения маски? Допустим, выбран атрибут со значением ПП-123. Надо добавить маску, к примеру, [A-Z]. Каков должен получиться критерий: П[A-Z]П-123? [A-Z]ПП-123? [A-Z]П[A-Z]П-123? Вариантов-то немеряно.
Это и есть в данный момент основная проблема. Остальное - не сложно.
Попробую расписать
1. Нужно произвести выбор вхождений блоков с атрибутами.
2. Задается область выбора или на весь чертеж
3. Программа просит ввести значение атрибута по которому будет производится выбор.
4. Пользователь указывает значение, для примера ПП-*, где маска означает выбрать все блоки у которых значения атрибута начинается с ПП-(а здесь любое количество знаков).
5. Производится выбор.
__________________
Мы можем делать быстро, качественно и недорого, выбирайте любые 2 условия.:search:
zenon вне форума  
 
Непрочитано 11.09.2009, 09:27
#12
Кулик Алексей aka kpblc
Moderator

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


И чего с этим выбором сделать? Подсветить?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.09.2009, 09:45
#13
zenon

Остекляем!!! Алюминим!!!
 
Регистрация: 21.02.2005
Москва
Сообщений: 3,825
<phrase 1=


аналогично команде _qselect
__________________
Мы можем делать быстро, качественно и недорого, выбирайте любые 2 условия.:search:
zenon вне форума  
 
Непрочитано 11.09.2009, 10:00
#14
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
(defun c:get-blocks-by-attr (/                           value                       selset
                             res                         fun_get-attr                _kpblc-conv-selset-to-ename
                             _kpblc-conv-vla-to-list     _kpblc-conv-ent-to-vla      _kpblc-conv-ent-to-ename
                             _kpblc-conv-list-to-string  _kpblc-conv-value-to-string
                             )

  (defun _kpblc-conv-list-to-string (lst sep)
                                    ;|
*    Преобразование списка в строку
*    Параметры вызова:
	lst	обрабатываемй список
	sep	разделитель. nil -> " "
|;
    (setq lst (mapcar (function _kpblc-conv-value-to-string) lst)
          sep (if sep
                sep
                " "
                ) ;_ end of if
          ) ;_ end of setq
    (strcat (car lst)
            (apply (function strcat)
                   (mapcar
                     (function
                       (lambda (x)
                         (strcat sep x)
                         ) ;_ end of lambda
                       ) ;_ end of function
                     (cdr lst)
                     ) ;_ end of mapcar
                   ) ;_ end of apply
            ) ;_ end of strcat
    ) ;_ end of defun

  (defun _kpblc-conv-value-to-string (value /)
                                     ;|
*    конвертация значения в строку.
|;
    (cond
      ((= (type value) 'str) value)
      ((= (type value) 'int) (itoa value))
      ((= (type value) 'real) (rtos value 2 14))
      ((not value) "")
      (t (vl-princ-to-string value))
      ) ;_ end of cond
    ) ;_ end of defun


  (defun fun_get-attr (blk)
    (append (_kpblc-conv-vla-to-list (vla-getattributes blk))
            (_kpblc-conv-vla-to-list (vla-getconstantattributes blk))
            ) ;_ end of append
    ) ;_ end of defun

  (defun _kpblc-conv-selset-to-ename (selset / tab item)
                                     ;|
*    Преобразование набора, полученного через ssget, в список ename-представлени
* примитивов.
*    Параметры вызова:
	selset	набор примитивов
*    Примеры вызова:
(_kpblc-conv-selset-to-ename (ssget))
|;
    (cond
      ((not selset) nil)
      ((= (type selset) 'pickset)
       (repeat (setq tab  nil
                     item (sslength selset)
                     ) ;_ end setq
         (setq tab (cons (ssname selset (setq item (1- item))) tab))
         ) ;_ end repeat
       )
      ((= (type selset) 'vla-object)
       (_kpblc-conv-vla-to-list selset)
       )
      ((listp selset) selset)
      ) ;_ end of cond
    ) ;_ end of defun

  (defun _kpblc-conv-vla-to-list (value / res)
                                 ;|
*    Преобразовывает vlax-variant или vlax-safearray в список.
|;
    (cond
      ((listp value)
       (mapcar '_kpblc-conv-vla-to-list value)
       )
      ((= (type value) 'variant)
       (_kpblc-conv-vla-to-list (vlax-variant-value value))
       )
      ((= (type value) 'safearray)
       (if (>= (vlax-safearray-get-u-bound value 1) 0)
         (_kpblc-conv-vla-to-list (vlax-safearray->list value))
         ) ;_ end of if
       )
      ((and (member (type value) (list 'ename 'str 'vla-object))
            (= (type (_kpblc-conv-ent-to-vla value)) 'vla-object)
            (vlax-property-available-p (_kpblc-conv-ent-to-vla value) 'count)
            ) ;_ end of and
       (vlax-for sub (_kpblc-conv-ent-to-vla value)
         (setq res (cons sub res))
         ) ;_ end of vlax-for
       )
      (t value)
      ) ;_ end of cond
    ) ;_ end of defun

  (defun _kpblc-conv-ent-to-ename (ent_value /)
                                  ;|
*    Функция преобразования полученного значения в ename
*    Параметры вызова:
*	ent_value	значение, которое надо преобразовать в примитив. Может
*			быть именем примитива, vla-указателем или просто
*			списком.
*			Если не принадлежит ни одному из указанных типов,
*			возвращается nil
*    Примеры вызова:
(_kpblc-conv-ent-to-ename (entlast))
(_kpblc-conv-ent-to-ename (vlax-ename->vla-object (entlast)))
|;
    (cond
      ((= (type ent_value) 'vla-object)
       (vlax-vla-object->ename ent_value)
       )
      ((= (type ent_value) 'ename) ent_value)
      ((= (type ent_value) 'str) (handent ent_value))
      ((= (type ent_value) 'list) (cdr (assoc -1 ent_value)))
      (t nil)
      ) ;_ end of cond
    ) ;_ end of defun

  (defun _kpblc-conv-ent-to-vla (ent_value / res)
                                ;|
*    Функция преобразования полученного значения в vla-указатель.
*    Параметры вызова:
*	ent_value	значение, которое надо преобразовать в указатель. Может
*			быть именем примитива, vla-указателем или просто
*			списком.
*			Если не принадлежит ни одному из указанных типов,
*			возвращается nil
*    Примеры вызова:
(_kpblc-conv-ent-to-vla (entlast))
(_kpblc-conv-ent-to-vla (vlax-ename->vla-object (entlast)))
|;
    (cond
      ((= (type ent_value) 'vla-object) ent_value)
      ((= (type ent_value) 'ename) (vlax-ename->vla-object ent_value))
      ((setq res (_kpblc-conv-ent-to-ename ent_value))
       (vlax-ename->vla-object res)
       )
      ) ;_ end of cond
    ) ;_ end of defun


  (vl-load-com)
  (if (and (= (type
                (setq value (vl-catch-all-apply
                              (function
                                (lambda ()
                                  (getstring "\nВведите значение атрибута для фильтрации (с учетом маски) <Отмена> : ")
                                  ) ;_ end of lambda
                                ) ;_ end of function
                              ) ;_ end of vl-catch-all-apply
                      ) ;_ end of setq
                ) ;_ end of type
              'str
              ) ;_ end of =
           (= (type (setq selset (vl-catch-all-apply
                                   (function
                                     (lambda ()
                                       (ssget '((0 . "INSERT") (66 . 1)))
                                       ) ;_ end of lambda
                                     ) ;_ end of function
                                   ) ;_ end of vl-catch-all-apply
                          ) ;_ end of setq
                    ) ;_ end of type
              ) ;_ end of =
           ) ;_ end of and
    (progn
      (setq selset
                   (vl-remove-if-not
                     (function
                       (lambda (x / lst)
                         (setq lst (mapcar (function vla-get-textstring) (fun_get-attr (vlax-ename->vla-object x))))
                         (vl-remove-if-not
                           (function
                             (lambda (a)
                               (wcmatch a value)
                               ) ;_ end of lambda
                             ) ;_ end of function
                           lst
                           ) ;_ end of vl-remove-if-not
                         ) ;_ end of lambda
                       ) ;_ end of function
                     (_kpblc-conv-selset-to-ename selset)
                     ) ;_ end of vl-remove-if-not
            res    (ssadd)
            ) ;_ end of setq
      (foreach item selset
        (ssadd item res)
        ) ;_ end of foreach
      (sssetfirst res res)
      ) ;_ end of progn
    ) ;_ end of if
  (princ)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 11.09.2009 в 10:48. Причина: Добавил в конец кода (princ)
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.09.2009, 10:43
#15
zenon

Остекляем!!! Алюминим!!!
 
Регистрация: 21.02.2005
Москва
Сообщений: 3,825
<phrase 1=


Кулик Алексей aka kpblc, спасибо самое оно
__________________
Мы можем делать быстро, качественно и недорого, выбирайте любые 2 условия.:search:
zenon вне форума  
 
Непрочитано 24.12.2009, 12:18
#16
saa


 
Регистрация: 25.09.2008
Новосибирск
Сообщений: 218


Кулик Алексей aka kpblc
А можно сделать фильтр и на имя атрибута и на его значение?
saa вне форума  
 
Непрочитано 25.12.2009, 01:53
#17
Кулик Алексей aka kpblc
Moderator

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


Данные вводить с клавы или "ткнуть" на образец атрибута надо?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.12.2009, 05:47
#18
saa


 
Регистрация: 25.09.2008
Новосибирск
Сообщений: 218


Лучше с клавы, ведь атрибут может быть скрытым.
saa вне форума  
 
Непрочитано 25.12.2009, 13:13
#19
Кулик Алексей aka kpblc
Moderator

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


Ну, как вариант:
Код:
[Выделить все]
(defun c:get-blocks-by-tag-and-val (/                         attr                      tag
                                    value                     selset                    res
                                    fun_get-attr              _kpblc-conv-selset-to-ename
                                    _kpblc-conv-vla-to-list   _kpblc-conv-ent-to-vla    _kpblc-conv-ent-to-ename
                                    _kpblc-conv-list-to-string                          _kpblc-conv-value-to-string
                                    )

  (defun _kpblc-conv-list-to-string (lst sep)
                                    ;|
*    Преобразование списка в строку
*    Параметры вызова:
	lst	обрабатываемй список
	sep	разделитель. nil -> " "
|;
    (setq lst (mapcar (function _kpblc-conv-value-to-string) lst)
          sep (if sep
                sep
                " "
                ) ;_ end of if
          ) ;_ end of setq
    (strcat (car lst)
            (apply (function strcat)
                   (mapcar
                     (function
                       (lambda (x)
                         (strcat sep x)
                         ) ;_ end of lambda
                       ) ;_ end of function
                     (cdr lst)
                     ) ;_ end of mapcar
                   ) ;_ end of apply
            ) ;_ end of strcat
    ) ;_ end of defun

  (defun _kpblc-conv-value-to-string (value /)
                                     ;|
*    конвертация значения в строку.
|;
    (cond
      ((= (type value) 'str) value)
      ((= (type value) 'int) (itoa value))
      ((= (type value) 'real) (rtos value 2 14))
      ((not value) "")
      (t (vl-princ-to-string value))
      ) ;_ end of cond
    ) ;_ end of defun


  (defun fun_get-attr (blk)
    (append (_kpblc-conv-vla-to-list (vla-getattributes blk))
            (_kpblc-conv-vla-to-list (vla-getconstantattributes blk))
            ) ;_ end of append
    ) ;_ end of defun

  (defun _kpblc-conv-selset-to-ename (selset / tab item)
                                     ;|
*    Преобразование набора, полученного через ssget, в список ename-представлени
* примитивов.
*    Параметры вызова:
	selset	набор примитивов
*    Примеры вызова:
(_kpblc-conv-selset-to-ename (ssget))
|;
    (cond
      ((not selset) nil)
      ((= (type selset) 'pickset)
       (repeat (setq tab  nil
                     item (sslength selset)
                     ) ;_ end setq
         (setq tab (cons (ssname selset (setq item (1- item))) tab))
         ) ;_ end repeat
       )
      ((= (type selset) 'vla-object)
       (_kpblc-conv-vla-to-list selset)
       )
      ((listp selset) selset)
      ) ;_ end of cond
    ) ;_ end of defun

  (defun _kpblc-conv-vla-to-list (value / res)
                                 ;|
*    Преобразовывает vlax-variant или vlax-safearray в список.
|;
    (cond
      ((listp value)
       (mapcar '_kpblc-conv-vla-to-list value)
       )
      ((= (type value) 'variant)
       (_kpblc-conv-vla-to-list (vlax-variant-value value))
       )
      ((= (type value) 'safearray)
       (if (>= (vlax-safearray-get-u-bound value 1) 0)
         (_kpblc-conv-vla-to-list (vlax-safearray->list value))
         ) ;_ end of if
       )
      ((and (member (type value) (list 'ename 'str 'vla-object))
            (= (type (_kpblc-conv-ent-to-vla value)) 'vla-object)
            (vlax-property-available-p (_kpblc-conv-ent-to-vla value) 'count)
            ) ;_ end of and
       (vlax-for sub (_kpblc-conv-ent-to-vla value)
         (setq res (cons sub res))
         ) ;_ end of vlax-for
       )
      (t value)
      ) ;_ end of cond
    ) ;_ end of defun

  (defun _kpblc-conv-ent-to-ename (ent_value /)
                                  ;|
*    Функция преобразования полученного значения в ename
*    Параметры вызова:
*	ent_value	значение, которое надо преобразовать в примитив. Может
*			быть именем примитива, vla-указателем или просто
*			списком.
*			Если не принадлежит ни одному из указанных типов,
*			возвращается nil
*    Примеры вызова:
(_kpblc-conv-ent-to-ename (entlast))
(_kpblc-conv-ent-to-ename (vlax-ename->vla-object (entlast)))
|;
    (cond
      ((= (type ent_value) 'vla-object)
       (vlax-vla-object->ename ent_value)
       )
      ((= (type ent_value) 'ename) ent_value)
      ((= (type ent_value) 'str) (handent ent_value))
      ((= (type ent_value) 'list) (cdr (assoc -1 ent_value)))
      (t nil)
      ) ;_ end of cond
    ) ;_ end of defun

  (defun _kpblc-conv-ent-to-vla (ent_value / res)
                                ;|
*    Функция преобразования полученного значения в vla-указатель.
*    Параметры вызова:
*	ent_value	значение, которое надо преобразовать в указатель. Может
*			быть именем примитива, vla-указателем или просто
*			списком.
*			Если не принадлежит ни одному из указанных типов,
*			возвращается nil
*    Примеры вызова:
(_kpblc-conv-ent-to-vla (entlast))
(_kpblc-conv-ent-to-vla (vlax-ename->vla-object (entlast)))
|;
    (cond
      ((= (type ent_value) 'vla-object) ent_value)
      ((= (type ent_value) 'ename) (vlax-ename->vla-object ent_value))
      ((setq res (_kpblc-conv-ent-to-ename ent_value))
       (vlax-ename->vla-object res)
       )
      ) ;_ end of cond
    ) ;_ end of defun


  (vl-load-com)
  (if
    (and
      (or (and (= (type (setq attr (vl-catch-all-apply
                                     (function
                                       (lambda ()
                                         (car (nentsel "\nУкажите атрибут <Вводить с клавиатуры> : "))
                                         ) ;_ end of lambda
                                       ) ;_ end of function
                                     ) ;_ end of vl-catch-all-apply
                              ) ;_ end of setq
                        ) ;_ end of type
                  'ename
                  ) ;_ end of =
               (= (cdr (assoc 0 (entget attr))) "ATTRIB")
               (setq attr  (vlax-ename->vla-object attr)
                     tag   (vla-get-tagstring attr)
                     value (vla-get-textstring attr)
                     ) ;_ end of setq
               ) ;_ end of and
          (and (= (type (setq tag (vl-catch-all-apply
                                    (function
                                      (lambda ()
                                        (getstring "\nВведите тэг атрибута для фильтрации <Отмена> : ")
                                        ) ;_ end of lambda
                                      ) ;_ end of function
                                    ) ;_ end of vl-catch-all-apply
                              ) ;_ end of setq
                        ) ;_ end of type
                  'str
                  ) ;_ end of =
               (= (type
                    (setq value (vl-catch-all-apply
                                  (function
                                    (lambda ()
                                      (getstring "\nВведите значение атрибута для фильтрации (с учетом маски) <Отмена> : ")
                                      ) ;_ end of lambda
                                    ) ;_ end of function
                                  ) ;_ end of vl-catch-all-apply
                          ) ;_ end of setq
                    ) ;_ end of type
                  'str
                  ) ;_ end of =
               ) ;_ end of and
          ) ;_ end of or
      (= (type (setq selset (vl-catch-all-apply
                              (function
                                (lambda ()
                                  (ssget '((0 . "INSERT") (66 . 1)))
                                  ) ;_ end of lambda
                                ) ;_ end of function
                              ) ;_ end of vl-catch-all-apply
                     ) ;_ end of setq
               ) ;_ end of type
         ) ;_ end of =
      ) ;_ end of and
     (progn
       (setq tag    (strcase tag)
             value  (strcase value)
             selset (vl-remove-if-not
                      (function
                        (lambda (x / lst)
                          (setq lst (mapcar
                                      (function
                                        (lambda (i)
                                          (cons (strcase (vla-get-tagstring i))
                                                (strcase (vla-get-textstring i))
                                                ) ;_ end of cons
                                          ) ;_ end of lambda
                                        ) ;_ end of function
                                      (fun_get-attr (vlax-ename->vla-object x))
                                      ) ;_ end of mapcar
                                ) ;_ end of setq
          ;(function vla-get-textstring) (fun_get-attr (vlax-ename->vla-object x))))
                          (vl-remove-if-not
                            (function
                              (lambda (a)
                                (and (or (= (car a) tag) (wcmatch (car a) tag))
                                     (or (= (cdr a) value) (wcmatch (cdr a) value))
                                     ) ;_ end of and
                                ) ;_ end of lambda
                              ) ;_ end of function
                            lst
                            ) ;_ end of vl-remove-if-not
                          ) ;_ end of lambda
                        ) ;_ end of function
                      (_kpblc-conv-selset-to-ename selset)
                      ) ;_ end of vl-remove-if-not
             res    (ssadd)
             ) ;_ end of setq
       (foreach item selset
         (ssadd item res)
         ) ;_ end of foreach
       (sssetfirst res res)
       ) ;_ end of progn
     ) ;_ end of if
  (princ)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.12.2009, 13:25
#20
saa


 
Регистрация: 25.09.2008
Новосибирск
Сообщений: 218


Не получается, пишет:

Укажите атрибут <Вводить с клавиатуры> : ДЛИНА
*Неверный выбор*
Требуется один объект.

Прошу прощения, что сразу не уточнил, блоки динамические. Может в этом дело?

Еще раз прошу прощения, работает!!!
Только не понятно что такое "Укажите атрибут <Вводить с клавиатуры> :", вроде как тэг атрибута вводится в следующем запросе "Введите тэг атрибута для фильтрации <Отмена> :"?

Последний раз редактировалось saa, 25.12.2009 в 13:57. Причина: разобрался чуть-чуть
saa вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Выбор блоков по значению атрибутов.

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск