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

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

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

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

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

Остекляем!!! Алюминим!!!
 
Регистрация: 21.02.2005
Москва
Сообщений: 3,917
<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
С.-Петербург
Сообщений: 40,404


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

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


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

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


Цитата:
Сообщение от 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,917
<phrase 1=


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

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


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

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


Без масок:
Код:
[Выделить все]
(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
Архангельск/СПб
Сообщений: 461


Кулик Алексей 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
С.-Петербург
Сообщений: 40,404


Это я понимаю. Вопрос - где (и, самое главное, как?) будет пользователь указывать место расположения маски? Допустим, выбран атрибут со значением ПП-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,917
<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
С.-Петербург
Сообщений: 40,404


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

Остекляем!!! Алюминим!!!
 
Регистрация: 21.02.2005
Москва
Сообщений: 3,917
<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
С.-Петербург
Сообщений: 40,404


Код:
[Выделить все]
(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,917
<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
С.-Петербург
Сообщений: 40,404


Данные вводить с клавы или "ткнуть" на образец атрибута надо?
__________________
Моя библиотека 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
С.-Петербург
Сообщений: 40,404


Ну, как вариант:
Код:
[Выделить все]
(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 вне форума  
 
Непрочитано 26.12.2009, 00:19
#21
Кулик Алексей aka kpblc
Moderator

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


А ты в ответ на первый запрос ткни в атрибут
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.12.2009, 11:21
#22
saa


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


Алексей, спасибо!!!

Разобрался, все отлично!
saa вне форума  
 
Непрочитано 09.07.2010, 10:46
#23
gizmo_zx

Проектировщик ЭО,ЭМ, ЭОС
 
Регистрация: 18.07.2007
Нижний Новгород
Сообщений: 257
<phrase 1= Отправить сообщение для gizmo_zx с помощью Skype™


Добрый день свем.
Светлые и светлейшие головы (aka kpblc) подсобите с вашей прогой
пост 25.12.2009, 09:13 #19
Что бы выбранные блоки остались подсвеченными (чтоб срузу можно было их переносить/копировать) очень нужно...
gizmo_zx вне форума  
 
Непрочитано 09.07.2010, 10:55
#24
Кулик Алексей aka kpblc
Moderator

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


Странно. Судя по коду, они и так должны быть подсвечены. Другое дело, что в коде сейчас не отслеживается, в каком пространстве - модели или листа - находятся блоки. Может, поэтому sssetfirst и не срабатывает?
Сейчас, увы, времени нет совсем. Попробую на выходных, если не забуду (мне в личку кинь ссылку на тему).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 09.07.2010, 10:57
#25
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,169


чтобы не ломать голову с программированием:
_.pselect _p
kp+ вне форума  
 
Непрочитано 09.07.2010, 11:05
#26
gizmo_zx

Проектировщик ЭО,ЭМ, ЭОС
 
Регистрация: 18.07.2007
Нижний Новгород
Сообщений: 257
<phrase 1= Отправить сообщение для gizmo_zx с помощью Skype™


Не светятся все
gizmo_zx вне форума  
 
Непрочитано 09.07.2010, 11:13
#27
VVA

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


Цитата:
Сообщение от gizmo_zx Посмотреть сообщение
Не светятся все
Я сталкивался с тем, что при использовании sssetfirst не всегда объекты (даже если выбран 1 блок) подсвечивается ручками, хотя для команд предварительный выбор существует.
gizmo_zx,
После выполнения кода все таки попробуй вызвать команду (например _MOVE с PICKFIRST=1) и проверь. Не светятся не значит, что не выбраны.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 09.07.2010, 11:21
#28
gizmo_zx

Проектировщик ЭО,ЭМ, ЭОС
 
Регистрация: 18.07.2007
Нижний Новгород
Сообщений: 257
<phrase 1= Отправить сообщение для gizmo_zx с помощью Skype™


_move

Рамка/Последний/Секрамка/БОКС/Все/Линия/РМн-угол/СМн-угол/Группа/Добавить/Исключ
ить/Несколько/Текущий/Отменить/Авто/Единственный/ПОДобъект/Объект

Я выбрал "Текущий" но подсветились все объекты, которые выбила рамкой
Т.е. как бы не отфильтрованные


Но программа количество правильно считает! (проверил)

Последний раз редактировалось gizmo_zx, 09.07.2010 в 11:28.
gizmo_zx вне форума  
 
Непрочитано 09.07.2010, 11:52
#29
Кулик Алексей aka kpblc
Moderator

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


А если выбрать "_p" (последний)?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 09.07.2010, 11:55
#30
gizmo_zx

Проектировщик ЭО,ЭМ, ЭОС
 
Регистрация: 18.07.2007
Нижний Новгород
Сообщений: 257
<phrase 1= Отправить сообщение для gizmo_zx с помощью Skype™


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А если выбрать "_p" (последний)?
аналогично (выбот всех блоков (до фильтра))
gizmo_zx вне форума  
 
Непрочитано 09.07.2010, 11:57
#31
VVA

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


Немного изменил код Алексея (выделено красным). Проверь как теперь работает.
Код:
[Выделить все]
(defun C:GBTV ()(C:get-blocks-by-tag-and-val))
(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
       (if (> (sslength res) 0)
         (progn
           (command "_.Select" res "")
           (command "_.PSelect" res "")
           )
         )
       ) ;_ end of progn
     ) ;_ end of if
  (princ)
  ) ;_ end of defun


*** Добавлено
Цитата:
А если выбрать "_p" (последний)?
_p - текущий (Previous)
_l - последний (Last)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 09.07.2010, 12:23
#32
Nike

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


После <Отмена> в
"Введите тэг атрибута для фильтрации <Отмена>"
следует
"Введите значение атрибута для фильтрации (с учетом маски) <Отмена>"
идет поиск по введенному значению в несуществующих (в результате отмены ввода тэга) атрибутах и как следствие - отсутствие результата.

Предлагаю вместо этой <Отмены> за ее ненужностью добавить возможность выбора нужного атрибута мышью.

Последний раз редактировалось Nike, 09.07.2010 в 12:31.
Nike вне форума  
 
Непрочитано 09.07.2010, 12:51
#33
gizmo_zx

Проектировщик ЭО,ЭМ, ЭОС
 
Регистрация: 18.07.2007
Нижний Новгород
Сообщений: 257
<phrase 1= Отправить сообщение для gizmo_zx с помощью Skype™


хм. У меня вроде работала... а теперь никак
gizmo_zx вне форума  
 
Непрочитано 13.07.2010, 10:50
#34
-mavlin-


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


А как сделать выбор динамических блоков по значению динамических свойств? Т.е. есть, например, куча динамических блоков "Балка" и у всех у них разные параметры длина. Необходимо выбрать только блоки с длиной 3000мм, например.
-mavlin- вне форума  
 
Непрочитано 13.07.2010, 11:13
#35
gizmo_zx

Проектировщик ЭО,ЭМ, ЭОС
 
Регистрация: 18.07.2007
Нижний Новгород
Сообщений: 257
<phrase 1= Отправить сообщение для gizmo_zx с помощью Skype™


На VBA.
но ищет не точно по значению а по "маске" (см в коде ниже ***xxx)
найденное перемещаен на слой _Layer1 (должен существовать)


Код:
[Выделить все]
Public Sub find_block_by_atribut()

Dim oSset As AcadSelectionSet
Dim oEnt As AcadEntity
Dim oBlkRef As AcadBlockReference
Dim oAtt As AcadAttributeReference
Dim varAtt As Variant
Dim i As Long
Dim ftype(1) As Integer
Dim fdata(1) As Variant
ftype(0) = 0: fdata(0) = "INSERT"
ftype(1) = 66: fdata(1) = 1
Dim dxftype As Variant
Dim dxfdata As Variant
dxftype = ftype
dxfdata = fdata
'---------------------
'Dim xlApp As Object
'Dim xlBook As Workbook
'Dim xlSheet As Worksheet
Dim lngRow As Long, lngCol As Long

'---------------------
On Error Resume Next
'Set xlApp = GetObject(, "Excel.Application")
If Err <> 0 Then
Err.Clear
'Set xlApp = CreateObject("Excel.Application")
If Err <> 0 Then
MsgBox "Impossible to initialize an Excel.", vbExclamation
End
End If
End If
'---------------------

On Error Resume Next
Set oSset = ThisDrawing.SelectionSets.Item("$Attribs$")
If Err Then
Err.Clear
Set oSset = ThisDrawing.SelectionSets.Add("$Attribs$")
End If

On Error GoTo Err_Control
oSset.Clear

oSset.SelectOnScreen dxftype, dxfdata

lngRow = 2
Dim name_at, text_at, text_at2 As String
Dim ix, ax_ru As Integer

text_at2 = InputBox("Что ищем", , "")
For Each oEnt In oSset



Set oBlkRef = oEnt
If oBlkRef.IsDynamicBlock Then
'xlSheet.Cells(lngRow, 1).Value = oBlkRef.EffectiveName
Else
'xlSheet.Cells(lngRow, 2).Value = oBlkRef.Name
End If


varAtt = oBlkRef.GetAttributes
'lngCol = 2
'lngCol = 20
Dim ttmp As Integer
ttmp = 0

For i = 0 To UBound(varAtt)
Set oAtt = varAtt(i)

name_at = oAtt.TagString

If oAtt.TextString <> "" Then
    text_at = oAtt.TextString
  ax_ru = InStr(1, text_at, text_at2, vbTextCompare) ' ***xxx
  If ax_ru > 0 Then
        oEnt.Highlight True
        oEnt.Layer = "_Layer1"
  End If
    

End If
Next i

lngRow = lngRow + 1

Next oEnt



Err_Control:

End Sub
gizmo_zx вне форума  
 
Непрочитано 13.07.2010, 13:01
#36
-mavlin-


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


Лучше, конечно, чем ничего, но хотелось бы, чтобы объекты оставались выбранными, а не перемещались на коакой-то слой.
Результат хотелось бы такой как у проги в посте №8 только, чтобы блоки выбирались не по атрибутам, а по значениям динамических параметров.
-mavlin- вне форума  
 
Непрочитано 13.07.2010, 13:33
2 | #37
VVA

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


Цитата:
Сообщение от -mavlin- Посмотреть сообщение
чтобы блоки выбирались не по атрибутам, а по значениям динамических параметров.
Опубликовано
Dynamic block filter
Select all occurences of a Dynamic Block in Modelspace
Select all instances of a block, including dynamic
Код:
[Выделить все]
;;; SSD R2.3 (gile) 14/07/2008
;;; Select dynamic blocks according to dynamic properties values
;;; Using:
;;; To make a selection, enter ssd at command prompt or,
;;; within a modification command, type (ssd) at "Select objects: " prompt
;;; Select a source dynamic block
;;; Choose properties values to filter in the dialog box (an empty tile means "all vaue")
;;; http://autolisp-exchange.com/Forums/Forum2/F2T40P1.htm
;;; http://forums.augi.com/showthread.php?t=96601
Версия 2.6 здесь http://forum.dwg.ru/showthread.php?t=62011
Вложения
Тип файла: lsp SSD.lsp (4.9 Кб, 460 просмотров)
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 17.02.2016 в 13:30.
VVA вне форума  
 
Непрочитано 13.07.2010, 16:20
#38
-mavlin-


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


VVA, большое спасибо! Это именно то, что нужно.
-mavlin- вне форума  
 
Непрочитано 30.11.2010, 10:34
#39
Eddicordo

КИП и А
 
Регистрация: 28.04.2010
Киев
Сообщений: 101
<phrase 1=


VVA, Класс
Фильтрация по значением атрибута отменная.
Можно чуток переделать прогу.
Что бы указав дин блок, можно было изменить любое значение на другое и помимо выделения изменились во всех остальных значение.
Свое рода получается "Найти и заменить в конкретных дин блоках конкретные значение массово".
И неплохо бы программно в каком то куске LISP указывать те значения которые не нужны в выводе DCL окошке или наоборот нужны. Поскольку параметры значений "Растянуть" мне и даром не нужны что бы их фильтровать и глобально изменять. А кому то что то другое не нужно.

Для замены значений необходимо сделать еще 1 галочку "Edit"
При указании галочки "Edit" в DCL окошке должно показывать все значение которые УЖЕ указанны в том блоке который ты указал.
Если убрать галочку то прога работает как в посте 37

Спустя 20 мин
Говорят курение вредит но во время курения приходят гениальные мысли.
Авто-замена всего проекта. Если прога может найти дин блоки с конкретными именами и изменить по фильтру конкретные значения в них. То почему бы не сделать автозамену из внешней программы к примеру Excel. В которой пользователь прописывает имя блока, значение (атрибут) этого блока, новое значение атрибута.
Указывает папку с чертежами в которых находятся дин блоки указанные пользователем и прога сама меняет во всех чертежах атрибуты на новые.
А теперь представте как быстро можно будет изменить весь проект при замечаниях заказчика.

Мечты, Мечты, Мечты. Хотя все реально.

Последний раз редактировалось Eddicordo, 30.11.2010 в 11:41.
Eddicordo вне форума  
 
Непрочитано 02.12.2010, 07:36
#40
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


Eddicordo,

ага, а мне создайте БОЛЬШУЮ КРАСНУЮ КНОПКУ
Frigate вне форума  
 
Непрочитано 28.10.2018, 10:08
#41
config


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


Доброго времени суток, уважаемые форумчане! Обращаюсь к ув. Кулик Алексей aka kpblc, автору программы из #8. Большое спасибо, все очень удобно. Но есть одни нюанс, для меня конечно: с каждым запросом нужно выполнять выбор в чертеже. Если можно доработать вариант лиспа без выбора. Поскольку поиск выполняется во всем чертеже, блоков тысячи и теряется драгоценное время на выбор. Спасибо!
config вне форума  
 
Непрочитано 28.10.2018, 21:47
#42
Кулик Алексей aka kpblc
Moderator

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


То есть? Я просто не понял, в чем вопрос.
P.S. Можно попытаться заменить nentsel на цикл, конечно - но почему-то мне кажется, что надо не это.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.10.2018, 21:53
#43
config


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
То есть? Я просто не понял, в чем вопрос.
Чтобы после ввода для поиска нужного атрибута опустить опцию "выбора объектов"рамкой области поиска. Чтобы поиск выполнялся во всем чертеже по-умолчанию. Лишние телодвижения, а когда искать часто и много (точки топоплана, в виде блоков с атрибутами), то потеря времени ощутима.
config вне форума  
 
Непрочитано 29.10.2018, 00:05
1 | #44
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от config Посмотреть сообщение
а когда искать часто и много (точки топоплана, в виде блоков с атрибутами), то потеря времени ощутима.
смотря сколько всего блоков в чертеже)
Сергей812 вне форума  
 
