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

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

Как сделать выбор объекта по условиям?

Ответ
Поиск в этой теме
Непрочитано 01.08.2016, 10:02 #1
Как сделать выбор объекта по условиям?
AlexZh
 
Регистрация: 23.09.2015
Сообщений: 146

Здравствуйте!

Подскажите, как доработать программу, чтоб была возможность выхода через "Выход" или правую кнопку мыши (соответственно nil на выходе) и на курсоре висело приглашение

Код:
[Выделить все]
 (defun _1z_choice_obj (obj lay invitation / return_obj)
;;;выбор объекта по условиям "тип примитива" "слой"
;;; например (_1z_change_obj "INSERT" "1Z_APS_EQUIPMENT*" "\nВыберите
;;; приемное устройство или [Выход]
;;; <Выход>:")
  (while
    (progn
      (setvar "errno" 0)
      (initget "Выход")
      (princ invitation)
      (setq return_obj
	     (entsel) ;_ конец entsel
      ) ;_ конец setq
      (cond
	((= 7 (getvar 'errno))
	 (princ "\nНичего не выбрано! Пробуй снова.")
	)
	((or
	   (or (null return_obj) (equal (type return_obj) 'str))
	   (and
	     (equal (cdr (assoc 0 (entget (car return_obj)))) obj)
	     (wcmatch (strcase (cdr (assoc 8 (entget (car return_obj)))))
		      lay
	     )		      ; _
			      ; конец
			      ; wcmatch
	   ) ;_ конец and
	 ) ;_ конец and
	 nil
	)
	(t (alert "Попробуй еще раз!") t)
      ) ;_ конец cond
    ) ;_ конец cond
  ) ;_ конец progn
  (setq ent_point (cdr return_obj))
  (car return_obj)
)
Просмотров: 1243
 
Непрочитано 01.08.2016, 12:00
1 | #2
VVA

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


Код:
[Выделить все]
;;; lay - маска слоя для wcmatch (Слой1* Слой1,Слой2,#Lay* и т.п.)
;;; initstr - строка для initget
;;; promptstr - строка приглашения
;;; ВОЗВРАЩАЕТ  - имя объекта (ename) при удачном выборе или nil
;;; В случае выбора объекта точка выбора сохраняется в переменной LASTPOINT
;;; Пример использования
;;;(_1z_choice_obj "INSERT" "1Z_APS_EQUIPMENT*" "Выход" "\nВыберите приемное устройство или [Выход] <Выход>:")

  (while
    (progn
      (setvar "errno" 0)
      (initget initstr)
      (setq return_obj
	     (entsel promptstr)
      ) ;_ конец setq
      (cond
	((= 7 (getvar 'errno))
	 (princ "\nНичего не выбрано! Пробуй снова.")
	)
	((or
	   (or (null return_obj) (equal (type return_obj) 'str))
	   (and
	     (equal (cdr (assoc 0 (entget (car return_obj)))) obj)
	     (wcmatch (strcase (cdr (assoc 8 (entget (car return_obj)))))
		      lay
	     ) ;_ конец wcmatch
	   ) ;_ конец and
	 ) ;_ конец or
	 nil
	)
	(t (alert "Попробуй еще раз!") t)
      ) ;_ конец cond
    ) ;_ конец progn
  ) ;_ конец while
  (if (and return_obj (listp return_obj)) ;_Что-то выбрали
    (progn
      (setvar "LASTPOINT" (cadr return_obj)) ;_сохраняем точку выбора в LASTPOINT
      (car return_obj)
    ) ;_ конец progn
  ) ;_ конец if
) ;_ конец defun
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 01.08.2016, 12:49
#3
AlexZh


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




То, что надо!
Код:
[Выделить все]
 (defun _1z_choice_obj (obj lay promptstr / return_obj)
;;;выбор объекта по условиям "тип примитива" "слой"
;;; например (_1z_change_obj "INSERT" "1Z_APS_EQUIPMENT*" "\nВыберите
;;; приемное устройство или [Выход]
;;; <Выход>:")
;;; lay - маска слоя для wcmatch (Слой1* Слой1,Слой2,#Lay* и т.п.)
;;; initstr - строка для initget
;;; promptstr - строка приглашения
;;; ВОЗВРАЩАЕТ  - имя объекта (ename) при удачном выборе или nil
;;; В случае выбора объекта точка выбора сохраняется в переменной
;;; LASTPOINT
;;; Пример использования
;;; (_1z_choice_obj "INSERT" "1Z_APS_EQUIPMENT*" "Выход" "\nВыберите
;;; приемное устройство или [Выход]
;;; <Выход>:")
  (while
    (progn
      (setvar "errno" 0)
      (initget "Выход")
      (setq return_obj (entsel promptstr)) ;_ конец setq
      (cond
	((= 7 (getvar 'errno))
	 (princ "\nНичего не выбрано! Пробуй снова.")
	)
	((or
	   (or (null return_obj) (equal (type return_obj) 'str))
	   (and
	     (equal (cdr (assoc 0 (entget (car return_obj)))) obj)
	     (wcmatch (strcase (cdr (assoc 8 (entget (car return_obj)))))
		      lay
	     ) ;_ конец wcmatch
	   ) ;_ конец and
	 ) ;_ конец or
	 nil
	)
	(t (alert "Попробуй еще раз!") t)
      ) ;_ конец cond
    ) ;_ конец progn
  ) ;_ конец while
  (if (and return_obj (listp return_obj)) ;_Что-то выбрали
    (progn (setvar "LASTPOINT" (cadr return_obj)) ; _сохраняем точку
						  ; выбора в
						  ; LASTPOINT
	   (car return_obj)
    ) ;_ конец progn
  ) ;_ конец if
  (setq ent_point (cdr return_obj))
  (car return_obj)
)
AlexZh вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как сделать выбор объекта по условиям?

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разработка ПОС, искусство проектирования Tyhig Технология и организация строительства 117 25.11.2021 17:38
diesel взять свойства объекта, field vs diesel Didencool Программирование 9 14.02.2017 13:12
Возможно ли сделать команду на лиспе,чтобы при копировании вводить расстояние не от исходного объекта, а от только что скопированного vlas32 AutoCAD 2 19.08.2012 13:38
Как из объекта 3ds Max сделать объемное тело в AutoCad ??? Weselkow Прочее ПО от Autodesk 3 22.01.2011 20:18
Есть два объекта смещенные на разные углы, как сделать их параллельными? ACAD2010_rus v4dEr AutoCAD 1 23.09.2009 21:24