Re: В. Свет "Язык макрокоманд"

> kpblc
В то время у меня была русско-английская версия, и там PGP был, по-видимому, английский. Конечно, если случится переиздать книгу, все проверю на нормальной русской версии, с помощью KPBLC и других форумчан.
По профилям. Можешь-ли описать, как их организовать в LT? Хотя с 2006 это, по-видимому, не актуально, если там есть Workspace. Может-ли кто-нибудь из владельцев LT-06 проверить это?
По поводу (_) или (_.) перед именем команды в локализ. версии.Ты сказал, что надо добавить точку. Получается, что перевод команды на русский есть ее переопределение? Но в Help так не звучит. Все-таки, точка желательна или обязательна? Если работает без точки, то зачем она?
По макросу, ты такое сложное выражение привел, которое может испугать неискушенного будущего читателя! (На самом деле, KPBLC, с которым мы давно общаемся, сильно продвинулся за последний год, книга, по его словам, подвигла на более глубокое изучение када, и теперь KPBLC лиспеет на глазах. так что такой макрос для него не предел.) Согласен, сокращение OR не совсем удачное. Но и твое _Ortho_ тоже. Знаки подчеркивания, которые здесь просто являются орфогр. символами и не имеют отношения к локализации, сбивают с толку. Поясни свое ИМХО - зачем обнулять переменную? У меня есть задумка, где переменная должна удерживаться всю сессию, или ее часть.
P.S. Рукопись писал с чистого листа. В литературе ничего не нашел, Так, по паре страничек у Омуры да Финкельштейн. Только общение с коллегой, который показал мне основы, да свой последующий опыт. Я ведь практик, не программист. Решил, небольшая книжица, вроде брошюры, получится. А получилось 300 стр, так как все время открывались новые горизонты, так что сам учился вместе с рукописью.

Re: В. Свет "Язык макрокоманд"

Если публикуется длинный макрос, то он растягивает страницу. Поэтому его следует резать на части

Re: В. Свет "Язык макрокоманд"

По поводу точки в командах (_.command). Я считаю это одним из рудиментов AutoCAD'а. В DOS это еще как-то использовалось. Но начиная с R14 я не знаю ни одного примера переопределения команд, особенно с появлением DIESEL. Точка, конечно, не помешает, но перелопачивать десятки и сотни программ ради этого - чепуха, IMHO. Более того, я думаю, что опытные пользователи сознательно не будут переопределять команды, а неопытные просто не знают о такой возможности.

Re: В. Свет "Язык макрокоманд"

И еще по поводу ников. В. Свет звучит, а Vova теперь, когда многие знакомы с книгой  "Язык макрокоманд", как-то не очень, IMHO. Конечно, иногда хочется спрятаться за анонимным ником, я сам был и Profan'ом и strannik'ом, но это уже отпало. Особенно нелепо звучат некоторые ники с припиской "гуру" или "мастер", как это сделано на dwg.ru. Не хочется никого обижать, но когда я вижу, что пишет "Огурец", как-то доверие к его словам размывается, будь он хоть 10 раз "гуру". IMHO это, конечно, и может коробит только меня одного...

Re: В. Свет "Язык макрокоманд"

> В. Свет
Так я и не скрываю  - книга написана очень доходчиво, она закрывает собою ту нишу, которую никак не может заполнить BHV - для начинающих, которые очень мало знают (если вообще хоть что-то знают). Без нее понимание тонкостей када ко мне ну никак не приходило.
По профилям: фактически в реестре (HKEY_CURRENT_USER\Software\Autodesk\AutoCAD LT\R10\ACLT-301:419\Profiles - это для LT 2005 Rus, для английской версии LT 2005 будет HKEY_CURRENT_USER\Software\Autodesk\AutoCAD LT\R10\ACLT-301:409\Profiles) хранятся настройки нескольких профилей. В принципе, некоторые сторонние приложения открывают эту заглушку и позволяют в LT работать с несколькими профилями. По идее к ним можно попытаться обратиться (но тут есть одна тонкость - вчера проверил: в LT 2005 мне не удалось заставить запускаться кад с ключом \p в ярлыке, т.е. надо извращаться). 2006-го нет, к сожалению, так что как там организовано, могу только догадываться.

...По поводу (_) или (_.) перед именем команды в локализ. версии...

Да нет, локализация команды не есть ее переопределение. Фактически это индентично, если бы я написал лиспик:

