Тема: Дизель не заводится от кнопки.

Точнее кнопка от дизеля :)
В одной из панелей инструментов создал кнопку.
Вот ее описание:
[_Button("Orthomode", "$(if,$(=,$(getvar,orthomode),1),pic1.bmp,pic2.bmp)")]^C^C(выражение на лиспе)
Здесь я хотел, чтобы одна и та же кнопка имела различный вид (pic1.bmp и pic2.bmp) в зависимости от значения переменной orthomode.
Но кнопка вообще не появляется на панели.
Или я неверно написал выражение на DIESEL или выражения на нем не работают в панелях инструментов.
Подскажите плиз.
Зы. Вопрос задаю именно в этом разделе конфы, ибо DIESEL наиболее близок именно к Alisp.

Re: Дизель не заводится от кнопки.

> Pilot
Похоже, что для кнопок DIESEL действительно не работает. Точнее работает, но если подставлять DIESEL-выражения в сам макрос, а не в описание кнопки.
Если очень надо, можно написать реактор на изменение ORTHOMODE. И там в зависимости от значения ORTHOMODE подсовывать разные кнопки. Но т.к. ORTHOMODE сохраняется в чертеже и в каждом чертеже может быть разная, то надо еще писать реактор на активизацию чертежа. А так же проверять значение ORTHOMODE при каждом открытии (создании) нового чертежа.
Стоит ли овчинка выделки, решай сам.

Re: Дизель не заводится от кнопки.

В свойствах кнопки Properties обнаружилось следующее Macro associated with this button:
$M=$(if,$(and,$(getvar,opmstate),1),^C^C_propertiesclose,^C^C_properties)(пробел)
Может, необходимо $M=...?

Re: Дизель не заводится от кнопки.

> VH
Это-то работать будет, но это уже дизель в макросе, сама кнопка таким образом менятся не хочет, и $M=... тоже не поможет. По идее применительно к > Pilot (2003-07-02 10:24:19) надо было бы писать что-то типа:
[_Button("Orthomode", $(if,$(=,$(getvar,orthomode),1),$(eval, "pic1.bmp"),$(eval, "pic2.bmp")))]^C^C(выражение на лиспе)
Но это почему-то не работает.

Re: Дизель не заводится от кнопки.

C $M= я тоже пробовал.
Настораживает то, что во всех хэлпах и руководствах по дизелю ни слова не сказано про то, что я хочу. Подозреваю, что действительно это сделать невозможно.
Тут еще на одной конфе высказалось предположение, что тулбары компилируются вместе с меню и вроде того что дизель-выражения в описании кнопок при компиляции то-ли игнорируются, то-ли просто не работают. Скорее всего игнорируются, т.к. я в результате вообще никакой кнопки не получил.

Re: Дизель не заводится от кнопки.

Иконки к кнопкам привязываются при компиляции файла меню и хранятся в фаиле *.mnr. Поэтому так просто не получится. Если перекомпилировать меню заново с новыми иконками... но это слишком сложно...
Еще мысль - два меню - по одному для каждого из значений и перезагружать их реактором как было описано в leha (2003-07-07 16:40:33), но надо дополнительно проследить, чтобы панельки "не разбежались" по разным углам.

Re: Дизель не заводится от кнопки.

> Pilot
Это не предположение, а факт.
Повторяю свое мнение из другой конфы....
1. Интерактивную замену кнопок в панелях сделать нельзя, потому-что меню компилируется и отображение кнопок команд жестко прописано в файле acad.mnr.
2. Есть несколько вариантов решения этой задачи, но отвечу несколько позже. Уезжаю на строительный объект.....

Re: Дизель не заводится от кнопки.

> VK

> ABoltrushko
Кнопки менять можно через ActiveX. И уж если использовать реактор, то два файла меню точно не нужно. Например, есть группа меню "MyMenuGroup", в которой есть панелька "MyToolbar", в которой есть кнопка "MyButton":

      (if (and
        (not (vl-catch-all-error-p (setq menusvr (vl-catch-all-apply
        'vla-Item (list (vla-get-MenuGroups (vlax-get-Acad-Object)) (vlax-make-variant "MyMenuGroup"))))))
        (not (vl-catch-all-error-p (setq toolssvr (vl-catch-all-apply
        'vla-get-Toolbars (list menusvr)))))
        (not (vl-catch-all-error-p (setq toolsvr (vl-catch-all-apply
        'vla-Item (list toolssvr (vlax-make-variant "MyToolbar"))))))
        (not (vl-catch-all-error-p (setq button (vl-catch-all-apply
        'vla-Item (list toolsvr (vlax-make-variant "MyButton"))))))
          );and
        (progn
          (vl-catch-all-apply 'vla-SetBitmaps (list button icon_str icon_str))
      (vl-catch-all-apply 'vla-put-Macro (list button macro_str))
      (vl-catch-all-apply 'vla-put-HelpString (list button help_str))
    );progn
      );if

Здесь:
icon_str - собственно иконка
macro_str - макрос, выполняемый по кнопке
help_str - подсказка в статусной строке

Re: Дизель не заводится от кнопки.

Может есть резон посмотреть, как организована кнопка в стандартном ACADе:
ID_TbZoom    [_Flyout("Зумирование", ICON_16_ZOOM, ICON_24_ZOOM, _OtherIcon, ACAD.TB_ZOOM)]
и далее естественно:
**TB_ZOOM
ID_TbZoom    [_Toolbar("Зумирование", _Floating, _Hide, 100, 350, 1)]
ID_ZoomWindo [_Button("Покажи Рамка", ICON_16_ZOOWIN, ICON_24_ZOOWIN)]'_zoom _w
и т.д.
Удачи..

Re: Дизель не заводится от кнопки.

Всем спасибо.
В реакторах, vla- и т.п. я только собираюсь начать разбираться - если время будет. Вот и книжку Полищука тут приобрел.

Re: Дизель не заводится от кнопки.

> leha
Вроде бы все нормально работает, когда кнопка есть в наличии. А вот столкнулся с ситуацией, когда кнопка отсутствовала на панели (при переустановке была ошибочно загружена устаревшая версия файла меню). И иконка менялась на совершенно не относящейся к этой функции кнопке. Выражение

(not (vl-catch-all-error-p (setq button (vl-catch-all-apply
'vla-Item (list toolsvr (vlax-make-variant "MyButton"))))))

упорно возвтащало T. При подробном анализе оказалось, что в переменной button содержится совсем не ошибка, а указатель на последнюю в тулбаре кнопку. Пришлось для надежности добавить следом еще

(= (strcase (vla-get-name button)) "MYBUTTON")

Получается, что огород с "(not (vl-catch-all-error-p..." и "(vl-catch-all-apply...." в данном случае, увы, не помогает sad(
PS. АКАД2002

Re: Дизель не заводится от кнопки.

> VK
Согласен.
Хотя почему так - непонятно. Ведь для самой панели и для группы меню (да и в принциае для любой другой коллекции) возвращает именно ошибку, и огород :) нужен, а уже непосредственно для кнопки - указатель на последнюю. В 2004, кстати, то же самое. Получается, что действительно для кнопки нужна проверка
(= (strcase (vla-get-name button)) "MYBUTTON")
а vl-catch-all-error-p можно вообще убрать.