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

Вернуться   Форум 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) привязки возращались?
Просмотров: 15402
 
Непрочитано 04.12.2003, 21:31
#2
{Smirnoff}

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


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

архитектор
 
Регистрация: 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} вне форума  
 
Непрочитано 09.12.2003, 02:41
#21
{Smirnoff}

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


> Torino
Извините одну бяку нашел, которую не поймет русский АКАД. Впрочем у вас кажеться английский, но все равно, чтобы работало и там и там:

(command "trim" bound_obj "")
заменить на
(command "_.trim" bound_obj "") то есть _. добавить

а

(command "f" pause pause "" "") на
(command "_f" pause pause "" "") соответственно _ добавить.

Когда "под себя" пишешь, не всегда задумываешся, что есть он где то русский АКАД.
{Smirnoff} вне форума  
 
Автор темы   Непрочитано 09.12.2003, 11:56
#22
Torino


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


2Fantomas:
Прога работает отлично! (интересно в Ригу и Нью-Йорк пиво наложенным платежом можно отправить?)

НО:
это программа, т.е. ее нужно специально вызывать, а жюри (в моем лице) задачу ставит несколько иначе: перехват, переопределение (простите дилетанта в этом вопросе) встроенной команды SELECT. Давайте поработаем в этом направлении.


[ATTACH]1070960292.gif[/ATTACH]
Torino вне форума  
 
Непрочитано 09.12.2003, 13:42
#23
{Smirnoff}

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


>Torino

Хорошо, подумаем. Для чего торчу на форуме? Да потому что другие ставят такие задачи, до которых сам бы никогда не додумался. Их решение сильно развивает.

Основная проблемма вот в чем. Опять про Esc. Выключить привязки, насколько мне известно можно только сбросом переменной OSMODE в 0. Далее следует команда FENCE которую можно прервать в любой момент известным способом. Как восстановить старые привязки? Возможно способ есть. Но с ходу, ничего сказать не могу. Ну допустим переопределили мы "f" и выключили привязки и нормально закончили команду, а если нет? Интересно послушать остальных участников форума.

У меня другая идеология. 1) АКАД сильно не ломать 2) для решения задач писать функции на ЛИСПЕ или на VBA который начал изучать.

Пока уйду на паузу и откажусь от пива. Единственное на днях прогу досовершенствую в следующих направлениях 1) возможность выбирать несколько границ подрезки 2) возможность делать ломаную линию FENCE и как идеал 3) возможность разрывать FENCE линию, тогда можно будет подрезать все за 1 раз, ну или за 2.

Возможно "овчинка не стоит выделки", но столкнулся с некоторыми проблеммами, которые могу решить, но большим количеством кода, а хочу маленьким. Так что в общем то из собственного интереса.
Как что нибудь накарябаю, выйду на связь.

>Vova

Наверное вы правы, не стоит устраивать соревнование, тем более на краткость кода. Если бы ЛИСП-ЛИСП или МАКРОС-МАКРОС тогда другое дело. А в ЛИСПЕ не имеет практического смысла сокращать понятный код, можно написать программу из одного выражения и практически (за редким случаем) без переменных. Только потом сам программист, уже не поймет что написал пару месяцев назад. Другое дело реализовать другой алгоритм. А сокращения ни к чему, чем понятнее тем лучше.
{Smirnoff} вне форума  
 
Непрочитано 09.12.2003, 15:06
#24
vk

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


Посмотрел еще раз на картинку... набросал отрезков.... и возникла мысль (если конечно я правильно понял, каким должен быть конечный результат). Способ простейший, не имеющий никакого отношения к программированию, потому на участие в конкурсе не претендую. Значит, нужно обрезать только короткие линии. Для этого длинные перенесем в другой слой, который заблокируем (заморозим, отключим - дело вкуса). После этого можно вызывать TRIM c опцией F, и выбирать сразу ВСЕ отрезки, указывая точки на достаточном удалении от них. Те, что на заблокированном слое, останутся целыми. Потом вернуть длинные отрезки куда надо (если надо), например, объединив слои. Впрочем, отключение привязки здесь совсем ни при чем.
Имхо, это проще, чем писать макрос. Во всяком случае, результат несколько более близок.
vk вне форума  
 
Автор темы   Непрочитано 09.12.2003, 15:28
#25
Torino


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


Действительно, это метод, который приведет к нужному результату (а в случае большого количества отрезков быстрее любых других методов), но если мы сейчас поймем, как можно решить, поставленную мной проблему, то откроется такое поле деятельности, даже подумать страшно. (прям как в великом эксперименте )
Torino вне форума  
 
