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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как создать фильтр набора без DXF пар?

Как создать фильтр набора без DXF пар?

Ответ
Поиск в этой теме
Непрочитано 22.06.2008, 16:30 #1
Как создать фильтр набора без DXF пар?
Supermax
 
Руководитель фирмы
 
Москва
Регистрация: 28.03.2007
Сообщений: 1,831

Немного не понятный вопрос, но не хотел делать длинным. Поясню.
Есть функция ssget "_..." далее идет набор фильтра в котором надо указывать DXF пары. А как создать набор элементов по признаку отсутствия конкретной DXF пары. К примеру элементы в которых цвет указан как ByLeer. Единственная возможность организовать фильтр по этому цвету, это выбрать те элементы, в которых нет 62 пары! Именно это и означает цвет ByLeer. ByBlock это (62 . 0).
Так не работает.
Код:
[Выделить все]
(list '(-4 . "<NOT") '(-4 . "*") '(62 . 0) '(-4 . "NOT>"))
И так не работает:
Код:
[Выделить все]
(list '(-4 . "<AND") '(-4 . "*") '(0 . "*") '(-4 . "<NOT") '(-4 . "*") '(62 . 0) '(-4 . "NOT>") '(-4 . "AND>"))
У меня набор этим не ограничивается и добавлять элементы к набору пока не хочется.

Кто мне поможет? Плииз!
Просмотров: 4126
 
Непрочитано 22.06.2008, 21:31
#2
VVA

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


