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

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

странно работает Change

Ответ
Поиск в этой теме
Непрочитано 21.08.2007, 09:33 #1
странно работает Change
Makswell
 
Инженер-строитель
 
Киров
Регистрация: 15.08.2007
Сообщений: 2,204

На создание маскировки на слое был сделан макрос:
Код:
[Выделить все]
^C^C(defun C:M-Command() (vl-cmdf "_.wipeout") (while (not (zerop (getvar "cmdactive"))) (vl-cmdf pause)) (vl-cmdf "_.Change" "_Last" "" "_P" "_la" "Штриховка" "") (princ));M-Command;
Но иногда команда _.Change почему-то выбирала не только что нарисованный wipeout, а совсем другой объект. Соответсвенно маскировка оставалась на текущем слое а некий объект отправлялся на слой "Штриховка".

Макрос был переделан на такой:
Код:
[Выделить все]
C^C(defun C:M-Command() (setq OldLayer (getvar "CLayer")) (setvar "Clayer" "Штриховка") (vl-cmdf "_.wipeout") (while (not (zerop (getvar "cmdactive"))) (vl-cmdf pause)) (setvar "Clayer" OldLayer) (princ));M-Command;
И теперь все работает нормально.

Но все равно остался вопрос: почему так странно работает Change. Осталось ощущение, что в команде наблюдается глюк и её дальнейшее применение нежелательно...
Просмотров: 3151
 
Непрочитано 21.08.2007, 09:56
#2
shnn

Инженер
 
Регистрация: 18.02.2005
Самара
Сообщений: 747


Сам не пишу макросы но думаю что все дело в ключе _Last. Обрабатывается не последний нарисованый объект, а последний объект с которым работали, например перемещали.
shnn вне форума  
 
Автор темы   Непрочитано 21.08.2007, 10:03
#3
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Но по логике если объект только что нарисован, то он и есть последний объект с которым работали
Makswell вне форума  
 
Непрочитано 21.08.2007, 10:42
#4
KSI


 
Регистрация: 19.03.2004
Калининград
Сообщений: 1,842


Last - это последний примитив в базе чертежа. Но насколько я понимаю, это может быть и не последний нарисованный объект. Все зависит от ID примитива.
Может я и не прав.
KSI вне форума  
 
Автор темы   Непрочитано 21.08.2007, 11:49
#5
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


А что у всех change работает как надо? Это только у меня в компе какой-то шайтан?
Просто когда-то макрос и книги В.Света:
Код:
[Выделить все]
^C^C_-Layer;_new;Text;_Color;2;Text;;_Mtext;\_Just;_Ml;_Change;_last;;_Properties;_Layer;Text;;	[12-11]
мною был переделан на макрос для простановки размеров на слое:
Код:
[Выделить все]
^C^C(defun C:M-Command() (vl-cmdf "_.dimlinear" pause pause pause "_.Change" "_Last" "" "_P" "_la" "Размеры" "") (princ));M-Command;
и наблюдался аналогичный глюк (правда это происходило значительно реже чем в ситуации с wipeout)
Makswell вне форума  
 
Непрочитано 21.08.2007, 12:05
#6
shnn

Инженер
 
Регистрация: 18.02.2005
Самара
Сообщений: 747


По поводу _last не могу сказать, но заметил другую странность. Вы макрос записываете на лиспе. Почему не макрокомандами, как в книге В.Света? а еще по моему конструкция
Цитата:
(defun C:M-Command()
подразумевает вызов команды из командной строки, а у вас две абсолютно разные команды вызываются одной функцией M-Command
shnn вне форума  
 
Непрочитано 21.08.2007, 12:10
#7
Кулик Алексей aka kpblc
Moderator

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


Это вполне допускается.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 21.08.2007, 13:39
#8
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Функция , а точнее команда C:M-Command каждый раз переопеделяется (идея взята у уважемого Сергея Зуева - у него также каждый раз переопределяется C:RU) - чтобы не париться с названиями команд.
А лисп используется из-за конструкции
Код:
[Выделить все]
(while (not (zerop (getvar "cmdactive"))) (vl-cmdf pause))
т.к. у wipeout может быть разное количество углов, которое заранее неизвестно. Т.е. если использовать например:
Код:
[Выделить все]
^C^C_.wipeout;\\\\_.Change;_Last;;_P;_la;"Штриховка"
то такое будет корректно работать только с с четырехугольной маскировкой, в остальных случаях - облом
Makswell вне форума  
 
Автор темы   Непрочитано 21.08.2007, 16:47
#9
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Я понял!
Вообще то топик назван неверно, change работает как надо, т.е. всё меняет. Выбирает _.select.
Макрос
Код:
[Выделить все]
^C^C(defun C:M-Command() (vl-cmdf "_.wipeout") (while (not (zerop (getvar "cmdactive"))) (vl-cmdf pause)) (vl-cmdf "_.Select" "_Last" "" "_.Change" "_P" "" "_P" "_la" "Штриховка" "") (princ));M-Command;
делает то же самое.
Если рамки маскировки не отображаются, то командой _.select она не выбирается, а соответсвенно выбирается другой примитив. Я же постоянно то включаю, то выключаю эти рамки, да еще и в некоторых ВЭ это всё не успевает регененрироваться, поэтому такая путаница.
А насчет макроса для простановки размеров на слое - давно это было, уже не вспомнить какие там могли быть причины...

Вывод: "Осталось ощущение, что в команде наблюдается глюк и её дальнейшее применение нежелательно..." - только это уже про _.Select
Makswell вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > странно работает Change