Непрочитано 29.10.2018, 07:56
#45
Кулик Алексей aka kpblc
Moderator

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


В #8 выбор идет по всему файлу. В #14 - по выбранной области. Найти строку типа
Код:
[Выделить все]
 (ssget '((0 . "INSERT") (66 . 1)))
и замени ее на
Код:
[Выделить все]
 (ssget "_X" '((0 . "INSERT") (66 . 1)))
Offtop: Хотя лично я не вижу особой проблемы при запросе в ком.строку вколотить "_all"
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.10.2018, 08:41
#46
config


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


Кулик Алексей aka kpblc, спасибо большое! То, что нужно!
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
смотря сколько всего блоков в чертеже)
По разному. Бывает и 5-10 тысяч.
config вне форума  
 
Непрочитано 29.10.2018, 09:39
#47
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от config Посмотреть сообщение
По разному. Бывает и 5-10 тысяч.
просто не знаю реального быстродействия лиспа (на другом языке пишу) - сколько времени займет обработка большого количества блоков с извлечением значений атрибутов и сравнением.
Сергей812 вне форума  
 
Непрочитано 29.10.2018, 10:26
#48
config


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
сколько времени займет обработка большого количества блоков с извлечением значений атрибутов и сравнением.
Здесь немного другое. Вкратце опишу процесс: на местности геодезисты выполняют съемку какого-то участка со схематической зарисовкой (абрисом) и указанием в нем номеров или кодов точек, обозначающих какой-либо объект (дерво, граница леса, пашни, столб и.т.д.). В камералке (офисе) геодезист выполняет вычерчивание топопоплана, т.е. соединяет полилинией или сплайном линейные объекты и расставляет точечные в соответствии с принятыми условными знаками. Еще чем хороша эта программа для геодезистов, тем, что можно выполнить фильтрацию точек (блоков) при построении рельефа плана по второму атрибуту (высота, отметка точки).
Да, вот еще возник один вопрос к автору программы Кулик Алексей aka kpblc Если не очень сложно, нельзя ли дополнить программу опцией панорамирования (по образцу штатной find)? Чтобы найденный блок показывался в увеличенном виде непосредственно в экране. Еще раз спасибо за Ваш труд!
config вне форума  
 
Непрочитано 29.10.2018, 10:32
#49
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


здесь вопрос не в вашей организации работы, а в самой реализации языка программирования)
Сергей812 вне форума  
 