(defun c:add-line()
  (command "_.-Layer" "_Make" "Lines" "")
  (command "_.line")
  (while (and
       (/= (getvar "cmdactive") 0)
       (/= (getvar "cmdnames") "")
       )
    (command pause)
    )
  )

И потом из acad.pgp по алиасу L вызывал бы не LINE, а ADD-LINE. Вот и все переопределение имхо.
Да все дело в том, что если где-то в глубинах навешанных лиспов стоит нечто типа такого:

(defun c:LINE()
(princ "\n Переопределенная команда!")
(Функция_номер_164_для_чего-нибудь)
)

и где-то в стартере (например, в acaddoc.lsp) есть команда

(command "_.undefine" "line")

, то после инициализации лиспов по команде LINE, _LINE будет работать именно переопределенная команда, а вот _.LINE вызовет стандартное приглашение к указанию точки и построению отрезков.
По поводу сокращений и "_". Просто у меня стиль стал такой (показалось наиболее удобным): все значения системных перемнных, с которыми я работаю, хранить в переменных с именами этих системных переменных, желательно полных, возможно, с небольшими сокращениями. Т.е. значение "cmdecho" хранить в _cmdecho_; "orthomode" - в _orthomode_ (возможно, _ortho_); "nomutt" - в _nomutt_ ну и так далее. Второй символ подчеркивания практически гарантирует, что имя переменной не будет опознано кадом как команда и если случайно попадет в ком.строку, то просто вызовет ошибку, а не труднопонимаемую последовательность действий. Собственные правила я где-то на dwg.ru описывал (точно тему не помню)
Обнуление переменных... Как бы сказать-то (ну не писатель я, не писатель).  Ну, в общем, тут дело такое - переменная кушает какое-то количество памяти, что само по себе не есть гуд - памяти, как и денег, много не бывает. Кроме того, обнуление переменных гарантирует, что никаким образом даже случайно не будет использовано сохраненное там значение (если там nil, то тогда попытка сделать нечто типа (setvar "snapunit" nil) выдаст ошибку - а не попытку поставить на системную переменную значение с координатами точки.
Если переменная должна храниться всю сессию када, то тогда, конечно, ее надо не обнулять. Но тогда постоянно придется проверять ее на заполненность - в лиспе-то это решается на ура, а вот с макросами... ИМХО будет невероятное удлинение макросов. К примеру:
Есть некая переменная *vova* (поскольку она глобальная, "обрамим ее символом *, благо кад в этом отношении очень терпим). Хранит эта переменная значение масштаба. Масштаб устанавливается отдельной кнопкой, на которой висит макрос вида (для установки масштаба 1:100):

^C^C(setq *vova* 100);

А потом идет простановка размеров:
Было

^C^C_.dimlinear;

Станет:

^C^C(setq _dimscale_ (getvar "dimscale"));(setvar "dimscale" *vova*);
_.dimlinear;\\\
(setvar "dimscale" _dimscale_);(setq _dimscale_ nil);

Лишние переводы строк удалить.
А если изначально (для данной ситуации) не было установлено значение *vova*, макрос работать не будет. Придется в начало вколачивать проверку *vova* на nil, если *vova* не установлено, то либо выдавать соответствующее предупреждение, либо устанавливать переменную в значение "по умолчанию" (которое практически гарантированно породит дополнительные проблемы) ну и так далее.
Отследить, что где и как работает, будет очень трудно. Я столкнулся и с этим, и с тем, что абсолютно одинаковые действия приходилось множить... Пришлось садиться на лисп, делать автозагрузчик лиспов, и переделывать меню.
Но это лично моя история,

> Влапдимир Громов
Интересный ник однако ;) Но суть не в этом. Именно неопытные пользователи могут (и, самое страшное, делают!) ставят лиспы, которые написаны неизвестно кем и неизвестно как. Там и не такое встречается - для ради эксперименту там только что не выполняется переопределение настроек активного профиля (хотя и такое может быть). Опытные по крайней мере делают отдельный профиль, на котором и тестируют все приходящие программки и программульки, а также анализируют код.
---
P.S. Надеюсь, не очень сумбурно?
---
P.P.S. Всю дорогу - IMHO, IMHO, IMHO...

Re: В. Свет "Язык макрокоманд"

Вот хотелось бы еще сказать по поводу длины макроса. Если он написан здесь в одну строчку, то при копировании его в поле для макроса на кнопку или пункта меню проблем быть не должно, IMHO. А вот если он написан здесь в 2 или 3 строки, то копирование его в пункт меню через буфер обмена может создать проблемы: там ведь в случае продолжения макроса на следующей строке последним символом в предыдущей строке должен стоять плюс (+). Так было, по крайней мере, до 2005 включительно. В 2006 в окне адаптации CUI для пункта меню свойства те же, что и для кнопки. Может там и проскочат 2-3 строки, не пробовал.

Re: В. Свет "Язык макрокоманд"

> В. Свет
С Вашей подачи стал разбираться с калькулятором и в Хелпе обнаружил, что можно доставать значения системных переменных так:
Cal
Expression: Getvar(varname) В книге этого нет. Может пригодится?
P.S. Спасибо за книгу, в результате она всегда со мной, дома читаю и на работе проверяю, я стал глубже копать, и автокад нравится все больше и больше

Re: В. Свет "Язык макрокоманд"

> Владимир Громов
Хорошо-бы автор длинного макроса предупредил, что надо последовательно копировать строки в буфер. Все-таки, читать теперь эту страницу трудно, а распечатать и вовсе нельзя.

> KFC
Обычно значения системных переменных вытаскивают либо лиспом (см пост KPBLC выше -  (getvar "dimscale") Либо при помощи DIESEL. Получается, что калькулятор дает 3-й способ. В HELP сведения об этом появились только в 2006 версии, может, в 2005, не проверил. Но, оказывается, этот способ работает и в 2004, и скорее всего и в более ранних! Кто-бы мог знать, ведь пришло в голову проверить только сейчас. Таким образом, в макросы теперь можно вводить значение сист. пер. пользуясь только инструментом автокада, без страшных (для некоторых) лиспа с дизелем. Спасибо за ценнуь информацию.

Re: В. Свет "Язык макрокоманд"

:) Уважаемый В.Свет - эта возможность есть в калькуляторе AutoCAD начиная как минимум с AutoCAD R12 (в R11 проверить не могу - у меня не сохранился). Было ли это в документации - сомневаюсь, но на что нам документация, если есть обычный текстовый редактор (достаточно просмотрщика) и желание исследовать недокументированные возможности AutoCAD!

Re: В. Свет "Язык макрокоманд"

> Александр Ривилис
Допустим, такое желание есть, только как исследовать недокументированные возможности, если они недокументированы?

Re: В. Свет "Язык макрокоманд"

> Владимир Громов
Все очень просто:
1) Нужно свободное время.
2) Нужно не просто желание, а ОГРОМНОЕ желание.
3) Нужен пытливый ум :) и базове знания операционной системы.
4) Нужен просмотрщик (желательно и простой и HEX).
5) И еще много чего, что может понадобится в конкретной ситуации.
Пример. Мы хотим узнать список функций, которые реализованы в калькуляторе, но по какой-то причине не документированы. Запускаем поиск в каталоге AutoCAD по маске *cal*.* (наиболее вероятно, что в имени файла cal или calc присутствует), а затем отсеиваем те файлы, которые явно никакого отношения к делу не имеют.
Остается список (для AutoCAD 2006):

