Тема: LISP,DCL. Выбор и выделение объектов из списка по типу.

Файл selobj.dcl

objlist:dialog {
    label = "Объекты.";
    fixed_width = true;
         :list_box {
         label = "Выбери объект";
         key = "obj";
         list = "Отрезок\nПолилиния\nСплайн\nДуга\nКруг\nЭллипс\nТочка\nБлок\nФигура\nШтриховка\nОбласть\nТекст\nМТекст\nРастр";
         height = 17;
         }
ok_only;
}

Файл selobj.lsp

(defun C:SELOBJ ( / dcl_id obj ss1 ss ssn1 n pp pp1)
       (command "_select" "_r" "_all" "")
       (setq dcl_id (load_dialog "selobj"))
       (if (not (new_dialog "objlist" dcl_id)) (exit))
       (action_tile "obj" "(setq obj (read $value))")
       (action_tile "accept" "(done_dialog)")
       (start_dialog)
       (unload_dialog dcl_id)
(if obj
    (progn
       (cond
       ((= obj 0) (setq obj "LINE"))
       ((= obj 1) (setq obj "LWPOLYLINE"))
       ((= obj 2) (setq obj "SPLINE"))
       ((= obj 3) (setq obj "ARC"))
       ((= obj 4) (setq obj "CIRCLE"))
       ((= obj 5) (setq obj "ELLIPSE"))
       ((= obj 6) (setq obj "POINT"))
       ((= obj 7) (setq obj "INSERT"))
       ((= obj 8) (setq obj "SOLID"))
       ((= obj 9) (setq obj "HATCH"))
       ((= obj 10) (setq obj "REGION"))
       ((= obj 11) (setq obj "TEXT"))
       ((= obj 12) (setq obj "MTEXT"))
       ((= obj 13) (setq obj "IMAGE"))
       )
       (setq ss1 (ssget))
   (if ss1
       (progn
       (setq ss (ssadd))
       (setq ssn1 (sslength ss1) n 0)
         (repeat ssn1
           (setq pp (ssname ss1 n))
           (setq pp1 (entget pp))
           (if
           (= (cdr (assoc '0 pp1)) obj) (ssadd pp ss)
           )
           (setq n (+ n 1))
         ) ; repeat
         (if (/= (sslength ss) 0)
             (progn
             (princ "\n Найдено ") (princ (sslength ss)) (princ " объектов типа ") (princ obj)
             (sssetfirst ss ss)
             )
             (progn
             (princ "\n Нет объектов типа: ") (princ obj)
             )
       )
       ) ; progn
       (princ "\n Нет выбранных объектов." )
  )
)
(princ "\n Отмена.")
)
    (princ)
)

Оба файла должны находиться на пути доступа AutoCAD к файлам поддержки.
Возможный макрос для кнопки или пункта меню:

^C^C^P(if (not C:SELOBJ) (load "selobj")) SELOBJ

Re: LISP,DCL. Выбор и выделение объектов из списка по типу.

> Владимир Громов
Поясните пожалуйста, что команда должна делать и как это выглядит.  уменя получилось вот:
Команда:
SELOBJ _select
Выберите объекты: _r
Выберите объекты для исключения: _all найдено: 3507
Выберите объекты для исключения:
Команда:
Выберите объекты: найдено: 1
Выберите объекты: найдено: 1, всего: 2
Выберите объекты: найдено: 1, всего: 3
Выберите объекты:
Найдено 3 объектов типа CIRCLE

а че к чему я не понял.

Re: LISP,DCL. Выбор и выделение объектов из списка по типу.

... теперь понял smile , тугодум однака.

Re: LISP,DCL. Выбор и выделение объектов из списка по типу.

> Владимир Громов
Владимир, а можно в этот список добавить, размеры и таблицы?

Re: LISP,DCL. Выбор и выделение объектов из списка по типу.

> Михаил74
Да можно, конечно. Я как-то забыл про них.

Re: LISP,DCL. Выбор и выделение объектов из списка по типу.

Файл selobj.dcl

objlist:dialog {
    label = "Объекты.";
    fixed_width = true;
         :list_box {
         label = "Выбери объект";
         key = "obj";
         list = "Отрезок\nПолилиния\nСплайн\nДуга\nКруг\nЭллипс\nТочка\nБлок\nФигура\nШтриховка\nОбласть\nТекст\nМТекст\nРастр\nРазмер\nТаблица";
         height = 18;
         }
ok_only;
}

Файл selobj.lsp

(defun C:SELOBJ ( / dcl_id obj ss1 ss ssn1 n pp pp1)
       (command "_select" "_r" "_all" "")
       (setq dcl_id (load_dialog "selobj"))
       (if (not (new_dialog "objlist" dcl_id)) (exit))
       (action_tile "obj" "(setq obj (read $value))")
       (action_tile "accept" "(done_dialog)")
       (start_dialog)
       (unload_dialog dcl_id)
(if obj
    (progn
       (cond
       ((= obj 0) (setq obj "LINE"))
       ((= obj 1) (setq obj "LWPOLYLINE"))
       ((= obj 2) (setq obj "SPLINE"))
       ((= obj 3) (setq obj "ARC"))
       ((= obj 4) (setq obj "CIRCLE"))
       ((= obj 5) (setq obj "ELLIPSE"))
       ((= obj 6) (setq obj "POINT"))
       ((= obj 7) (setq obj "INSERT"))
       ((= obj 8) (setq obj "SOLID"))
       ((= obj 9) (setq obj "HATCH"))
       ((= obj 10) (setq obj "REGION"))
       ((= obj 11) (setq obj "TEXT"))
       ((= obj 12) (setq obj "MTEXT"))
       ((= obj 13) (setq obj "IMAGE"))
       ((= obj 14) (setq obj "DIMENSION"))
       ((= obj 15) (setq obj "ACAD_TABLE"))
       )
       (setq ss1 (ssget))
   (if ss1
       (progn
       (setq ss (ssadd))
       (setq ssn1 (sslength ss1) n 0)
         (repeat ssn1
           (setq pp (ssname ss1 n))
           (setq pp1 (entget pp))
           (if
           (= (cdr (assoc '0 pp1)) obj) (ssadd pp ss)
           )
           (setq n (+ n 1))
         ) ; repeat
         (if (/= (sslength ss) 0)
             (progn
             (princ "\n Найдено ") (princ (sslength ss)) (princ " объектов типа ") (princ obj)
             (sssetfirst ss ss)
             )
             (progn
             (princ "\n Нет объектов типа: ") (princ obj)
             )
       )
       ) ; progn
       (princ "\n Нет выбранных объектов." )
  )
)
(princ "\n Отмена.")
)
    (princ)
)

Re: LISP,DCL. Выбор и выделение объектов из списка по типу.

> Владимир Громов
Есть еще 3d полилиния и млиния

Re: LISP,DCL. Выбор и выделение объектов из списка по типу.

:)
Есть еще атрибуты. И есть еще точка. И есть еще прямоугольник, многоугольник и кольцо, которые почему-то полилинии. И есть еще грани, сети, поверхности и тела. Есть еще что-нибудь, внешние ссылки, например?

Re: LISP,DCL. Выбор и выделение объектов из списка по типу.

> Владимир Громов
Млиния и остальное бог с ним. А если под полилиниями понимать все полилинии Автокада (3d 2d LW), то я бы

((= obj 1) (setq obj "LWPOLYLINE"))

заменил на

((= obj 1) (setq obj "*POLYLINE"))

и

(= (cdr (assoc '0 pp1)) obj) (ssadd pp ss)

на

(wcmatch obj (cdr (assoc '0 pp1))) (ssadd pp ss)

Re: LISP,DCL. Выбор и выделение объектов из списка по типу.

> VVA
Спасибо, только под полилинией я хочу понимать именно LW-полилинию.

Re: LISP,DCL. Выбор и выделение объектов из списка по типу.

> Владимир Громов
Спасибо Владимир, очень полезная кнопка получилась.

Re: LISP,DCL. Выбор и выделение объектов из списка по типу.

> Владимир
Громов (2007-03-01 06:25:36я тут сам решил добавить в список еще выноску.
в файл selobj.dcl в строку List я дописал \nВыноска
а в файле  selobj.lsp после

((= obj 15) (setq obj "ACAD_TABLE"))

я написал

((= obj 16) (setq obj "qleader"))

Владимир, почему АКАД мне написал:

Нет объектов типа: 16

чем я его обидел?

Re: LISP,DCL. Выбор и выделение объектов из списка по типу.

> Михаил74
"_qleader" ("бвыноска") - это название команды. Сам объект "выноска" на английском языке обзывается "LEADER".
Надо иметь в виду, что при пополнении списка возможно придется увеличить высоту диалогового окошка. Параметр height в файле selobj.dcl

Re: LISP,DCL. Выбор и выделение объектов из списка по типу.

> Владимир Громов
с height в файле selobj.dcl
все в порядке высоты хватает, а вот "LEADER" я так и написал это уже сюда я закопировал не верно.
Я дома потом еще раз попробую, наверняка еще где-нить ошибся. здесь где то на форуме читал, что с помощью какого-то редактора можно проверять правильность Lisp  кода, не подскажите?

Re: LISP,DCL. Выбор и выделение объектов из списка по типу.

С "Выноской":
Файл selobj.dcl

objlist:dialog {
    label = "Объекты.";
    fixed_width = true;
         :list_box {
         label = "Выбери объект";
         key = "obj";
         list =
"Отрезок\nПолилиния\nСплайн\nДуга\nКруг\nЭллипс\nТочка\nБлок\nФигура\nШтриховка\nОбласть\nТекст\nМТекст\nРастр\nР
азмер\nТаблица\nВыноска";
         height = 19;
         }
ok_only;
}

Файл selobj.lsp

(defun C:SELOBJ ( / echo dcl_id obj ss1 ss ssn1 n pp pp1)
       (setq echo (getvar "CMDECHO"))
       (setvar "CMDECHO" 0)
       (command "_select" "_r" "_all" "")
       (setq dcl_id (load_dialog "selobj"))
       (if (not (new_dialog "objlist" dcl_id)) (exit))
       (action_tile "obj" "(setq obj (read $value))")
       (action_tile "accept" "(done_dialog)")
       (start_dialog)
       (unload_dialog dcl_id)
(if obj
    (progn
       (cond
       ((= obj 0) (setq obj "LINE"))
       ((= obj 1) (setq obj "LWPOLYLINE"))
       ((= obj 2) (setq obj "SPLINE"))
       ((= obj 3) (setq obj "ARC"))
       ((= obj 4) (setq obj "CIRCLE"))
       ((= obj 5) (setq obj "ELLIPSE"))
       ((= obj 6) (setq obj "POINT"))
       ((= obj 7) (setq obj "INSERT"))
       ((= obj 8) (setq obj "SOLID"))
       ((= obj 9) (setq obj "HATCH"))
       ((= obj 10) (setq obj "REGION"))
       ((= obj 11) (setq obj "TEXT"))
       ((= obj 12) (setq obj "MTEXT"))
       ((= obj 13) (setq obj "IMAGE"))
       ((= obj 14) (setq obj "DIMENSION"))
       ((= obj 15) (setq obj "ACAD_TABLE"))
       ((= obj 16) (setq obj "LEADER"))
       )
       (setq ss1 (ssget))
   (if ss1
       (progn
       (setq ss (ssadd))
       (setq ssn1 (sslength ss1) n 0)
         (repeat ssn1
           (setq pp (ssname ss1 n))
           (setq pp1 (entget pp))
           (if
           (= (cdr (assoc '0 pp1)) obj) (ssadd pp ss)
           )
           (setq n (+ n 1))
         ) ; repeat
         (if (/= (sslength ss) 0)
             (progn
             (princ "\n Найдено ") (princ (sslength ss)) (princ " объектов типа ") (princ obj)
             (sssetfirst ss ss)
             )
             (progn
             (princ "\n Нет объектов типа: ") (princ obj)
             )
       )
       ) ; progn
       (princ "\n Нет выбранных объектов." )
  )
)
(princ "\n Отмена.")
)
    (setvar "CMDECHO" echo)
    (princ)
)

Приходится список объектов в файле selobj.dcl записывать в одну строчку. Как перенести продолжение списка на другую строчку - что-то не соображу.

Re: LISP,DCL. Выбор и выделение объектов из списка по типу.

Еще раз файл selobj.dcl

objlist:dialog {
    label = "Объекты.";
    fixed_width = true;
         :list_box {
         label = "Выбери объект";
         key = "obj";
         list =
"Отрезок\nПолилиния\nСплайн\nДуга\nКруг\nЭллипс\nТочка\nБлок\nФигура\nШтриховка\nОбласть\nТекст\nМТекст\nРастр\nРазмер\nТаблица\nВыноска";
         height = 19;
         }
ok_only;
}

Re: LISP,DCL. Выбор и выделение объектов из списка по типу.

> >Владимир Громов
Это конечно брюзжание, но список для lisp_box (в DCL) лучше формировать в LSP.
Сделал DCL и забыл, все добавления и изменения в LSP.

Re: LISP,DCL. Выбор и выделение объектов из списка по типу.

> KAI
А еще лучше - вообще вне программы, в текстовом файле. Тогда все, кому не лень, могут добавлять то, чего не хватает.

Re: LISP,DCL. Выбор и выделение объектов из списка по типу.

> KAI

> ShaggyDoc
Согласен. Да поначалу показалось, что список окажется не очень большой, а файл DCL все равно нужен - ну и загнал все туда...

Re: LISP,DCL. Выбор и выделение объектов из списка по типу.

Я скажу еще одну вещь. Когда я еще только предлагал создать раздел "Пользовательские программы" (который стал называться "Готовые программы"), я предполагал, что этот раздел будет не только давать готовые решения той или иной задачи, но и послужит расширенным сборником примеров программирования для начинающих пользователей AutoLISP. И считал важным не только получение конечного продукта, но и возможность для начинающего программиста понять пример, разобраться в его конструкции. А для меня, например, программы, написанные таким мощным и саркастическим программистом (с точки зрения пользователя), как Лентяй, пока мало чем отличаются от компилированного кода FAS. Самое лучшее - наличие в каждой теме раздела нескольких вариантов решения задачи, как простых, так и более сложных, развитых.

Re: LISP,DCL. Выбор и выделение объектов из списка по типу.

В коде почему-то смайлик вставился, должно быть так:
((= obj 8 ) (setq obj "SOLID"))
После 8 пробел необязателен.

(изменено: Михаил74, 9 апреля 2010г. 12:14:11)

Re: LISP,DCL. Выбор и выделение объектов из списка по типу.

Решил воспользоваться данной программой в AutoCAD Architecture 2009 и получаю каждый раз это сообщение:

[FONT=Arial]Команда: _appload selobj.lsp успешно загружено.
Команда: ; ошибка: неверный тип аргумента: numberp: nil[/FONT]

[FONT=Arial]Команда:  nil
Команда:  ; ошибка: завершить / выйти прервать
[/FONT]

что делать   :(  :?:  ума не приложу,
в Автокаде 2005 работал на ура,
или этот лисп не будет в 2009 работать?

Re: LISP,DCL. Выбор и выделение объектов из списка по типу.

Владимир Громов пишет:

((= obj 8 ) (setq obj "SOLID"))

Данная конструкция изначално не верна так как подразумевает изменение типа переменной с непредсказуемыми последствиями в будущем
Правильнее было бы наверное:

((= obj_sel 8 ) (setq obj_type "SOLID"))

Хотя и с этим я категорически не согласен  :evil:
(setq obj_type (nth obj_sel '("LINE" LWPOLYLINE ...))) ; гораздо короче
И еще держать список в dcl -  :cry:
Еще нет такой строчки вначале:

(setq obj 0)

>Михаил74: Если сразу жать Ок так и должно быть - это минус проги однако:!: Если это то, о чем я подумал :D

Re: LISP,DCL. Выбор и выделение объектов из списка по типу.

Владимир Громов,
Скажите свое веское слово, как автор, хорошая программа я оч. долго ей пользовался, не хочу от нее так отказаться, может будет жить?

Re: LISP,DCL. Выбор и выделение объектов из списка по типу.

Владимир Громов, скажите а в чем разница между  комнадой _qselect и вашим кодом? честно его не подгружал, но по написанному вроде функции теже (Выбор и выделение объектов из списка по типу) что и у команды _qselect.