Непрочитано 29.10.2018, 10:33
#50
Кулик Алексей aka kpblc
Moderator

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


А что делать, если найдено, к примеру, 20 блоков? И все они "раскиданы" по чертежу?
Так-то не особо сложно должно быть...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.10.2018, 10:48
#51
trir


 
Регистрация: 18.12.2010
Сообщений: 5,107


Цитата:
Вкратце опишу процесс: на местности геодезисты выполняют съемку какого-то участка со схематической зарисовкой (абрисом) и указанием в нем номеров или кодов точек, обозначающих какой-либо объект (дерво, граница леса, пашни, столб и.т.д.). В камералке (офисе) геодезист выполняет вычерчивание топопоплана, т.е. соединяет полилинией или сплайном линейные объекты и расставляет точечные в соответствии с принятыми условными знаками. Еще чем хороша эта программа для геодезистов, тем, что можно выполнить фильтрацию точек (блоков) при построении рельефа плана по второму атрибуту (высота, отметка точки).
для этого давно придумали CoGo-точки в Civil
trir вне форума  
 
Непрочитано 29.10.2018, 11:14
#52
config


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А что делать, если найдено, к примеру, 20 блоков? И все они "раскиданы" по чертежу?
У них уникальные имена. И разбросаны они действительно, по всему чертежу. Протяженность трассы (дороги) бывает и не одну сотню километров. Зачастую, нелеплены друг на друга, замучаешься искать в куче. А по высотам, если отфильтрует какое-то количество, то так и задумано.
Цитата:
Сообщение от trir Посмотреть сообщение
для этого давно придумали CoGo-точки в Civil
С блоками - гораздо удобнее.
config вне форума  
 