AcCalcEngine.arx
geomcal.arx
AcCalcEngineRes.dll
AcCalcUi.dll
AcCalcUi.xml

По очереди открываем их в просмотрщике (я пользуюсь FAR-ом) и ищем там строки, которые могут быть именами недокументированных функций.
Попутно сверяемся с документацией.
В результате находим в файле AcCalcEngine.arx такую интересную строку GETVAR(AutoCAD_system_variable). Так вот именно такая строка присутствует во всех версиях калькулятора AutoCAD (имя файла другое) начиная с версии R12. Это один из способов поиска. IMHO для большинства исследователей я не открыл ничего нового. Так же (или почти так) находятся и  недокументированные функции VisualLisp и, что значительно проще, экспортированные, но недокументированные функции ObjectARX.
Дерзайте, Владимир! smile

Re: В. Свет "Язык макрокоманд"

От Forma и Александр Ривилис нужно держаться подальше. Они как магнитом притягивают неприятности.:)

Re: В. Свет "Язык макрокоманд"

> Александр Ривилис
В свое время я просмотрел редакторами ресурсов типа Restoratora практически все файлы ARX, которые содержали ресурсы, и *res.DLL в дистрибутиве AutoCAD 2005 ENG. Правда, задача была не найти недокументированные возможности, а перевести все, что возможно, включая сообщения и запросы в командной строке, на русский язык. К моменту выхода официальной русской версии у меня был готов профессиональный перевод на 95 процентов и застрял я только на ассемблернных сборках. Некоторые файлы просмотрел и в HEX-редакторах. Может, что-то я и видел недокументированное, но не заметил. Зато я нашел, уже в официальной русской версии, что в некоторых файлах присутствуют строки типа:
"Да Нет _ Yes No", т.е. подчерк отделен от английского названия опции пробелом. Из-за этого пробела не работает контекстное меню для данной команды в русской версии. Я исправил все подобные строки (убрал пробелы) в 7 файлах дистрибутива. Мы как-то обговаривали с вами этот вопрос. В 2002 таких ляпсусов гораздо больше, но там очень многое находится в файле acad.xmx, который так и остался недоступным. И еще я научился импортировать пиктограммы в acadbtn.xmx (2005) из acadbtn.dll (2002). Но вот, чтобы искать недокументированные возможности, надо хотя бы знать ВСЕ документированные, а я все еще не уверен, что я их знаю...