Непрочитано 09.12.2003, 16:24
#26
{Smirnoff}

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


>VK
Вот сдесь то, как раз программирование. Выбрать отрезки по длинне, и вообще по любым признакам програмно, плевое дело. А тем более поуправлять слоями. И все это одной командой.
{Smirnoff} вне форума  
 
Непрочитано 09.12.2003, 22:29
#27
vk

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


>Fantomas
Написать такую прораммульку не сложно. Но! Она будет привязана к конкретному заданию или работе. Если такие действия нужно выполнять по многу раз в день с однотипными наборами объектов, то конечно. А вот универсальности здесь скорее всего не получится.

>Torino
Не так уж страшно Переписать стандартную команду TRIM или любую другую на свой манер, привыкнуть к ней.... и попасть на машину, где эта команда не переопределена.... Неуютно, как то...
vk вне форума  
 
Автор темы   Непрочитано 09.12.2003, 23:13
#28
Torino


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


Здесь уже придется выбирать: либо чертить, получая удовольствие (не подумайте ничего плохого - я про удобство работы), а при переходе на новую машину потратить день на настройку Акада, либо пользоваться стандартными средствами, предоставляемыми Акадом, но переезд при этом будет быстрый.
Torino вне форума  
 
Непрочитано 10.12.2003, 04:27
#29
Vova

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


Torino> Сделай кнопку с этим макросом:
^C^C_-G;E;ZZ;^C_-G;;ZZ;;F;\\;;_M;_G;ZZ;;0,0;10000,0;_L;\\;_EXTRIM;_L;\E;_L;;_M;_G;ZZ;;10000,0;0,0;_-G;_E;ZZ
На запрос First fence point выделяешь 2-мя щелчками все длинные, причем не обязательно их касаться. Длинные исчезнут. Затем на запрос Line проводишь секущий отрезок для коротких и щелкаешь в сторону обрезки в любом месте. При этом короткие обрежутся, режущая кромка исчезнет а длинные вернуться. Итого 5 щелчков. Можно, наверное и за 4. Не работает, если нет Express
В этом макросе я убираю длинные, но не в другой слой, а в ... Кто догадается, куда они делись? я этот прием использую в практическом ручном (не программном) черчении.
Fantomas> От слетания привязок я использую другое лекарство, имею кнопку osmode;695 Об этом я здесь говорил. Расскажи в двух словах (в разделе Разное) как живут русские и коренные в Латвии, отказались ли от затеи отобрать у Пскова Абрене, работает ли промышленность, куда ходят в сложные водные и лыжные походы (раньше неплохо ходили, мастера спорта были) и т д. Paldies
Vova вне форума  
 
Автор темы   Непрочитано 10.12.2003, 11:22
#30
Torino


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


Хитро и кратко!

Небольшя доработка: если длина чертежа превышает 10000 по оси Х, то передвинутые отрезки могут мешать работе (особенно если работа ведется 1:1 и на линейных сооружениях), поэтому двигать их надо не на 10000, а на величину, превышающую пределы чертежа.
Я не знаю какая для этого служит переменная, но, думаю, такая есть. В макросе извлекать ее значение и подставлять в команду MOVE.

Не сочти меня занудой, но это опять не переопределение команды SELECT (т.е. применение этого макроса возможно конкретно в этой ситуации) :wink:
Torino вне форума  
 
Непрочитано 10.12.2003, 14:42
#31
Vova

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


Как переопределить
существующую команду, я не знаю и такая нужда не возникала. Возмoжно, ближе всех к этому подошел VK, через Undefine. Поэтому вопрос к VK: знаешь ли для чего этим пользуются? Можешь ли рассказать технику этого процесса? Мой макрос демонстрирует здесь следующее: Представьте, вы идете по дороге, а на пути телеграфный столб. Что делать? Макросоведам приходится изворачиваться там, где Лисповик еще может перелезть через такой столб. Вот, здесь удалось этот столб обойти. Средства Menu macros безусловно бедней, чем стредства ЛИСПа, но понять, принципы его работы и научится составлять макросы, безусловно легче, чем ЛИСПы. Лисповики, конечно, тоже изворачиваются, это ведь программирование. А создание макросов заставит читателей моей книги, если они не находят в себе силы изучить ЛИСП, жить этим процессом (изворачиванием) и облегчать свое черчение.
Vova вне форума  
 
Непрочитано 10.12.2003, 17:32
#32
{Smirnoff}

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


