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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Спецы по DIESEL - помогите с макросом

Спецы по DIESEL - помогите с макросом

Ответ
Поиск в этой теме
Непрочитано 19.09.2005, 13:00 #1
Спецы по DIESEL - помогите с макросом
VetalBY
 
г. Минск
Регистрация: 16.05.2005
Сообщений: 276

Привет всем!
нужен макрос выполняющий следующие действия

1. Запоминаем текущий слой
2. устанавливаем слой с помощью комманды _ai_molc (выбор примитива)
3. далее комманда _dimcontinue
4. возвращаем слой, который запомнили в п. 1

п.3 должен работать так, чтобы был возможен ввод опций (например "_s"), а возможно и без опций...
Просмотров: 3806
 
Непрочитано 19.09.2005, 14:19 Re: Спецы по DIESEL - помогите с макросом
#2
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,260


Цитата:
Сообщение от VetalBY
...п.3 должен работать так, чтобы был возможен ввод опций (например "_s"), а возможно и без опций...
Ветвление интерфейса для макросов крайне затруднительно реализовать. В таких случаях лисп и проще и гибче.
Pilot вне форума  
 
Автор темы   Непрочитано 19.09.2005, 16:03
#3
VetalBY


 
Регистрация: 16.05.2005
г. Минск
Сообщений: 276


Пусть будет лисп
Код:
[Выделить все]
(defun my_error_func (msg)
  (end_MyFunc)
)

(defun end_MyFunc ()
  (setvar "CLAYER" MyPrevLay)
  (setq *error* old_er_func)
)


(defun MyFunc ( / flag)

   (setq MyPrevLay (getvar "CLAYER"))
   (setq old_er_func *error*
	 *error* my_error_func)
   (setvar "CLAYER" "Dimensions")
   (command "dimcontinue")
   (while T
    (command pause)
   )

  (end_MyFunc)
  (princ)
)
Так все вроде работает, но из такой функции можно выйти только по ESC и (end_MyFunc) после while не выполнится никогда.
Можно ли сделать иначе, чтобы и при нормальном завершении комманды dimcontinue (выйти из цикла) слой восстанавливался?
VetalBY вне форума  
 
Непрочитано 19.09.2005, 16:13
#4
Кулик Алексей aka kpblc
Moderator

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


Замени (while T (command pause)) на команду (while (/= (getvar "cmdactive") 0) (command pause)).
Есть несколько тонкостей имхо:
1. Слой Dimentions уже должен существовать. А если его нет, прога вылетит. Не гуд.
2. Слой активировали, сделали, а переменную не обнулили - болтаться в памяти будет. Рано или поздно обязательно будет ситуация, когда к этому имени будешь обращаться. Проблемы будет очень тяжело локализовать.
3. Сугубо ИМХО: надо по идее отключать слои, на которых не лежит данный объект (правда, что будет при попытке образмерить блок или xref, не очень ясно).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 19.09.2005, 16:13
#5
VetalBY


 
Регистрация: 16.05.2005
г. Минск
Сообщений: 276


похоже можно вот так
Код:
[Выделить все]
(defun MyFunc ( / flag)

   (setq MyPrevLay (getvar "CLAYER"))
   (setq old_er_func *error*
	 *error* my_error_func
	 flag T)
   (setvar "CLAYER" "Dimensions")
   (command "dimcontinue")
   (while flag
    (command pause)
    (if (/= (strcase (getvar "CMDNAMES")) "DIMCONTINUE") (setq flag nil)) 
   )

  (end_MyFunc)
)
:shock:
VetalBY вне форума  
 
Автор темы   Непрочитано 19.09.2005, 16:16
#6
VetalBY


 
Регистрация: 16.05.2005
г. Минск
Сообщений: 276


(while (/= (getvar "cmdactive") 0) (command pause))

еще имхо и лучше, спасибо
VetalBY вне форума  
 
Автор темы   Непрочитано 19.09.2005, 16:25
#7
VetalBY


 
Регистрация: 16.05.2005
г. Минск
Сообщений: 276


Цитата:
Сообщение от kpblc
Есть несколько тонкостей имхо:
1. Слой Dimentions уже должен существовать. А если его нет, прога вылетит. Не гуд.
2. Слой активировали, сделали, а переменную не обнулили - болтаться в памяти будет. Рано или поздно обязательно будет ситуация, когда к этому имени будешь обращаться. Проблемы будет очень тяжело локализовать.
3. Сугубо ИМХО: надо по идее отключать слои, на которых не лежит данный объект (правда, что будет при попытке образмерить блок или xref, не очень ясно).
слой Dimentions - для примера, реально код немножко другой и слой "приходит" из функции и он есть 100%
по п. 2: переменным можно дать уникальные имена, а потом присвоить nil (имхо)
не понял п. 3, зачем отключать слои?
VetalBY вне форума  
 
Непрочитано 19.09.2005, 17:07
#8
Кулик Алексей aka kpblc
Moderator

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


Это все ИМХО, ИМХО...
На самом деле мне просто не дает покоя система, которую тут как-то рассказывал maxw - кликаешь на объекте со слоем, например, "КМ-Колонны", а размеры для него будут на слое "КМ-Колонны-Размеры". И чтобы не пытаться привязать размеры, например, к ЖБИ, слой надо отключить и потом вернуть все на место. Это по поводу п.3.
Просто меня maxw убедил в конце концов, что такая система наиболее жизнеспособна - при работе через viewport'ы можно без особых напрягов отключать ненужные слои ненужных в данный момент конструкций (опять-таки лиспом реализовать достаточно просто - клик на объекте, выбирается слой объекта и слой его размеров, в данном ВЭ для него установить группу 70 не 0 и вперед). Остальное - на месте. В общем-то, конечно, по вкусу. Свой вариант лиспа еще не оттестировал, так что выложить не могу
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Спецы по DIESEL - помогите с макросом

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

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