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

Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Небыстрый "Быстрый выбор" !

Небыстрый "Быстрый выбор" !

Ответ
Поиск в этой теме
Непрочитано 06.06.2004, 10:27 #1
Небыстрый "Быстрый выбор" !
Psip!
 
Сообщений: n/a

Проблема:
на большом чертеже нужно найти некоторые объекты, к примеру текст "02в", "03в", "02d" ну и так далее. Пользуюсь для этого "Быстрым выбором", а именно Сервис\Быстрый выбот\затем из падающего меню нахожу "Текст", затем "Содержимое", "=равно", и только затем пишу нужный мне текст!
Потом повторяю все операции снова, потом снова, потом снова, и как-то хочется убыстрить выбор!!! Хотя бы до возможности сохранения в менюшке предыдущего запроса. А в идеале - до написания нескольких макросов для поиска нескольких разных объектов.
Гуру, отзовитесь! Need help!
Просмотров: 14788
 
Непрочитано 06.06.2004, 12:14
#2
VadimVG


 
Регистрация: 05.02.2004
Краснодар
Сообщений: 130
<phrase 1=


Меню edit=>find, в появившемся окне пишешь че надо найти, жмешь find, затем zoom to, перемещаешься куда надо.
VadimVG вне форума  
 
Непрочитано 06.06.2004, 12:18
#3
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Это тоже не самый шустрый способ.... Опять гулянка по меню - диалоговым окнам ))
Вот малююююсенький Лиспик
Код:
[Выделить все]
(defun c:tsel (/)
  (ssget "_X" (list '(0 . "TEXT") (cons 1 (getstring t "\nСтрока для поиска: "))))
  (princ)
) ;_  defun
При вводе строки для поиска можно использовать звездочку и вопрос. Выбранные TEXT'ы будут в наборе Previous, то есть будут доступны при вводе опции _p в ответ на приглашение выбора объектов...
Цитата:
Command: tsel
Строка для поиска: 1?3
Command:
Command: _move
Select objects: _p
1 found
Select objects:
vk вне форума  
 
Непрочитано 06.06.2004, 12:34
#4
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Вариант с информацией о результате поиска:
Код:
[Выделить все]
(defun c:ts (/ ss)
  (if (setq ss (ssget "_X" (list '(0 . "TEXT") (cons 1 (getstring t "\nСтрока для поиска: ")))))
    (princ (strcat "\nНайдено TEXT'ов: " (rtos (sslength ss))))
    (princ "\nНе найдено...")
  ) ;_  if
  (princ)
) ;_  defun
Цитата:
Command: ts
Строка для поиска: 12*
Найдено TEXT'ов: 4
Command:
Command: _.move
Select objects: _p
4 found
.....
vk вне форума  
 
Непрочитано 06.06.2004, 22:53
#5
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


... и тут Остапа понесло....

А что если оформить это не как обычную команду, а как функцию....
Нижеследующий код добавляет фильтр и возвращает выбранные объекты в команду, а также (может и зря) доводит пользовательский ввод текущей команды до завершения
Код:
[Выделить все]
(defun tsw (/ ss)
  (if (setq ss (ssget (list '(0 . "TEXT") (cons 1 (getstring t "\nСтрока для поиска: ")))))
    (progn
      (princ (strcat "\nНайдено TEXT'ов: " (rtos (sslength ss))))
      (if (= (logand (getvar "cmdactive") 1) 1)
        (progn
          (command "_p" "")
          (while (/= (logand (getvar "cmdactive") 1) 0) (command pause))
        ) ;_  progn
      ) ;_  if
    ) ;_  progn
    (princ "\nНе найдено...")
  ) ;_  if
  (princ)
) ;_  defun
Тогда ее можно будет вызывать как дополнительный фильтр к стандартному выбору. Или самостоятельно для определения набора Previous.
Вот пример выбора группы примитивов для окна свойств
Цитата:
Command: _.PSELECT
Select objects: (tsw)
Строка для поиска: ?2?
Select objects: Specify opposite corner: 4 found
1 was filtered out.
Select objects:
Найдено TEXT'ов: 3_p 3 found
Select objects:
Command:
Конечно, поиск текста по заданной строке - это всего лишь пример... Фильтр можно ставить и на слой и на цвет... Для этого нужны конечно минимальные знания по DXF, однако, при желании если не за час-другой, то за день то это можно освоить....

Еще вариант - прозрачная команда. Та которая выполняется во время выполнения основной команды.
Код:
[Выделить все]
(defun ts (/ ss)
  (if (setq ss (ssget "_X" (list '(0 . "TEXT") (cons 1 (getstring t "\nСтрока для поиска: ")))))
    (princ (strcat "\nНайдено TEXT'ов: " (rtos (sslength ss))))
    (princ "\nНе найдено...")
  ) ;_  if
  (princ)
) ;_  defun
(vlax-add-cmd "ts" 'ts "ts" 3)
Вызов аналогичный, "но есть ньюансы". В нее не получается вставить command, поэтому вызов наверно удобнее замешать в кнопочный макрос вроде такого:
Код:
[Выделить все]
^P'ts;\_p;(while (/= (logand (getvar "cmdactive") 1) 0) (command pause))(princ);;
Даем команду, в ответ на приглашение выбрать объекты давим кнопку...
Цитата:
Command: _move
Select objects:
>>Строка для поиска: 1*
Найдено TEXT'ов: 4
Resuming MOVE command.
Select objects:
4 found
Select objects:
Specify base point or displacement:..............
vk вне форума  
 
Непрочитано 07.06.2004, 05:46
#6
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 9,825


Углядел здесь незнакомую команду PSELECT. Не нашел ее в Help. Выделяет об-екты грипсами. Для чего применяется?
Vova вне форума  
 
Непрочитано 07.06.2004, 10:29
#7
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,134


А эти лиспы только для текста или можно изменить переменную TEXT на BLOCK потом название блока куда то написать и будут блоки выделяться?
Если не трудно поясните как расширить этот лисп до поиска блоков))
__________________
Большая беда науки в том, что при восхитительной теории можно получить отвратительные результаты.
Mikhail вне форума  
 
Непрочитано 07.06.2004, 13:03
#8
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,134


ИЗВИНЯЮСЬ.
Похоже я совсем плох стал((( сам это уже спрашивал, но по запарке совсем забыл((
Команда ssx есть как мне подсказали. Довльно удобна для написания макроса.
__________________
Большая беда науки в том, что при восхитительной теории можно получить отвратительные результаты.
Mikhail вне форума  
 
Непрочитано 07.06.2004, 17:10
#9
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от Vova
Углядел здесь незнакомую команду PSELECT. Не нашел ее в Help. Выделяет об-екты грипсами. Для чего применяется?
Не знаю для чего применяется, а выскочила она когда делал выбор объектов из окна свойств. Наверно, что то сокращенное от "Propertie"... какое то специфичное...

>Mikhail
ssx - это из Тулпака или Экспрессов?

Для выбора имен блоков (точнее - для вставок блоков) фильтр будет примерно такой:
.... (list '(0 . "INSERT") (cons 2 (getstring t "\nИмя блока: "))) ....
vk вне форума  
 
Непрочитано 07.06.2004, 21:17 Небыстрый "Быстрый выбор" !
#10
Psip!


 
Сообщений: n/a


Спасибо всем откликнувшимся!
Лиспы опробовал, но результат как-то не очень.
Да тексты находятся и с ними можно делать различные операции. НО.....
По QSELECT (БВЫБОР) обекты именно выбираются. Их видно! Ручки-то включены! А здесь нет.
 
 
Непрочитано 07.06.2004, 21:33
#11
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Попробуйте тот вариант, где "....пример выбора группы примитивов для окна свойств ....." Там точно с подсвеченными ручками остаецца.
vk вне форума  
 
Непрочитано 07.06.2004, 21:42
#12
Джек

Строительство
 
Регистрация: 03.09.2003
Нижний Новгород
Сообщений: 81
<phrase 1=


Привет всем! Да, я проверял Лисп VK Ручек не видно! :? Когда чертёж маленький, как то можно обратить внимание какой объект выделен! А когда боооооольшой чертёж тут начинаешь призадумываться! :roll:
Джек вне форума  
 
Непрочитано 07.06.2004, 22:01
#13
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


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

Итак, вопрос прост: ЧТО должно быть результатом работы команды/функции/макроса?
vk вне форума  
 
Непрочитано 08.06.2004, 03:42
#14
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 9,825


VK> ssx это из Express. Pselect это команда, которая выводится из маленькой кнопочки с красным крестиком в правом верхнем углу окна Properties. (отсюда и "Р") Или с клавиатуры, если окно открыто. Грипсует объекты.
Vova вне форума  
 
Непрочитано 08.06.2004, 10:10
#15
AY


 
Сообщений: n/a


> vk

А я в фильтрах возвращаемым значением передаю набор и не забочусь о (command "_p" "") :

Код:
[Выделить все]
.....
МуSelect ;;;содержит набор
);end defun
Кроме того подсветку с ручками тоже всегда ставлю удобно и наглядно

Код:
[Выделить все]
.....
(sssetfirst nil МуSelect )
МуSelect ;;;содержит набор
);end defun
 
 
Непрочитано 08.06.2004, 15:31
#16
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Так значит, чтоб с ручками....
Возможно, сторонники Лиспа меня и не поймут....
Рисуем кнопки... Фильтры в ssget, конечно, только для примера.
Попробуем использовать команду _.PSELECT, на которую обратил внимание мой заокеанский тезка. К сожалению, это специфическая команда окна свойств. Если в текущем сеансе окно свойств _.properties не вызывалось - то команда не доступна. Впрочем, это не мешает ее (команду) использовать. Достаточно загрузить нужный файл acopm.arx, что лежит в корневом каталоге АКАДа (тестировались на английской версии AutoCAD2002 и 2004). Способов загрузки несколько :
  • --вызвать окно свойств;
    --ввести Лисп-выражение (arxload "acopm.arx"), хоть с командной строки, хоть в макросе, хоть из любого автозагружаемого файла, например acaddoc.lsp;
    --ручками через _.appload загрузить файл acopm.arx;
    --раз и навсегда прописать этот файл в автозагрузку в CONTENT в окне APPLOAD....
Здесь полная свобода выбора. Лично мне больше нравится четвертый способ.


Теперь собственно о том "что вешать на кнопки":


Код:
[Выделить все]
^P_.pselect;(ssget '((0 . "ARC") (8 . "abcd")));\\;;
Выбирает дуги на слое "abcd" в указаннм пользователем окне.

Код:
[Выделить все]
^P_.pselect;(ssget "_X" '((0 . "ARC") (8 . "abcd")));;
Почти то же самое, только не в окне, а во всем чертеже. Однако, гибкости практически нет. Можно, конечно, править макрос через настройку меню.... ИМХО, это не самый лучший вариант.... В макросы кнопок можно вставлять Лисп-выражения, но.... имеются некоторые ограничения . Например, ввод данных.
Попытаемся все же сделать пользовательский ввод. Функция (getstring) в данном случае не подходит.

Код:
[Выделить все]
^P_.setvar;users1;\_.pselect;(ssget (list '(0 . "ARC") (cons 8 (getvar "users1"))));\\;;
В этом макросе информация в Лисп передается через системную переменную USERS1. Макрос сначала запрашивает имя слоя, сохраняет его в USERS1 а затем выбирает дуги в этом слое в указаннм пользователем окне. Хотя немножко и коряво (имею в виду отсутствие подсказок к запросам в диалоге командной строки), однако, работает.


Код:
[Выделить все]
^P_.setvar;users1;\_.pselect;(ssget "_X" (list '(0 . "ARC") (cons 8 (getvar "users1"))));;
То же самое, только не в окне, а во всем чертеже. Нетрудно заметить, что "_X" определяет поиск во всем чертеже. Есть еще одна на мой взгляд интересная опция "_P" - в предыдущем (Previous) выборе.

Можно передать в фильтр и несколько параметров.
Код:
[Выделить все]
^P_.setvar;users1;\_.setvar;users2;\_.pselect;(ssget "_X" (list (cons 0 (getvar "users1")) (cons 8 (getvar "users2"))));;
Первый запрос - тип примитива arc, line, text, insert и т.д. Второй запрос - слой.
При отсутствии примитивов, удовлетворяющих критериям поиска в командной строке будет напечатано nil, а сам набор Previous не изменится.
Системных переменных, которые могут воспринимать строковую информацию, немного. Всего пять. При следующем вызове макроса (нажатии кнопки) будет подсказка с последним введенным значением. Конечно, если какая то другая программа или макрос его не изменит!!! Есть смысл ввести свое закрепление каждой переменной за определенными данными, например, USERS1 - тип примитива, USERS2 - слой, USERS3 - текст.... Впрочем, это дело хозяйское, тоесть пользовательское. Потому переменные так и называются.


Если лень искать в хелпе - вот очень кратко о назначени DXF групп:

общие
0 - тип примитива
6 - тип линии (при ByLayer может отсутствовать)
8 - имя слоя
62 - цвет (при ByLayer может отсутствовать или = 256, при ByBlock = 0) - ЧИСЛО

для TEXT
40 - высота текста - ЧИСЛО
1 - собственно строка текста
7 - стиль текста (при Standard может отсутствовать)
72 и 73 - соответственно горизонтальное и вертикальное выравнивание - ЧИСЛО

для INSERT
2 - имя вставленного блока

Разумеется, ЧИСЛА нужно передавать через переменные USERI1...USERI5
vk вне форума  
 
Непрочитано 08.06.2004, 21:57
#17
Джек

Строительство
 
Регистрация: 03.09.2003
Нижний Новгород
Сообщений: 81
<phrase 1=


Суперрр! заработалоооо! Спасибо VK.

Vova привет! :wink:
Джек вне форума  
 
Непрочитано 08.06.2004, 22:11
#18
Psip!


 
Сообщений: n/a


Работает!!!!! Класс!
VK, СПАСИБО огромное!!!
Вот Ваш слегка поправленный макрос:

Код:
[Выделить все]
^P_.setvar;users1;\_.pselect;(ssget "_X" (list (cons 1 (getvar "users1"))));;
Именно то, что мне и нужно было!
 
 
Непрочитано 08.06.2004, 22:44
#19
Джек

Строительство
 
Регистрация: 03.09.2003
Нижний Новгород
Сообщений: 81
<phrase 1=


Psip! а у меня вот так получилось:

^P_.setvar;users2;\_.pselect;(ssget "_X"(list '(0 . "text") (cons 1 (getvar "users2"))));;

Удачи! Psip! :wink:
Джек вне форума  
 
Непрочитано 08.06.2004, 22:48
#20
Джек

Строительство
 
Регистрация: 03.09.2003
Нижний Новгород
Сообщений: 81
<phrase 1=


Psip! когда будешь проверять макрос будь осторожен! а то [sm2103]
Джек вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Небыстрый "Быстрый выбор" !

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

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