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

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

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

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

Кто нибудь может помощь модифицировать макрос данной программы дело в том что она выбирает только вхождения обычных блоков а хотелось бы еще и динамических.
http://dwg.ru/dnl/254
Просмотров: 29546
 
Непрочитано 26.12.2009, 00:19
#21
Кулик Алексей aka kpblc
Moderator

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


А ты в ответ на первый запрос ткни в атрибут
__________________
Моя библиотека 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
Нижний Новгород
Сообщений: 256
<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
С.-Петербург
Сообщений: 39,787


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

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


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

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


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

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


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

Проектировщик ЭО,ЭМ, ЭОС
 
Регистрация: 18.07.2007
Нижний Новгород
Сообщений: 256
<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
С.-Петербург
Сообщений: 39,787


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

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


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

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Немного изменил код Алексея (выделено красным). Проверь как теперь работает.
Код:
[Выделить все]
(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
Талды-Париж
Сообщений: 5,989


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

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

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

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


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


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


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

Проектировщик ЭО,ЭМ, ЭОС
 
Регистрация: 18.07.2007
Нижний Новгород
Сообщений: 256
<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
Сообщений: 400


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

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от -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 Кб, 438 просмотров)
__________________
Как использовать код на Лиспе читаем здесь

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


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


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 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Выбор блоков по значению атрибутов.

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

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