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

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

Фильтр команды "ssget"

Ответ
Поиск в этой теме
Непрочитано 28.04.2008, 17:47 #1
Фильтр команды "ssget"
Mazai
 
Москва
Регистрация: 04.04.2008
Сообщений: 97

Здраствуйте.
У меня вопрос - можно ли одним запросом с помощью команды "SSGET" сформировать набор, в котором одновременно отбирались бы примитивы типа "LINE" и "LWPOLYLINE". Или в этой команде отбор примитивов возможен только по одному типу? Если это так, то как ещё можно это сделать? (как сформировать два набора, потом их объеденить и отсортировать - я знаю - получается много лишних действий)
Просмотров: 11396
 
Непрочитано 28.04.2008, 18:06
#2
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Код:
[Выделить все]
 
(ssget "_X" '((0 . "LINE,LWPOLYLINE")))
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 29.04.2008, 09:16
#3
Mazai


 
Регистрация: 04.04.2008
Москва
Сообщений: 97


Спасибо!
Mazai вне форума  
 
Непрочитано 11.08.2008, 19:28
#4
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Когдато давно я уже задавал этот вопрос и мне ответили , но не могу найти сейчас.
Там есть фильтры с кодом -4, если не ошибаюсь, под которым идут логические OR NOT AND. Забыл как их формировать. Справка AutoCAD 2008 RUS пишет, что данный раздел отсутствует.
Если у кого в справке есть этот раздел скиньте пожалуйста сюда.
Или хотябы напишите как правильно формируется открывающий и закрывающий список.
Нужно срочно.
Заранее благодарен.
mmax вне форума  
 
Непрочитано 11.08.2008, 21:20
1 | #5
Кулик Алексей aka kpblc
Moderator

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


Лови:
Вложения
Тип файла: pdf ssget_filter.pdf (12.8 Кб, 632 просмотров)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.08.2008, 21:20
#6
Donhuan

Проектировщик СС
 
Регистрация: 24.06.2008
Минск
Сообщений: 134
<phrase 1=


Logical Grouping of Filter Tests

You can also test groups by creating nested Boolean expressions that use the logical grouping operators shown in the following table:

Grouping operators for selection set filter lists

The grouping operators are specified by –4 groups, like the relational operators. They are paired and must be balanced correctly in the filter list or the ssget call will fail. An example of grouping operators in a filter list follows:

(ssget "X"

’(
(-4 . "<OR")
(-4 . "<AND")
(0 . "CIRCLE")
(40 . 1.0)
(-4 . "AND>")
(-4 . "<AND")
(0 . "LINE")
(8 . "ABC")
(-4 . "AND>")
(-4 . "OR>")
)
)
This code selects all circles with a radius of 1.0 plus all lines on layer "ABC". The grouping operators are not case-sensitive; for example, you can specify "and>", "<or", instead of "AND>", "<OR".

Grouping operators are not allowed within the –3 group. Multiple application names specified in a –3 group use an implied AND operator. If you want to test for extended data using other grouping operators, specify separate –3 groups and group them as desired. To select all circles having extended data for either application "APP1" or "APP2" but not both, enter the following:

(ssget "X"
’((0 . "CIRCLE")
(-4 . "<XOR")
(-3 ("APP1"))
(-3 ("APP2"))
(-4 . "XOR>")
)
)
You can simplify the coding of frequently used grouping operators by setting them equal to a symbol. The previous example could be rewritten as follows (notice that in this example you must explicitly quote each list):

(setq <xor ’(-4 . "<XOR")
xor> ’(-4 . "XOR>") )
(ssget "X"
(list
’(0 . "CIRCLE")
<xor
’(-3 ("APP1"))
’(-3 ("APP2"))
xor>
)
)
As you can see, this method may not be sensible for short pieces of code but can be beneficial in larger applications.
Donhuan вне форума  
 
Непрочитано 11.08.2008, 22:32
#7
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Спасибо.
Может вопрос уже не по теме, но почему у меня отсутствуют элементы справки, жму ссылки внизу а там вот такое:
Миниатюры
Нажмите на изображение для увеличения
Название: ssget.jpg
Просмотров: 223
Размер:	73.8 Кб
ID:	9207  
mmax вне форума  
 
Непрочитано 12.08.2008, 06:20
#8
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Да просто потому что разработчики справки в ссылке опечатку сделали. Или заготовили ссылку, а нужную страницу не написали. Или написали, да удалили, может быть нечаянно. Понедельник день тяжелый не только у нас.
ShaggyDoc вне форума  
 
Непрочитано 12.08.2008, 08:12
#9
Кулик Алексей aka kpblc
Moderator

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


Скорее всего, это глюк локализации.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.02.2013, 17:21
#10
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Помогите, пожалуйста, разобраться.
У Полещука в книге "AutoLISP и Visual LISP в среде AutoCAD" написано:
Цитата:
(ssget '(125.4 58.1)) создает набор из всех примитивов, проходящих через точку (125.4 58.1)
В приложенном файле через точку (0.0 0.0) проходит ТРИ примитива "LWPOLYLINE", но
Код:
[Выделить все]
(sslength (ssget '(0.0 0.0)))
возвращает "1".
Что не так?
Вложения
Тип файла: dwg
DWG 2007
Чертеж1.dwg (92.3 Кб, 2345 просмотров)
skkkk вне форума  
 
Непрочитано 12.02.2013, 20:16
1 | #11
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Пробуй такой вариант
Код:
[Выделить все]
(setq pt (list 0 0 0) fuzz 0.001); <-- set epsilon to your suit,eg: 0.000001, etc.
(setq ss (ssget	"x"
		(list (cons -4 "<or")
		      (cons -4 ">,>,>")
		      (cons 10
			    (mapcar '+ (list fuzz fuzz fuzz) pt))
		      (cons -4 "<,<,<")
		      (cons 10
			    (mapcar '+ (list fuzz fuzz fuzz) pt))
		      (cons -4 "or>"))))
Олег (jr.) вне форума  
 
Непрочитано 12.02.2013, 22:04
#12
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Олег (jr.), спасибо, сработало. Это ж как надо начать думать, чтоб до такого додуматься?
Интересно, почему не работает вариант Полещука?
skkkk вне форума  
 
Непрочитано 12.02.2013, 23:09
#13
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от skkkk Посмотреть сообщение
Это ж как надо начать думать, чтоб до такого додуматься
Я не думаю мне нечем
Олег (jr.) вне форума  
 
Непрочитано 13.02.2013, 10:37
#14
Do$

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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Интересно, почему не работает вариант Полещука?
http://forum.dwg.ru/showpost.php?p=460622&postcount=10
Do$ вне форума  
 
Непрочитано 17.02.2013, 18:29
#15
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Олег (jr.), а как в твоем варианте выбрать ТОЛЬКО полилинии, проходящие через точку pt?
Do$, не пойму, причем тут погрешность и числа с плавающей запятой? В варианте Полещука выбирается тот примитив, который является самым новым в порядке прорисовки, т.е. самый "верхний". Если его убрать за объекты, выбирается другой примитив, проходящий через эту точку.
skkkk вне форума  
 
Непрочитано 18.02.2013, 08:57
1 | #16
CB

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


Код:
[Выделить все]
(sslength (ssget "_C" pt pt))
Ну а дальше из набора выбирай полилинии
__________________
Никогда не спорьте с дураками - они опустят Вас до своего уровня и победят за счет опыта
CB вне форума  
 
Непрочитано 18.02.2013, 11:09
#17
Do$

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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Do$, не пойму, причем тут погрешность и числа с плавающей запятой?
Я предположил, что из-за этого не выбирается. Получается, что оказался не прав.
Do$ вне форума  
 
Непрочитано 18.02.2013, 15:56
#18
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от CB Посмотреть сообщение
Код:
[Выделить все]
(sslength (ssget "_C" pt pt))
Ну а дальше из набора выбирай полилинии
Ну тогда уж (хотя это всё извращение):
Код:
[Выделить все]
 (setq delta 1e-4) ;; устанавливаем некую погрешность
(ssget "_C" (mapcar '- pt (list delta delta delta)) (mapcar '+ pt (list delta delta delta)) '(0 . "*POLYLINE"))
И точка должна быть видна на экране.
Александр Ривилис вне форума  
 
Непрочитано 18.02.2013, 17:13
#19
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от skkkk Посмотреть сообщение
Олег (jr.), а как в твоем варианте выбрать ТОЛЬКО полилинии, проходящие через точку pt?
Так должно выбирать что нужно
Код:
[Выделить все]
(setq pt (list 0 0 0) fuzz 0.001); <-- set epsilon to your suit,eg 0.000001 etc
(setq ss (ssget	"_X"
		(list (cons -4 "<and")
		      (cons 0 "lwpolyline")
		      (cons -4 "<or")
		      (cons -4 ">,>,>")
		      (cons 10
			    (mapcar '- (list fuzz fuzz fuzz) pt))
		      (cons -4 "<,<,<")
		      (cons 10
			    (mapcar '+ (list fuzz fuzz fuzz) pt))
		      (cons -4 "or>")
		      (cons -4 "and>"))))

Последний раз редактировалось Олег (jr.), 18.02.2013 в 20:45.
Олег (jr.) вне форума  
 
Непрочитано 18.02.2013, 19:23
1 | #20
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
Так должно выбирать что нужно
Не должно. Так в лучшем случае будет выбирать если точка рядом с вершиной полилинии. Это если не считать ошибку в знаках у mapcar.
Александр Ривилис вне форума  
 
Непрочитано 30.04.2013, 16:59
#21
sasha_lif

Дизайнер-конструктор
 
Регистрация: 29.05.2004
Kiev
Сообщений: 1,179
<phrase 1=


Подскажите, как поправить код
Написал сам, вроде работает.
Не сильно разбираюсь,как сделать:
Сейчас программа автоматически находит и печатает ВСЕ рамки-блоки.

А хотелось бы задать область (т.е. обвожу часть чертежа, и только там ищутся эти рамочки для распечатки)

Код:
[Выделить все]
 (defun c:asd (/ )
  (vl-load-com)
  (setq s1 (ssget "_X" (list (assoc 8 (entget (car (entsel "Выберите объект, находящийся на необходимом слое: ")))))))	
  (setq l1 (sslength s1))

(setq  blip (getvar "BLIPMODE"))
(setq  echo (getvar "CMDECHO"))
(setvar "CMDECHO"  0)
(setvar "BLIPMODE" 0)

  
(setq i 0) 
(while (< i= l1) 
	
  (setq s11 (ssname s1 i))
  (setq a_nach (entget s11))
  (setq a (entget s11)) ; получение списка со всеми координатами точек прямоугольника
  
  	(setq t1 (assoc 10 a))    (setq t1_x (car (cdr t1))) (setq t1_y (car (cdr (cdr t1))))
	(setq a (subst '(11 11stop) t1 a))
	(setq t2 (assoc 10 a))    (setq t2_x (car (cdr t2))) (setq t2_y (car (cdr (cdr t2))))
	(setq a (subst '(11 11stop) t2 a))
	(setq t3 (assoc 10 a))    (setq t3_x (car (cdr t3))) (setq t3_y (car (cdr (cdr t3))))
	(setq a (subst '(11 11stop) t3 a))
	(setq t4 (assoc 10 a))    (setq t4_x (car (cdr t4))) (setq t4_y (car (cdr (cdr t4))))
	
	

	(setq tdiag_x_max (max t2_x t3_x t4_x))
	(setq tdiag_y_max (max t2_y t3_y t4_y))
	(setq tdiag_x_min (min t2_x t3_x t4_x))
	(setq tdiag_y_min (min t2_y t3_y t4_y))



(setq point1 (list tdiag_x_min tdiag_y_min))
(setq point2 (list tdiag_x_max tdiag_y_max))

(setq Dy (- tdiag_y_max tdiag_y_min))
(setq Dx (- tdiag_x_max tdiag_x_min))

(setq Dyx (/ Dy Dx))

(if (> Dy Dx ) (setq ugol "P")(setq ugol "l"))

(command "_-plot" "y"  ""  ""  ""  ""  ugol  ""   "" point1 point2 ""  ""  ""   ""  ""  ""   ""  ""   "")
(setq i (1+ i))

)

(setvar "CMDECHO"  echo)
(setvar "BLIPMODE" blip)

)
Вложения
Тип файла: dwg
DWG 2007
asd.dwg (118.4 Кб, 822 просмотров)
__________________
Kiev, Ukraine
sasha_lif вне форума  
 
Непрочитано 30.04.2013, 18:59
#22
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


А если заменить (ssget "_X".... на (ssget "_C" (getpoint) (getpoint)...., не поможет? Проверить сейчас не могу.
skkkk вне форума  
 
Непрочитано 30.04.2013, 20:05
#23
sasha_lif

Дизайнер-конструктор
 
Регистрация: 29.05.2004
Kiev
Сообщений: 1,179
<phrase 1=


Ну во -первых указанием двух точек не всегда годится, т.к. распечатывать надо не всегда то, что лежит внутри прямоугольника. А часто часть чертежей с одного места, часть с другого...
Хотелось бы именно ВЫДЕЛЕННУЮ ЧАСТЬ ЧЕРТЕЖА
сделал так:
Код:
[Выделить все]
 (setq s1 (ssget "P" '((8 . "format")) ) 
Но что-то не всегда срабатывает, по этому предварительно выделенному части чертежа.
__________________
Kiev, Ukraine
sasha_lif вне форума  
 
Непрочитано 01.05.2013, 09:04
#24
Do$

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


(setq s1 (ssget '((8 . "format")))
Do$ вне форума  
 
Непрочитано 07.05.2013, 23:35
#25
sasha_lif

Дизайнер-конструктор
 
Регистрация: 29.05.2004
Kiev
Сообщений: 1,179
<phrase 1=


Do$, большое спасибо, так и сделал ))
__________________
Kiev, Ukraine

Последний раз редактировалось Кулик Алексей aka kpblc, 07.05.2013 в 23:57.
sasha_lif вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Фильтр команды "ssget"



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Для чего нужны фильтры слоев?Как ими пользоваться? Aysulu AutoCAD 43 17.04.2019 10:59
Изменение полей (fields) RomanM AutoCAD 20 24.08.2016 22:39
запуск программы из AutoCADа kminas Программирование 19 15.06.2012 13:42
Отображение GRID при выполнении команды PAN REALTIME MAX-MAX AutoCAD 10 29.06.2009 18:43
Прозрачные команды Vova AutoCAD 17 21.06.2006 05:33