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

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

Изменение работы комманды SELECT FENCE

Ответ
Поиск в этой теме
Непрочитано 04.12.2003, 15:16 #1
Изменение работы комманды SELECT FENCE
Torino
 
Штаб
Регистрация: 21.08.2003
Сообщений: 943

Как сделать так, чтобы при запуске комманды "select fence" отключалась объектная привязка ('_osmode;0;), а при завершении выделения с помощью fence (либо, при нажатии escape) привязки возращались?
Просмотров: 15211
 
Непрочитано 04.12.2003, 21:31
#2
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Можно только с помощью AutoLISP. А не проще до и после нажать F3?
{Smirnoff} вне форума  
 
Непрочитано 04.12.2003, 22:52
#3
Perezz!!
Moderator

архитектор
 
Регистрация: 21.08.2003
Москва
Сообщений: 3,587


очередной вопрос из серии "как сделать так, чтобы ничего не делать, а всё делалось бы само?" или "как улучшить велосипед"... :wink:
Perezz!! вне форума  
 
Непрочитано 05.12.2003, 06:49
#4
Vova

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


Похоже, что Torino пишет макрос, это видно по знаку (точка с запятой). Очень часто на время действия какой-либо программы надо отключать режимы привязки. Режим, имевший место до начала команды, можно запомнить функцией LISP: (Setq os (getvar "osmode")). С нее и надо начинать макрос. Здесь "os" это свое (придуманное) имя текущего режима. Далее Osmode;0; В конце макроса надо восстановить режим: (setvar "osmode" os)
Vova вне форума  
 
Автор темы   Непрочитано 05.12.2003, 10:24
#5
Torino


 
Регистрация: 21.08.2003
Штаб
Сообщений: 943
<phrase 1=


2Vova:
да, спасибо, именно так, но вопрос немного в другом: куда вставить данные строки (имеется ввиду модифицирование кода встроенных команд акада. Конкретно SELECT).

2Perezz!!:
все мы стремимся к совершенству :wink:

2Fantomas:
нажать 2 раза ф3 - это сложнее, чем не нажимать ни разу, так?
Torino вне форума  
 
Непрочитано 05.12.2003, 14:57
#6
Vova

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


Модификация родных команд Автокада вряд ли возможна, да и зачем? Создание своих собственных кодов для решения конкретных задач (на LISP, DIESEL VBA и т д, я вот предлагаю макросы)-наиболее правильный путь.
Сообщи конкретно, какую команду ты хочешь создать.
Vova вне форума  
 
Непрочитано 05.12.2003, 15:09
#7
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Ну вот примерно так.
Код:
[Выделить все]
(defun c:fse (/ temp_osm)
  (setq temp_osm (getvar "osmode"))
  (setvar "osmode" 0)
  (command "_.select" "f" pause)
  (setvar "osmode" temp_osm)
  (princ)
  )
Единственное сдесь не включен обработчик выхода по Esc. Т. е. если вы прервете команду этой клавишей то все ваши привязки "слетят" и их придется выставлять снова. Если данное устраивает то допишу.

Сие сохранить в текстовом файле с расширением LSP. Поставить в автозагрузку Tools>AutoLisp>Load (а там Startup Suite). C клавы запускаеться FSE. Для кнопочки соответственно ^C^Cfse.
{Smirnoff} вне форума  
 
Автор темы   Непрочитано 05.12.2003, 18:28
#8
Torino


 
Регистрация: 21.08.2003
Штаб
Сообщений: 943
<phrase 1=


Fantomas, спасибо за код, но это не то. Проще два раза нажать ф3, чем тянуться мышкой до кнопки :)

Для Вовы: я не хочу создавать команду, я хочу дополнить переключатель FENCE команды SELECT следующими строчками:

(setq temp_osm (getvar "osmode"))
(setvar "osmode" 0)
..............
(setvar "osmode" temp_osm) //на выходе