Цитата:
Сообщение от Supermax Посмотреть сообщение
Единственная возможность организовать фильтр по этому цвету, это выбрать те элементы, в которых нет 62 пары! Именно это и означает цвет ByLeer.
Не совсем так. Цвет Bylayer - это чило 256, Byblock - 0. В силу исторических причин пара '(62 . 256) в списке отсутствует, но подразумевается, что она есть
Так работает
Код:
[Выделить все]
(sssetfirst nil (ssget "_X" '((62 . 256))))
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 22.06.2008, 21:45
#3
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


VVA, снимаю шляпу!
Но что делать, когда надо создать набор по факту отсутствия какой-то DXF пары. К примеру отсутствие расширенных данных с любым содержанием?
Supermax вне форума  
 
Непрочитано 23.06.2008, 00:12
#4
Кулик Алексей aka kpblc
Moderator

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


Позвольте и мне влезьть: а если так
Код:
[Выделить все]
(vl-remove-if '(lamdba(x) (cdr(assoc 62 (entget x)))) (_dwgru-conv-pickset-to-list (ssget)))
Ну и аналогичным образом все что угодно исключить можно В лоб, конечно, решение, но (особенно для РД), по-моему, предложить больше нечего.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.06.2008, 12:33
#5
VVA

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


Цитата:
Сообщение от Supermax Посмотреть сообщение
VVA, снимаю шляпу!
Но что делать, когда надо создать набор по факту отсутствия какой-то DXF пары. К примеру отсутствие расширенных данных с любым содержанием?
В ssget расширенные данные (РД) фильтруются только по имени (группа -3), а дальше как советовал Алексей: переборчиком.

Я у себя поступаю так: Маркирую "свои" примитивы РД (у которых уникальное имя РД), а в сами РД заношу только метку. Это позволяет по ssget быстро отфильтровать нужные мне объекты. По не совпадению сохраненной метки в РД и метки самого примитива отсеять (по необходимости) скопированные пользователем в обход моей команды объекты.
В ф-ции предусмотрена возможность записи еще одной строки если нужно будет в пределах одного РД разделить примитивы (так на всякий случай).

Код:
[Выделить все]
;;;*****************************************************************************************
;;; Copyright ©2004 Владимир Азарко (VVA)
;;; posted: http://dwg.ru/f/showthread.php?t=21897
;;;*****************************************************************************************
;;; Функции предназначены для записи и извлечения расширенных данных
;;; All rights removed
;;; Все права удалены
;;; ПРОГРАММА РАСПРОСТРАНЯЕТСЯ НА УСЛОВИЯХ "КАК ЕСТЬ".
;;; АВТОР НЕ БЕРЕТ НА СЕБЯ И НЕ ПОДРАЗУМЕВАЕТ КАКИХ-ЛИБО ГАРАНТИЙНЫХ ОБЯЗАТЕЛЬСТВ.
;;; ВЫ ИСПОЛЬЗУЕТЕ  ФУНКЦИИ НА СВОЙ РИСК.
;;; АВТОР НЕ БЕРЕТ НА СЕБЯ ОТВЕТСТВЕННОСТЬ ЗА ПОТЕРЮ ДАННЫХ, УЩЕРБ, ПОТЕРЮ ПРИБЫЛИ ИЛИ ЛЮБЫЕ
;;; ДРУГИЕ ПОТЕРИ, ПРОИЗОШЕДШИЕ ВО ВРЕМЯ ИСПОЛЬЗОВАНИЯ ИЛИ НЕПРАВИЛЬНОГО ИСПОЛЬЗОВАНИЯ
;;; ДАННОГО ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ.
;;;*****************************************************************************************
;;; Разрешается   использовать,  копировать,  изменять,  и  распространять  это  программное
;;; обеспечение бесплатно
;;;*****************************************************************************************
;;;================================================================================
;;; Функция добавляет Расширенные Данные к примитиву
;;; ENAME - Имя примитива
;;; RNAME - имя приложения
;;; DICT - имя словаря примитива (строка)
;;; (-3 ("MIP_XD" (1000 . DICT)(1000 . METKA)))
(DEFUN _add_mip_xd ( ENAME RNAME DICT  / XDLIST RNAME ELIST METKA XD_ENT XD_LIST3 )
;;; Имя приложени
  (regapp RNAME)
  (setq ELIST (entget ENAME '("*")))
  (setq METKA (cdr (assoc 5 ELIST)))

;;; ======== Сформировать список РАСШИРЕННЫХ ДАННЫХ
   (setq XDLIST (list (cons 1000 DICT)(cons 1000 METKA)))

;;; Добавить имя приложения в начало списка Рданных.

  (setq XDLIST (list (cons RNAME XDLIST)))

;;; Добавить код группы -3 перед списком расширенных данных.

  (setq XDLIST (cons -3 XDLIST))
;;;(princ "\nXDLIST=")(princ XDLIST)
  ;; Теперь список расширенных данных добавлен к данным примитива. Сложнее,
  ;; если примитив уже имеет Рданные. Следует также проверить достаточность
  ;; пространства для Рданных.

  (if (< (xdsize XDLIST)(xdroom ENAME))     ; Если есть еще пространство...
    (progn
      (if (assoc -3 ELIST)            ; и уже есть Рданные...
        (progn
          (setq XDLIST (cdr XDLIST)) ; Новые Рданные.
          (setq XD_ENT (cdr (assoc -3 ELIST))) ; Старые Рданные.
          ;; Найти старые Рданные для того же приложени
          (if (assoc RNAME XD_ENT)
            (progn
              ;; Поместить обратно в существующий список Рданных

              (setq XD_LIST3 (subst (car XDLIST) (assoc RNAME XD_ENT)
                                             (assoc -3 ELIST)))
            )
            (progn                    ; Это новое приложение...
              (setq XDLIST (append XD_ENT XDLIST)) ; Объединить Рданные.
              (setq XD_LIST3 (cons -3 XDLIST))
            )
          );_if assoc RNAME
     (setq ELIST (subst XD_LIST3 (assoc -3 ELIST) ELIST)) ; Объединить с примитивом
        );_progn
        (setq ELIST (cons XDLIST ELIST)) ; Пока нет Рданных.
      );_if assoc -3
      ;; Наконец, обновить примитив с Рданными в базе данных.
     (entmod ELIST)
    );_progn
    (alert "Не хватает памяти для Рданных\n Рданные не добавлены.")
  );_if < xdsize
(princ)
)
;;;================================================================================
;;; Функция возвращает Расширенные Данные(РД)  примитива
;;; в виде списка (DICT METKA RNAME) или NIL, если РД не присвоено
(defun _get_mip_xd (ENAME RNAME / XDLIST ELIST XD_ENT ret)
  (setq ELIST (entget ENAME (list RNAME)))
  (setq XD_ENT (cdr (assoc -3 ELIST)))  ; Старые Рданные.
  ;; Найти старые Рданные для того же приложени
  (setq ret (mapcar '(lambda (XDLIST / sps RD)
                       (if (wcmatch (setq RD (car XDLIST)) RNAME)
                         (progn
                           (setq XDLIST (cdr XDLIST))
                           (foreach aa XDLIST
                             (setq sps (append sps (list (cdr aa))))
                           ) ;_ end of foreach
                           (setq sps (append sps (list rd)))
                         ) ;_ End of progn
                       ) ;_ end of if
                     ) ;_ end of lambda
                    XD_ENT
            ) ;_ end of mapcar
  ) ;_ end of setq
  ret
) ;_END defun
Пример
Код:
[Выделить все]
(defun C:TEST1 ()
  (and
    (setq str (getstring t "\nПоясняющая строка: "))
    (setq en (car(entsel "\nВыберите объект для маркировки:")))
    (_add_mip_xd en "TEST_XD" str)
  )
  )
 (defun C:TEST2 ()
  (and
    (setq en (car(entsel "\nВыберите замаркированный объект:")))
    (setq lst (car(_get_mip_xd (entlast) "TEST_XD")))
    (alert (strcat "Строка: " (car lst) 
		   (if (= (cadr lst)(cdr(assoc 5 (entget en))))
		     "\nОбъект не копировали после маркировки"
		     "\nСкопирован после маркировки"
		     )
		   )
	   )
  )
)
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 24.06.2008 в 19:58.
VVA вне форума  
 
Автор темы   Непрочитано 24.06.2008, 14:52
#6
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Про расширенные данные огромное спасибо. Есть вопрос, а могу ли я эти функции применить в комьерческом проекте?
Supermax вне форума  
 
Непрочитано 24.06.2008, 15:54
#7
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


VVA
По моему в библиотеке функций DwgRuLispLib нет ничего для работы с расширенными данными. Хорошо бы включить туда функции для работы с ними...
CB вне форума  
 
Непрочитано 24.06.2008, 19:56
#8
VVA

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


Supermax, Добавил копирайт в #5
CB, Выйду с отпуска добавлю (если не забуду к тому времени)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 24.06.2008, 20:08
#9
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


VVA, мой низкий поклон! Когда ты узреешь для чего я это применю - будешь очень гордиться, что и твоя лепта есть в этом деле.
Supermax вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как создать фильтр набора без DXF пар?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как создать блок не командными методами Дима_ Программирование 9 20.03.2008 12:31
Как создать виртуальный принтер Владислав Кулигин Компьютерная и бытовая техника, электроника и инструмент 4 03.01.2008 17:54
Как полностью перенести картику в чертёж без ссылок? Brulik3000 AutoCAD 17 11.05.2007 15:49
Как найти текст без содержания и еще вопросы Елена AutoCAD 5 29.06.2004 14:16
Можно ли в SSGET создать фильтр по расширенным данным? {Smirnoff} Программирование 2 25.04.2004 12:44