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

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

Как выделить объекты рамкой, за пределами экрана?

Ответ
Поиск в этой теме
Непрочитано 01.12.2016, 13:56 #1
Как выделить объекты рамкой, за пределами экрана?
valerik88
 
Регистрация: 02.07.2016
Сообщений: 249

Нужно выделить объекты секущей рамкой. Координаты рамки известны. Проблема в том, что код работает, только если объекты находятся в пределах видимости, если объекты не видны на экране, то они не выделяются
Код:
[Выделить все]
 (setq sel (ssget "_C" p1 p2 '((0 . "MTEXT"))))
В документации к ssget описаны параметры
“_X” – вся база примитивов рисунка, включая объекты на замороженных слоях и вне видимой части экрана, с учетом аргумента <фильтр> (в этом случаи аргумент <фильтр> не должен быть опущен);
“_A” – вся база примитивов рисунка, включая объекты на замороженных слоях и вне видимой части экрана;
Но я не знаю как их использовать одновременно с параметром "_C"

Появилась мысль в качестве костыля перемещать положение экрана в нужное место, что бы объекты становились видимыми, но тоже пока не знаю как такое выполнить

----- добавлено через ~3 ч. -----
Решил проблему так: Перед выбором зумируем экран в нужную точку, а после выбора зумируем его в предыдущее положение.

Код:
[Выделить все]
 (command "_zoom" "Р" p1 p2)
(setq sel (ssget "_C" p1 p2 '((0 . "MTEXT"))))
(command "_zoom" "П")
Просмотров: 2248
 
Непрочитано 02.12.2016, 16:30
#2
VVA

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


Цитата:
Сообщение от valerik88 Посмотреть сообщение
Появилась мысль в качестве костыля перемещать положение экрана в нужное место, что бы объекты становились видимыми, но тоже пока не знаю как такое выполнить
Примерно так
Код:
[Выделить все]
(lib:Zoom2Lst (trans p1 1 0)(trans p2 1 0))
Функция возвращает t - было зуммирование nil - нет (если нужно восстановить предыдущий экран)

Код:
[Выделить все]
;| ! *******************************************************************
;; !                  lib:IsPtInView
;; ! *******************************************************************
;; ! Проверяет находится ли точка в видовом экране
;; ! Auguments: 'pt'  - Точка для анализа в МСК!!!
;; ! Return   : T или nil если 'pt' в видовом экране или нет
;; ! *******************************************************************|;

;;;(defun lib:IsPtInView (pt / VCTR Y_Len SSZ X_Pix Y_Pix X_Len Lc Uc)
;;;(setq pt (trans pt 0 1))  
;;;(setq VCTR (getvar "VIEWCTR") Y_Len (getvar "VIEWSIZE")
;;;   SSZ (getvar "SCREENSIZE")
;;;   X_Pix (car SSZ) Y_Pix (cadr SSZ)
;;;   X_Len (* (/ X_Pix Y_Pix) Y_Len)
;;;   Lc (polar VCTR (dtr 180.0) (* 0.5 X_Len))
;;;   Uc (polar Lc 0.0 X_Len)
;;;   Lc (polar Lc (dtr 270.0) (* 0.5 Y_Len))
;;;   Uc (polar Uc (dtr 90.0) (* 0.5 Y_Len)))
;;;(if (and (> (car pt) (car Lc))(< (car pt) (car Uc))
;;;	 (> (cadr pt) (cadr Lc))(< (cadr pt) (cadr Uc)))
;;;	T nil))
(defun lib:get-viewctr-size ( / VCTR Y_Len SSZ X_Pix Y_Pix X_Len)
  (setq VCTR (getvar "VIEWCTR") Y_Len (getvar "VIEWSIZE")
   SSZ (getvar "SCREENSIZE")
   X_Pix (car SSZ) Y_Pix (cadr SSZ)
   X_Len (* (/ X_Pix Y_Pix) Y_Len)
        )
   (list(mapcar '- VCTR (list (* 0.5 X_len)(* 0.5 Y_len)))
        (mapcar '+ VCTR (list (* 0.5 X_len)(* 0.5 Y_len)))
        )
  )
(defun lib:IsPtInView (pt / Lc Uc)
(setq pt (trans pt 0 1))
(setq Lc (lib:get-viewctr-size)
      Uc (cadr Lc)
      Lc (car Lc)
      )
  (if (and (> (car pt) (car Lc))(< (car pt) (car Uc))
	 (> (cadr pt) (cadr Lc))(< (cadr pt) (cadr Uc))
         )
	T nil))

;| ! ***************************************************************************
;; !           lib:pt_extents
;; ! ***************************************************************************
;; ! Function : Возвращает границы MIN, MAX X,Y,Z списка точек
;; ! Argument : 'vlist' - Список точек
;; ! Returns  : Список точек (ЛевНижн ПравВерхн)
;; ! ***************************************************************************|;
(defun  lib:pt_extents (vlist / tmp)
  (setq tmp (apply 'mapcar (cons 'list vlist)))
  (list (mapcar '(lambda(x)(apply 'min x)) tmp)(mapcar '(lambda(x)(apply 'max x)) tmp)));_defun
;http://www.theswamp.org/index.php?topic=15123.0
;;;(defun GetBoundingBox-3d (pt_lst)
;;;  (list	(apply 'mapcar (cons 'min pt_lst))
;;;	(apply 'mapcar (cons 'max pt_lst))
;;;  )
;;;)
(defun mip:ZZero (lst)
  ;;;Координату Z =0
  (mapcar '(lambda(x)(list (car x)(cadr x) 0)) lst)
  )
; ! ***********************************************************
;; !                             lib:Zoom2Lst
;; ! **********************************************************
;; ! Function : Zoom границ списка точек
;; ! Arguments: 'vlist' - Список точек в МСК!!!!
;; ! Зуммирует экран, чтобы все точки были видны
;; ! Returns  : t - было зуммирование nil - нет
;; ! **********************************************************

;;;(defun lib:Zoom2Lst( vlist / bl tr Lst OS)
;;;  ;_(setq *MIP-ZOOM-PREV* nil)
;;;(setq	Lst (lib:pt_extents vlist)
;;;	bl (car Lst) tr (cadr Lst))
;;;(if (not (and (lib:IsPtInView bl) (lib:IsPtInView tr)))
;;;(progn  (setq OS (getvar "OSMODE"))(setvar "OSMODE" 0)
;;;	(command "_.Zoom" "_Window" (trans bl 0 1)(trans tr 0 1)
;;;		"_.Zoom" "0.95x")
;;; ;_       (setq *MIP-ZOOM-PREV* 2)
;;;	(setvar "OSMODE" OS)
;;;  T) NIL))

;;; Версия с vla- объектами
  (defun lib:Zoom2Lst (vlist / pts)
    (setq pts (lib:pt_extents (mip:ZZero vlist)))
    (if (not (and (lib:IsPtInView (car pts)) (lib:IsPtInView (cadr pts))))
      (progn
        (vla-ZoomWindow (vlax-get-acad-object)(vlax-3d-point (car pts))(vlax-3d-point (cadr pts)))
	(vlax-invoke (vlax-get-acad-object) 'ZoomScaled 0.85 acZoomScaledRelative)
	T
	)
      nil
      )
  ) ;end
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как выделить объекты рамкой, за пределами экрана?

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работает привязка к объектам модели, находящимся за пределами видового экрана, не удаляется внешняя ссылка cancercat AutoCAD 8 20.07.2012 09:11
Как выделить объекты на слое Serjik7 AutoCAD 34 16.07.2012 11:37
Рамкой выбора можно выбрать лишь те объекты которые видны на экране zawer Баги и пожелания в Autodesk 16 01.09.2010 15:46
Как программно выделить (подсветить) объекты на текущи чертеже? Michigan Программирование 2 26.05.2009 22:09
Как выбрать окном за пределами экрана? GAP AutoCAD 4 08.02.2004 00:15