>Vova Про жизнь в Латвии обязательно напишу. Насчет выбора ЛИСП-МАКРОС, безусловно макросы штука хорошая, но когда ставишь перед собой определенные задачи, то в них становиться тесновато, вот я уже и до VBA добрался. В АКАДе не одна системная переменная, и делать на каждую кнопку... Короче, книжку вашу обязательно куплю, хотя бы из уважения. Но чувствовать себя комфортно буду только в ЛИСПЕ, люблю я его и даже VBA по нужде, нужен многодокументный режим, красивые диалоговые окна и связь с базами данных. Я в КАДе работаю то всего годик, а на ЛИСП пишу пол года, развиваться еще долго надо.

> Torino Ну короче, написал я как хотел. Сначала можно выбрать любое количество границ, потом правым кликом переключиться на fence и рисовать их сколько угодно, причем разрывая (т. е. обходить столбы). Единственное появился небольшой глюк с обработчиком ошибок, исправлю выставлю. Сейчас код что-то не идет, с женой поругался и работы привалило... Одно успокаивает, работу свою я могу выполнить, несколько быстрее других, особо это не офишируя.

Инструмент кстати получился хороший (еще не получился), пользуюсь сам.
{Smirnoff} вне форума  
 
Непрочитано 12.12.2003, 07:32
#33
vk

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


>Vova
Сам такими вещами натурально не пользовался, нужды не возникало. Только лишь в свое время, при изучении, набросал несколько примерчиков, убедился, что работает. Принял к сведению, как говорится.
По данной задаче. Чтоб сделать таким образом то, что хочет Torino, придется переопределить не только команду TRIM, но также скорее всего сделать аналог SELECT, причем, без использования функции (ssget). Дело в том, что команды АКАДа пользуются естествено своими родными функциями и командами, которые вызываются как бы "с точкой". Поэтому, переопределив только SELECT, мы не получим новый вид TRIM. К сожалению.
Есть у кого желание переписать команды АКАДа заново?
vk вне форума  
 
Непрочитано 13.12.2003, 02:29
#34
{Smirnoff}

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


>Torino
Ну вот и обещаная функция подоспела. Что то пару дней код в голову не лез... Теперь можно выбирать сколько угодно границ "подрезки" и переключаясь правым кликом, рисовать сколько угодно секущих линий "обходя столбы". Я так понял что вы преследовали более "глобальные" цели и возможно функция не сильно нужна. Ну уж обещал, так обещал...

Вообще, рекомендую обратить внимание. Неплохая штучка получилась, я ей провода режу. Возможно и что-то другое можно резать. Вжик и пол дома нету или парахода .
Код:
[Выделить все]
(defun ff_store	(/)
  (setq old_osnap (getvar "osmode"))
  (setvar "osmode" 0)
  (princ)
)					;end ff_store 

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

(defun *error* (msg)
  (princ msg)
  (command "_.undo" "_end")
  (command "_.u")
  (ff_restore)
  (setq *error* olderror)
  (princ)
)					;end *error* 


(defun c:ff (/ bound_set neverend)
  (setvar "cmdecho" 0)
  (command "_.undo" "_begin")
  (ff_store)
  (setq olderror *error*)
  (setq bound_set (ssget "_:E"))
  (while (not neverend)
    (terpri)
    (princ "Draw Fence Line: ")
    (command "_.trim" bound_set "")
    (command "_f" pause pause "" "")
  )					;end while
  (setq *error* olderror)
  (command "_.undo" "_end")
  (ff_restore)
  (princ)
)					;end ff
Запускаеться по прежнему FF, для кнопки соответственно ^C^Cff. Содержимым оного НАДПИСАТЬ код в файле, где был старый вариант.
{Smirnoff} вне форума  
 
Непрочитано 14.12.2003, 16:58
#35
{Smirnoff}

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


Прошу прощения не тот листинг загрузил. Вот этот правильный.
Код:
[Выделить все]
(defun ff_store	(/)
  (setq old_osnap (getvar "osmode"))
  (setvar "osmode" 0)
  (princ)
)					;end ff_store 

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

(defun *error* (msg)
  (princ "End of Fence Trim ")
  (command "_.undo" "_end")
  (ff_restore)
  (setq *error* olderror)
  (princ)
)					;end *error*



(defun c:ff (/ bound_set neverend)
  (setvar "cmdecho" 0)
  (command "_.undo" "_begin")
  (ff_store)
  (setq olderror *error*)
  (setq bound_set (ssget "_:E"))
  (while(not neverend)
    (terpri)
    (princ "Draw Fence Line or Press [Esc] to Exit: ")
    (command "_.trim" bound_set "")
    (command "_f" pause pause "" "")
  )					;end while
  (setq *error* olderror)
  (command "_.undo" "_end")
  (ff_restore)
  (princ)
)					;end ff
{Smirnoff} вне форума  
 
