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

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

Выбор рамкой под углом

Ответ
Поиск в этой теме
Непрочитано 12.01.2014, 22:12 #1
Выбор рамкой под углом
roaa
 
ОПС
 
Kazakhstan
Регистрация: 29.03.2012
Сообщений: 127

Понадобилась функция по выбору рамкой под углом. На форуме не нашел, пришлось попробовать самому.
Может, кому-то и понадобится. В функции использованы некоторые коды Lee Mac.

Код:
[Выделить все]
 
(defun _sensor_select_frame ( clr illum ang1 / _getosmode _grX _dyn_frame p1 p2 )
;;; Функция выбора рамкой
;;; Аргументы:
;;;   clr - цвет рамки   
;;;   illum - t с подсветкой, nil - без
;;;   ang1 - угол в радианах, если nil предлагает задать
;;; Вызов:
;;;   (_sensor_select_frame 1 nil nil)
;;; Возвращает:
;;;   Список координат точек рамки
  (redraw)
  
  (defun _getosmode ( os / lst )
    (foreach mode
     '(
         (0001 . "_end")
         (0002 . "_mid")
         (0004 . "_cen")
         (0008 . "_nod")
         (0016 . "_qua")
         (0032 . "_int")
         (0064 . "_ins")
         (0128 . "_per")
         (0256 . "_tan")
         (0512 . "_nea")
         (1024 . "_qui")
         (2048 . "_app")
         (4096 . "_ext")
         (8192 . "_par")
      )
      (if (not (zerop (logand (car mode) os)))
        (setq lst (cons "," (cons (cdr mode) lst)))
      )
    )
    (apply 'strcat (cdr lst))
  )  
  
  (defun _grX ( p s c / -s r q )
    (setq -s (- s)
           r (/ (getvar 'VIEWSIZE) (cadr (getvar 'SCREENSIZE)))
           p (trans p 1 3)
    )
    (grvecs
      (list c 
            (list -s      -s) (list s        s)
            (list -s (1+ -s)) (list (1- s)   s)
            (list (1+ -s) -s) (list s   (1- s))
            
            (list -s       s) (list s       -s)
            (list -s  (1- s)) (list (1- s)  -s)
            (list (1+ -s)  s) (list s  (1+ -s))
      )
      (list
            (list r  0. 0. (car  p))
            (list 0. r  0. (cadr p))
            (list 0. 0. r  0.)
            (list 0. 0. 0. 1.)
      )
    )
    p
  )
  
  (defun _dyn_frame ( p1 p2 p3 ang1 ang2  clr illum / pd1 pd2 )  
    (setq pd1 (inters p1 (polar p1 ang2 100) p3 (polar p3 ang1 100) nil)
          pd2 (inters p2 (polar p2 ang2 100) p3 (polar p3 ang1 100) nil)
    )
    (grvecs (list (if (eq illum 't) (- clr) clr) p1 p2  p2 pd2  pd2 pd1  pd1 p1))
    (list pd2 pd1)
  )
  
  (defun *error* ( msg )
    (princ "\nЗавершено пользователем.  ")
    (redraw)
  )
    
  (if 
    (and (eq (type clr) 'int)
         (setq p1   (getpoint "\nSpecify Base Point: "))
         (if (not ang1)(setq ang1 (getangle p1 "\nSpecify an Angle: "))(member (type ang1) '(int real)))
         (setq ang2 (+ ang1 (* 0.5 pi)))
    )
    (progn
      (setq os (_getosmode (getvar 'OSMODE)))
      (princ (setq ms "\nSpecify Opposite Corner: "))
      (while 
        (progn
          (and (setq gr (grread t 15 0) g1 (car gr) pd (cadr gr)) (/= g1 3))
          (cond
                (  (= g1 5) (redraw)
                   (if
                     (and
                       (zerop (logand 16384 (getvar 'OSMODE)))
                       (setq op (osnap pd os))
                     )
                     (_grX (setq pd op) 6 20)
                   )
                   (setq p34
                             (_dyn_frame p1 
                               (setq p2 (inters p1 (polar p1 ang1 100) pd (polar pd ang2 100) nil))
                               pd ang1 ang2 clr illum
                             )
                   )
                )
                (  (or (member gr '((2 13) (2 32)))(or (= g1 11) (= g1 25)))
                   (setq p34 nil)
		)
          )
        )
      )
      (redraw)
      (if p34 (cons p1 (cons p2 p34)) nil)
    )
  )
)

Последний раз редактировалось roaa, 19.01.2014 в 11:12.
Просмотров: 2763
 
Непрочитано 16.01.2014, 18:33
#2
skkkk


 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,369


roaa, идея замечательная, поэтому есть замечания и пожелания:
1. При нажатии на правую кнопку (Enter) на запрос базовой точки (и/или угла) напрашивается, на мой взгляд, запрос выбора опорного объекта, например, линии или сегмента полилинии, с которого возьмется угол рамки.
2. У динамической рамки, как бы это выразиться, всего одна степень свободы, т.е. прямоугольник растягивается только по высоте либо только по ширине, что не очень удобно.
3. Если нажать Esc при указании второго угла рамки, то на чертеже эта рамка остается. Т.е. нужна обработка ошибок.
4. Раз программа так называется (ключевое слово "выбор"), то и возвращать она, по-хорошему, должна набор, а не список точек.
5. Хочется, чтоб рамка была как родная автокадовская: в одну сторону секущая (и к тому же штриховая), в другую - охватывающая.
6. Можно добавить возможность производить выбор циклически, используя первый заданный угол.
7. При выборе с Shift'ом с попавших в рамку уже выбранных объектов хорошо бы, чтоб выделение снималось.
8. Ну и неплохо бы иметь возможность добавлять фильтры выбора.
А там и в "Готовые программы" ее можно
skkkk на форуме  
 
Непрочитано 16.01.2014, 18:40
#3
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 5,911


чета она ничего не выбирает
Nike вне форума  
 
Непрочитано 16.01.2014, 19:13
1 | #4
skkkk


 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,369


Цитата:
Сообщение от Nike Посмотреть сообщение
ничего не выбирает
Она (пока?) возвращает точки границы выбранной области. Видимо, по замыслу roaa, эти точки должны скармливаться как аргументы ssget'у с опцией "_WP" или "_CP".
Сделать выбор можно, например, так (при подгруженном лиспе из первого поста):
Код:
[Выделить все]
 (defun C:TEST ( / lst ss)
	(sssetfirst nil nil)
	(setq lst (_sensor_select_frame 1 T)
		  ss (ssget "_CP" lst))
	(sssetfirst nil ss)
	(princ (strcat "\nВыбрано " (vl-princ-to-string (sslength ss)) " примитивов"))
	(princ) 
)
skkkk на форуме  
 
Автор темы   Непрочитано 17.01.2014, 23:52
#5
roaa

ОПС
 
Регистрация: 29.03.2012
Kazakhstan
Сообщений: 127


Цитата:
Сообщение от skkkk
roaa
1. Функция и задумывалась именно для получения точек, а дальше на усмотрение, кто как обработает. Выбор опорного объекта потребует дополнительной обработки, да и количество кликов это не уменьшит.
2. Тут у меня пока не хватает знаний как от этого покрасивше избавиться.
3. Добавил.
4. Да...неудачное название
5-8. Это функция...уж простите. К тому же Ваш код практически это выполняет.

Последний раз редактировалось roaa, 17.01.2014 в 23:59.
roaa вне форума  
 
Непрочитано 18.01.2014, 19:12
#6
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,691
Отправить сообщение для Do$ с помощью Skype™


У меня лично когда-то была "идея фикс" сделать свой инструмент выбора взамен стандартного SSGET с использованием GRREAD. Так вот, споткнулся я как раз на этом:
Цитата:
Сообщение от skkkk Посмотреть сообщение
5. Хочется, чтоб рамка была как родная автокадовская: в одну сторону секущая (и к тому же штриховая), в другую - охватывающая.
100% "родную автокадовскую" сделать, скорее всего, не получится. Мало того, что она штриховая, так еще прямоугольник выбора закрашивается зеленым или синим цветом, в зависимости от типа рамки. Закрашивание это - прозрачное, с помощью лиспа такого не сделать и никак не сымитировать. По крайней мере, у меня не получилось.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Автор темы   Непрочитано 18.01.2014, 23:12
#7
roaa

ОПС
 
Регистрация: 29.03.2012
Kazakhstan
Сообщений: 127


Do$,
Для прямоугольной рамки это нетрудно
Код:
[Выделить все]
 
(defun test ( / pt1 )
;;; Возвращает: созданный набор
;;; для проверки: (sssetfirst nil (test))
  (if (setq pt1 (getpoint "Первый угол:  "))
    (progn 
      (command "_.select" "_box" pt1 pause "" '"_p" "") 
      (ssget "_p")
    )
  )
)
----- добавлено через ~1 мин. -----
Немного изменил код. Теперь вторая точка находится динамически, немного удобней. Добавил возможность задания угла.

Последний раз редактировалось roaa, 19.01.2014 в 11:19.
roaa вне форума  
 
Непрочитано 19.01.2014, 12:56
#8
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,691
Отправить сообщение для Do$ с помощью Skype™


command "_.select"... - это практически командная обертка SSGET, даже, наверное, ее изначальной ObjectARX реализации. Но не все, что доступно в ARX можно реализовать в ЛИСПе, в том числе, с использованием командных методов. К примеру, сможешь ты в этом коде сделать так, чтобы стандартное сообщение "Select objects:" ("Выберите объекты:") заменить своим? Причем таким образом, чтобы оно висело в комстроке, пока идет выбор и бегало за курсором, если включен динамический ввод?
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 12.02.2020, 14:50
1 | #9
koMon


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


Цитата:
Сообщение от Do$ Посмотреть сообщение
сделать свой инструмент выбора взамен стандартного SSGET с использованием GRREAD
что-то типа такого?
Миниатюры
Нажмите на изображение для увеличения
Название: CW_Selection.gif
Просмотров: 24
Размер:	4.31 Мб
ID:	223082  
koMon вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Выбор рамкой под углом

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выбор в автокаде ASЪ AutoCAD 39 26.06.2014 20:19
Выбор и подсветка объектов в 2013 Акаде. Astartes AutoCAD 4 20.05.2013 13:24
Выбор рамкой (работает глючно) Strannyk AutoCAD 2 24.05.2011 11:40
Выбор объектов рамкой, вне экрана? Berejnoy AutoCAD 8 03.01.2008 13:44
Выбор примитивов в функции (command) mmax Программирование 12 19.05.2006 20:02