Re: В. Свет "Язык макрокоманд"

> shurup
Лучше бы тебе держаться подальше от otvertka... или уж держаться вообще подальше от этой Конференции, IMHO.

Re: В. Свет "Язык макрокоманд"

> Владимир Громов
Вот видите. Вы же сами ответили на свой вопрос. А все документированные возможности AutoCAD не знает ни кто - знать их все не реально. Можно знать их в какой-то ограниченной части AutoCAD - например, калькулятор. Изучить его, посмотреть все, что есть в хелпе, и только потом уже искать недокументированные возможности.

Re: В. Свет "Язык макрокоманд"

> Владимир Громов
Нет у пользователей программы AutoCAD чуства юмора. Скучно с вами. :(

Re: В. Свет "Язык макрокоманд"

> shurup
Скучно - иди в тему Юмор. Там и шути. Если будет смешно, поддержим. Ну а если нет - извините...

Re: В. Свет "Язык макрокоманд"

> Александр Ривилис

> Владимир Громов
Все бы вам изучать нехорошими методами. А ручками? Запустите команду Trim в командирской строке и ничего не трогая клацните правой клавишей мыши по полю. И откроются вам недокументированные возможности славной проги AutoCAD:)

Re: В. Свет "Язык макрокоманд"

> shurup
Эта возможность открыта давно, и обозначает она не больше, не меньше, как выбор ВСЕХ объектов в рисунке.

Re: В. Свет "Язык макрокоманд"

Владимир Громов пишет:

Эта возможность открыта давно, и обозначает она не больше, не меньше, как выбор ВСЕХ объектов в рисунке.

Не в рисунке, а на экране (в текущем видовом экране").

Re: В. Свет "Язык макрокоманд"

> kserg
Конечно, не имеются в виду выключенные, замороженные, блокированные слои. Однако объекты на остальных слоях выбираются и обрезаются, даже если на видовом экране отображается только часть объектов рисунка. (AutoCAD 2005). Этот эффект соответствует вводу в командной строке на запрос о выборе объектов опции "_all" ("все"). Разница только в том, что, если просто нажать правую кнопку мыши, то объекты не подсвечиваются, а если ввести опцию, то AutoCAD переходит в режим выбора объектов и они подсвечиваются и надо еще раз правой кнопкой закончить выбор. А в AutoCAD 2006 в команде "_trim" ("обрезать") эта опция уже введена в команду:

Select objects or <select all>:

Re: В. Свет "Язык макрокоманд"

Приобрел книгу, потому что необходимы "самодельные" кнопки. Но вся книга рассчитана на AutoCad. Я работаю в Инвенторе и не собираюсь переходить на AutoCad. В книге я не обнаружил решения задачи типа: "Создавай в Acade, сохраняй, потом импортируй в Инвентор".
Может так не получится?
Я не могу учиться писать программы нет времени. Я конструктор с большим опытом в конструировании и с никаким в программировании.
Потыкался в своем английском Инвенторе и понял - это надолго.
Как сделать кнопки для Инвентора!

Re: В. Свет "Язык макрокоманд"

> Владимир Громов
В 2006 - да, действительно, опция "_All" позволяет (в качестве режущих кромок) выбрать "все..." объекты, в том числе и находящиеся за пределами видового экрана.

Re: В. Свет "Язык макрокоманд"

Вопрос автору книги:
  Так можно с помощью Вашей книги делать кнопки для Инвентора? Или я приобрел не то?

Re: В. Свет "Язык макрокоманд"

> Владимир Алексеевич
Увы, я с Инвентором не знаком. Говорят, там можно программировать на VBA. Попробуйте задать свой вопрос на одноименной ветке этого форума.
   А хотелось-бы сделать что-то похожее описанному в книге?