Непрочитано 29.10.2018, 11:22
#53
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от config Посмотреть сообщение
У них уникальные имена. И разбросаны они действительно, по всему чертежу.
Алексей немного о другом скорее всего - если в том же .Net несложно сделать немодальное окно-палитру (типа свойств акада) и туда вывести список найденных блоков. А потом по щелчку по соответствующей строке списка перемещаться на один из блоков. Lisp в этом плане ограничен, в нем немодальные окна вообще вроде нельзя создать встроенными средства - насколько помню.
Сергей812 вне форума  
 
Непрочитано 29.10.2018, 11:28
#54
trir


 
Регистрация: 18.12.2010
Сообщений: 5,107


Цитата:
С блоками - гораздо удобнее.
чем? там этот функционал уже есть!
trir вне форума  
 
Непрочитано 29.10.2018, 11:34
#55
config


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


Цитата:
Сообщение от trir Посмотреть сообщение
чем?
Многим.
Цитата:
Сообщение от trir Посмотреть сообщение
там этот функционал уже есть!
Если бы такой был (я не беру во внимание штатную, слишком много в ней лишних телодвижений), я бы не вопрошал.
config вне форума  
 
Непрочитано 29.10.2018, 11:45
#56
trir


 
Регистрация: 18.12.2010
Сообщений: 5,107