(строчки взяты из программы Фантомаса :) )

Т.е. найти код, на который передается управление после ввода FENCE. Если он в ехе-шнике или арксе, то вопрос снимается, а если в лиспах, то тут можно покумекать.
Torino вне форума  
 
Непрочитано 05.12.2003, 19:36
#9
vk

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


>Torino
Почему так сразу "вопрос снимается"? Вроде бы Лиспом можно переопределить существующую команду. Различие кажись тока в вызове (без точки). Или я ошибаюсь?
vk вне форума  
 
Непрочитано 06.12.2003, 04:01
#10
Я Fantomas


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


>Torino
Зачем?
 
 
Непрочитано 06.12.2003, 13:05
#11
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


>Torino

Зачем ломать АКАД? Зачем тянуться до кнопки? Ну обзовите функцию не FSE а двумя буквами (надо конечно проверить чтобы не совпадали со стандартной командой) и набирайте в командной строке.

Вы объясните подробно свою задачу.
{Smirnoff} вне форума  
 
Автор темы   Непрочитано 06.12.2003, 20:39
#12
Torino


 
Регистрация: 21.08.2003
Штаб
Сообщений: 943
<phrase 1=


Объясняю с картинками: пример:
на представленном фрагменте мне необходимо наклонной линией обрезать короткие вертикальные линии.
Для этого логично выделять их с помощью fence.
Но т.к. apperture box больше расстояния между линиями, то происходит привязка в ненужные мне точки.
Я хочу сделать так, чтобы после набора на клавиатуре буквы "f" (в режиме выделения) объектная привязка автоматически отключалась.
[ATTACH]1070732395.gif[/ATTACH]
Torino вне форума  
 
Непрочитано 06.12.2003, 22:33
#13
Vova

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


Torino> Такую обрезку быстро сделает команда Extrim, если есть Express. А для автоматизации попробуй это:
^C^C_l;\\;_select;l;;_extrim;l;\_e;_p;;
Vova вне форума  
 
Непрочитано 06.12.2003, 22:59
#14
Vova

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


Sorry. невнимательно прочитал, что надо выборочно обрезать. Но все равно можно что-то придумать но в любом случае не ломать автокад.
Кстати, пришла в голову идея-конкурс на самую короткую программу решения этого вопроса. Чтобы за наименьшее количество щелчков все что нужно, обрезалось. Привязки бы не отключались (или возвращались) и мерилом результата было бы наименьшее количество знаков в программе. Torino поставит виртуальное пиво, а Perezz что-нибудь придумает по организации.
Vova вне форума  
 
Непрочитано 07.12.2003, 00:03
#15
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


>Torino

Не вижу картинку, пишет "Error on page". Попробуй ее еще раз воткнуть.
{Smirnoff} вне форума  
 
Непрочитано 07.12.2003, 00:07
#16
vk

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


Почему сразу "ломать автокад"?