Непрочитано 14.12.2003, 17:50
#36
vk

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


>Fantomas
Раз пошла такая пьянка.... можно проще
(defun
....
(while t
.....
);end while
);end defun
После while прога все равно _никогда_ не будет выполняться.
vk вне форума  
 
Непрочитано 15.12.2003, 01:22
#37
{Smirnoff}

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


Согласен, теперь самому смешно . Это остаток конструкции для "нормального" выхода. Что то типа:
(setq stop nil)
(setq fpt1 '(0.0 0.0 0.0)
ftp2 '(0.0 0.0 0.0));end setq
(while (/= stop T)
(terpri)
(princ "Draw Fence Line or Right Click to Exit: ")
(command "_.trim" bound_set "")
(command "_f" (if (/= nil (setq fpt1(getpoint)))
fpt1
(progn
(setq stop T)
(setq ftp1 ftp1)
(print fpt1)
);end progn
);end if

(if (/= nil (setq fpt2(getpoint)))
fpt2
(progn
(setq stop T)
(setq ftp2 ftp1)
(print fpt2)
);end progn
);end if
"" "")
);End while ;end while

Но в этом случае "в динамике" не видна секущая линия. Не комфортно это. Сделал выход через *error*, хотя самому не очень нравиться, зато все видно. Пытался также отрисовывать "фальшивую" секущую функцией "_.line" и считывать начало и конец через ASSOC, но в этом случае в каждом цикле в каждом цикле "мерцают" границы подрезки (command "_.trim" bound_set ""). Можно даже вставить отрисовку линии, между (command "_.trim" bound_set "") и (command "_f"....). На удивление работает, только при Esc: ; error: An error has occurred inside the *error* function Function cancelled.

Короче, надо еще подумать. Писать "под себя" и "под пользователя" разные вещи, ему в общем то пофигу какой там код, главное чтобы работало красиво. Спасибо, собственная невнимательнсть часто создает мне проблеммы.

>Torino Оно работет. Просто с точки зрения программера, я написал 3 строчки, которые никогда_нибудут_работать. Бог видит, я старался...
{Smirnoff} вне форума  
 
Непрочитано 15.12.2003, 01:24
#38
{Smirnoff}

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


>VK (print fpt1)- это для тестирования вставлено.
{Smirnoff} вне форума  
 
Автор темы   Непрочитано 15.12.2003, 12:20
#39
Torino


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


Цитата:
Сообщение от Fantomas
Писать "под себя" и "под пользователя" разные вещи, ему в общем то пофигу какой там код, главное чтобы работало красиво.
Смотря какой пользователь. Я, как бывший Си-программист, люблю и понимаю красивое программирование.

Ну что ж...
Всем большое спасибо за подробное обсуждение моего вопроса.
Если что - заходите в гости
Torino вне форума  
 
Непрочитано 15.12.2003, 13:44
#40
vk

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


Полностью согласен с Torino! Код программы должен быть красивым. Кстати, функция IF будет выполнять первое выражение, если условие не равно nil, поэтому (if (/= nil (setq fpt1.... абсолютно без какого либо ущерба плющится до (if (setq fpt1.... А (setq ftp1 ftp1) до ftp1.
Ничего плохого в выходе через *error* не вижу, если сделать все корректно. Некоторые команды АКАДа позволяют завершение только через Esc, да и для стандартного оператора зацикливания "кнопочных" макросов * (звездочка) это единственный выход.
А вобще (имхо), главными в любой проге должны быть две вещи:
1. чтоб работать было _удобно_ !!!
2. чтоб программа _всегда_ работала правильно, независимо от наиглупейших действий пользователя (в последнем случае корректно завершиться и вернуться к исходному состоянию, как будто команда и не вызывалась)
vk вне форума  
 
Непрочитано 16.12.2003, 11:14
#41
{Smirnoff}

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


>VK
Спасибо. Критика мне просто необходима. C моим стажем программирования, (неполные пол года) надо еще много работать.
{Smirnoff} вне форума  
 
Непрочитано 18.02.2008, 13:53 Макрос
#42
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


Подниму старую тему.
Возможно проблема уже обсуждалась и в других темах, но я нашел только эту.

Задача такая: нужно отследить кнопку привязки, и всё это отобразить в макросе
Код:
[Выделить все]
^C^С_line;\@0,-5;;;@2.5,0;@-5,0;;;@1,-1;@3,0;;;@-1,-1;@-1,0;;
Такой макрос не подходит:
Код:
[Выделить все]
^C^C^F_line;\@0,-5;;;@2.5,0;@-5,0;;;@1,-1;@3,0;;;@-1,-1;@-1,0;;^F
т.к. неизвестно заранее включена ли привязка. + ещё надо "запомнить" что было включено в привязке и потом восстановить после выполнения макроса. По приведенным кодам не нашел то, что мне подходит (Lisp не знаю). Для чего такой моразм? Для того чтобы каждому из моего отдела не обьяснять почему у него получилась линия или буква "Т" перевернутая вместо знака "земля" (при очень высоком виде привязка накладывает все лини друг на друга).
Отвечу и на возможный вопрос: почему не блоком?
Вот хочу чтоб было так! да и блоки у нас не очень уважают... по сути выполняю каприз заказчика.
Есть ли возможность решить все макросом или дизелем. Или только Lisp?
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Непрочитано 18.02.2008, 13:57
#43
Кулик Алексей aka kpblc
Moderator

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


osmode играйся
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 18.02.2008, 14:30
#44
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
osmode играйся
Ну и как отследить то?
Допустим отключил, выполнил отрисовку элемента, а потом пытаюсь включить - а какое было предыдущее до 0 состояние???
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Непрочитано 18.02.2008, 14:40
#45
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Сравни значение OSMODE при включенной и отключенной привязке
Код:
[Выделить все]
;;;================================================================================
;;;Функция отключения режима объектной привязки
(defun disable_osmode ()
  ;;Alaspher
  ;;(setvar "osmode" (logior oldosm 16384))
  (if (and (< (getvar "OSMODE") 16000)
    (/= (getvar "OSMODE") 0)
    )
   (setvar "OSMODE" (+ (getvar "OSMODE") 16384))
 ))
;;;================================================================================
;;;Функция включения режима объектной привязки
(defun enable_osmode ()
  (if (> (getvar "OSMODE") 16000)
    (setvar "OSMODE" (- (getvar "OSMODE") 16384))
  ) ;_if
) ;_ End of defun
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 18.02.2008, 14:51
#46
Александр Ривилис

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


Цитата:
Сообщение от Shoorup Посмотреть сообщение
Есть ли возможность решить все макросом или дизелем. Или только Lisp?
В данном конкретном случае в макросе достаточно перед каждым вводом координат вставить _none; и не заморачиватся с включением/выключением привязки.
Александр Ривилис вне форума  
 
Непрочитано 18.02.2008, 15:10
#47
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


Александр Ривилис, Спасибо! Отличное решение!
VVA, за код спасибо тоже пригодиться.
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Непрочитано 21.04.2014, 08:20
#48
Александр К.

Инженер-программист
 
Регистрация: 17.02.2009
Сообщений: 86


{Smirnoff}, спасибо за алгоритм построения обработчика выхода по ESC и правой кнопки мыши. Понадобился - здесь нашел.

----- добавлено через ~1 ч. -----
Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
В данном конкретном случае в макросе достаточно перед каждым вводом координат вставить _none; и не заморачиватся с включением/выключением привязки.
Александр Ривилис, тоже спасибо за решение! Попутно вопрос: где берете такие решения?? Где описаны? *Ни в описании команд, ни в книгах Полещука такого приема не встречал..

Последний раз редактировалось Александр К., 21.04.2014 в 09:50.
Александр К. вне форума  
 
Непрочитано 21.04.2014, 13:58
#49
skkkk


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


Offtop: {Smirnoff}, он же в прошлом Fantomas, к сожалению, уже почти восемь лет, как не заходил на форум...
skkkk вне форума  
 
Непрочитано 21.04.2014, 14:02
#50
Александр К.

Инженер-программист
 
Регистрация: 17.02.2009
Сообщений: 86


Цитата:
Сообщение от skkkk Посмотреть сообщение
Offtop: {Smirnoff}, он же в прошлом Fantomas, к сожалению, уже почти восемь лет, как не заходил на форум...
Offtop: Ну ему то только благодарность. Хоть и 8 лет его не слышно, а до сих пор пользу приносит. Может икнет там где-нибудь..

А вот от Александра Ривилиса хотел бы услышать ответ.
Александр К. вне форума  
 
Непрочитано 22.04.2014, 14:07
#51
Александр Ривилис

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


Цитата:
Сообщение от Александр К. Посмотреть сообщение
Попутно вопрос: где берете такие решения??
Из опыта работы с AutoCAD (а точнее программирования для него). В это году как раз 25 лет будет...
Александр Ривилис вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Изменение работы комманды SELECT FENCE