Цитата:
расставляет точечные в соответствии с принятыми условными знаками
это происходит автоматически при импорте точек

Цитата:
соединяет полилинией или сплайном линейные объекты
реализованно
trir вне форума  
 
Непрочитано 29.10.2018, 12:15
#57
config


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


Цитата:
Сообщение от trir Посмотреть сообщение
реализованно
Спасибо, в курсе. Но это не то. Это для вычерчивания, а указанная выше (#14) - для поиска.
Цитата:
Сообщение от trir Посмотреть сообщение
это происходит автоматически при импорте точек
Подчеркиваю, я работаю с блоками, а не с точками GOGO. Хотя иногда прибегаю и к их помощи. "Но это уже совсем другая история" (C)
config вне форума  
 
Непрочитано 29.10.2018, 12:57
#58
Кулик Алексей aka kpblc
Moderator

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


Попробуй. Код не проверял.
Если код не работает, то нужен файл с образцом блока и с описанием, как ты работаешь.
Вложения
Тип файла: lsp get-blocks-by-attr.lsp (8.7 Кб, 45 просмотров)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.10.2018, 13:22
#59
config


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Если код не работает, то нужен файл с образцом блока и с описанием, как ты работаешь.
К сожалению выдает такую ошибку:
Код:
[Выделить все]
 Введите значение атрибута для фильтрации (с учетом маски) <Отмена> : 114
; ошибка: неверный тип аргумента: VLA-OBJECT <Имя объекта: 7e271640>
А принцип работы как раз и заключается в поиске, в чертеже, среди блоков, нужного по имени (атрибут "Номер пикета" или отфильтровать по высотам (отметкам, по атрибуту "Отметка z пикета"). Блок из 3D Service. Многие геодезисты и топографы им пользуются.
Вложения
Тип файла: dwg
DWG 2007
Образец блока..dwg (1.32 Мб, 22 просмотров)
config вне форума  
 
Непрочитано 29.10.2018, 14:04
1 | #60
Кулик Алексей aka kpblc
Moderator

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


Сорри, исправил. Ну и еще кое-что добавил
Вложения
Тип файла: lsp get-blocks-by-attr.lsp (9.3 Кб, 149 просмотров)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.10.2018, 14:05
1 | #61
Кулик Алексей aka kpblc
Moderator

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


Кстати, почищенный файл блока...
Вложения
Тип файла: dwg
DWG 2018
Образец блока..dwg (80.7 Кб, 28 просмотров)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.10.2018, 14:18
#62
config


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Сорри, исправил. Ну и еще кое-что добавил
Супер! Все работает, даже лучше, чем ожидал. Спасибо огромное!
config вне форума  
 
Непрочитано 20.09.2019, 19:22
#63
Кондратий Тихонович


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


Имеем авто кад 2017.

Как в нём выбрать все блоки, значение атрибута у которых удовлетворяет заданному регэкспу?
Кондратий Тихонович вне форума  
 
Непрочитано 20.09.2019, 19:45
#64
Лиспер


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


Цитата:
Сообщение от Кондратий Тихонович Посмотреть сообщение
Как в нём выбрать все блоки, значение атрибута у которых удовлетворяет заданному регэкспу?
_qselect, естественно, тут не сработает. Ну и фиг с ним - сначала поиск, потом сборка найденных кусков, потом снова поиск, и только если что-то не получается, уже сигналить на форум с просьбой помочь.
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 20.09.2019, 19:52
#65
trir


 
Регистрация: 18.12.2010
Сообщений: 5,107


sql
trir вне форума  
 
Непрочитано 20.09.2019, 20:02
#66
Кулик Алексей aka kpblc
Moderator

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


trir, ну или net + regexp + <...>
Кстати, тоже забавный результат можно получить - я тут поэкспериментировал в C#, регулярные выражения теперь почти полностью понимаются у меня в лиспе. Прикольно, блин! Я в восторге, если честно
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.09.2019, 20:11
#67
trir


 
Регистрация: 18.12.2010
Сообщений: 5,107


В AutoCAD Map 3D через FDO просто подключаешься к БД и дальше всё шпаришь на sql'е

в net надо компилировать и вообще много обвязки делать, что бы что то сделать
на lisp'е тоже приходится копаться в чертеже, как в помойке
А с БД у тебя только нужные данные с правильной структурой и язык который позволяет, что угодно делать с этими данными, без лишних телодвижений
при этом эти данные открываются в AutoCAD'е буквально в пять кликов

Последний раз редактировалось trir, 20.09.2019 в 20:20.
trir вне форума  
 
Непрочитано 20.09.2019, 21:01
#68
Кулик Алексей aka kpblc
Moderator

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


trir, я прекрасно это понимаю. И частенько при работе с sql формирую запрос таким образом, чтобы он возвращал мне только нужные данные. Добавить фильтрацию типа "where upper(field) like '%SOMETHING'%" в коде труда особого не составляет, как правило А вот регулярные выражения в чистом лиспе работают, мягко говоря, не очень - стандартного wcmatch не всегда оказывается достаточно. И для использования полного функционала регулярок приходится поломать голову, но всего лишь один раз
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.09.2019, 10:45
#69
VVA

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


И еще до кучи. Наткнулся в downloade
Выбор вхождений блока по фильтру на свойства и значения атрибутов
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 21.09.2019, 15:30
#70
Кондратий Тихонович


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


Цитата:
Сообщение от VVA Посмотреть сообщение
И еще до кучи. Наткнулся в downloade
Выбор вхождений блока по фильтру на свойства и значения атрибутов
Спасибо! Посмотрим что это такое
Кондратий Тихонович вне форума  
 
Непрочитано 11.10.2023, 18:05
#71
Антон Майман


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


Приветствую уважаемых форумчан! Передо мной стоит задача в области землеустройства. Есть выписки КТП (кадастровые планы территории) содержащие вхождение блоков имеющих семантику такую как кадастровый номер, площадь итд. Нужно отсортировать блоки по атрибуту "категория земель" всего нужно выделить четыре (лесной фонд, насел. пунктов, запас, особо охраняемые) внимательно изучив данный раздел попытался применить http://https://dwg.ru/dnl/9204 это лисп логически он очень похож но ни чего у меня не получилось если данная тема ещё актуальна очень нужна помощь. Civil 3D 2022, Windows 10 Pro
Антон Майман вне форума  
 
Непрочитано 14.10.2023, 23:39
#72
trir


 
Регистрация: 18.12.2010
Сообщений: 5,107


выписки надо грузить сразу в БД и работать с ними на SQL
https://forum.dwg.ru/showpost.php?p=...0&postcount=67
trir вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Выбор блоков по значению атрибутов.