Для этого есть вполне определенные и документированные средства: раздел "Redefining AutoCAD Commands" в хелпе предлагает соответствующие механизмы - (command "undefine" "line") например, позволит "забыть" родную команду LINE. Определяйте ее заново, как надо и используйте, вызывая без точки перед именем команды. А когда надо вернуть "как было", то достаточно (defun C:LINE () (command "_.LINE") (princ)) и все вернется на круги своя. Загляните еще в раздел "S::STARTUP Function—Post-Initialization Execution" - там рабочие примеры. Еще есть в запасе (vl-acad-undefun 'symbol), на крайний случай.

Вся сложность здесь заключается в том, как стопроцентно сэмулировать родную команду (отслеживать эту самую f) и вовремя отключить-включить привязку. На Лиспе это сделать (в первом приближении) возможно. Если нужна "прозрачная" команда, то такие обещает VLX с собственным именным пространством. А вот как отследить эту f Дизелем....
vk вне форума  
 
Автор темы   Непрочитано 08.12.2003, 11:27
#17
Torino


 
Регистрация: 21.08.2003
Штаб
Сообщений: 943
<phrase 1=


>> Torino поставит виртуальное пиво, а Perezz что-нибудь придумает по организации.

Ставлю не виртуальное, а реальное булькающее и пенящееся. Для тех, кто ЕГО не любит, ставлю прозрачную и холодненькую...

Для Фантомаса повторяю картинку
[ATTACH]1070872143.gif[/ATTACH]
Torino вне форума  
 
Непрочитано 08.12.2003, 12:07
#18
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Спасибо, картинку вижу. Сделаем.
Сегодня, не обещаю, работы привалило. Пусть пока Vova потренируеться.
{Smirnoff} вне форума  
 
Непрочитано 08.12.2003, 15:04
#19
Vova

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


Сегогня тоже не смогу: хозяева ведут сотрудников в ресторан по случаю пождества. Пусть пока Админ, Perezz и кто-нибудь из желающих станет станут жюри, назначат срок присылки программы. Поскольку я теоретически могу победить, так как умею похожие штуки делать только на макросе, я он короче по определению, то: либо мой знак считать за 3, либо отдельный конкурс среди макроведов. Но таких еще, наверное, нет, ведь книжку еще не прочли. А может, вне конкурса?
Vova вне форума  
 
Непрочитано 09.12.2003, 02:27
#20
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


>Torino
Ну вот, пока там все о выборах... Нашел пол часа и выдаю первый вариант. Вызываеться эта бяка из командной строки "ff", после чего отключает все привязки и просит указать границу "подрезки" (Select boundary), после чего просит провести линию через "подрезаемые" объекты (Draw fence line), после чего подрезает и включает привязки.

Написан обработчик выхода по Esc, т. е. можно прерывать в любом месте смело, привязки не слетят. Эта гадость и составляет основную массу кода.

Все это необходимо в скопировать в чистый файл в Notepad и обозвать файл с расширением LSP. После чего открыть Tools>AutoLISP>Load..., найти файл и загрузить Load. Для постоянного использования надо найти там же группу Startup Suit и внести файл в форму открывающуюся клавишей Contents...

Код:
[Выделить все]
(defun ff_store	(/)
  (setvar "cmdecho" 0)
  (setq old_osnap (getvar "osmode"))
  (setvar "osmode" 0)
  (princ)
)					;end ff_store

(defun ff_restore (/)
  (setvar "osmode" old_osnap)
  (setvar "cmdecho" 1)
  (princ)
)					;end ff_restore

(defun *error* (msg)
  (if
    (or
      (= msg "завершить / выйти прервать")
      (= msg "quit / exit abort")
    )					;end or
     (princ msg)
  ) ;_ end if
  (command "_.undo" "_end")
  (command "_.u")
  (ff_restore)
  (setq *error* olderror)
  (princ)
)					;end *error*

(defun c:ff (/ bound_obj)
  (setvar "cmdecho" 0)
  (command "_.undo" "_begin")
  (ff_store)
  (setq olderror *error*)
  (setq bound_obj (car (entsel "Select boundary ")))
  (terpri)
  (princ "Draw fence line ")
  (command "trim" bound_obj "")
  (command "f" pause pause "" "")
  (setq *error* olderror)
  (command "_.undo" "_end")
  (ff_restore)
  (princ)
)					;end ff
Пока есть один недостаток, бяка позволяет выбрать за раз один одну границу подрезки и одну линию для сечения подрезаемых объектов. Можно дописать, но спать хочеться.

>Vova На виртуальное пиво пока не претендую. Но есть сомнения, можно ли с помощью макросов вернуть системные переменные, если нажали Esc? Несилен в макросах. В прочем, я тут нашел, что вы книги по АКАД пишите. Обязательно почитаю, то что на ссылке, тем более что народ хвалит.
{Smirnoff} вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Изменение работы комманды SELECT FENCE

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