Тема: Ошибка: "Command: ; error: no function definition: LAYER"

Если без возврата, то можно воспользоваться таким:

^C^C_.-layer;_m;rgl;_ltype;Continuous;;_lw;0.25;;_c;6;;;_pline;\_w;0.6;0.6;

Это на первую задачу. А так - у тебя в последовательности (command) лишних пробелов насовано.

Re: Ошибка: "Command: ; error: no function definition: LAYER"

Я не очень поняла

Если без возврата, то можно воспользоваться таким:
^C^C_.-layer;_m;rgl;_ltype;Continuous;;_lw;0.25;;_c;6;;;_pline;\_w;0.6;0.6;

Без возврата в 0-ой слой? Но мне это нужно.

А так - у тебя в последовательности (command) лишних пробелов насовано.

А это где? В 2-х последних программах?

Re: Ошибка: "Command: ; error: no function definition: LAYER"

IMHO, нельзя для слоя задавать цвет, тип линии и вес линии "ByLayer" ("ПоСлою").

Re: Ошибка: "Command: ; error: no function definition: LAYER"

> Владимир Громов : Эт точно. Я дотуда и не дошел :)
> …  14:38:15)
Ты попробуй с ком.строки ввести (command "_.layer" "_new" "mg1" "" "") - на новом файле. И посмотри, чего получится.

Re: Ошибка: "Command: ; error: no function definition: LAYER"

Здравствуйте.
Я попробовала сделать все что вы мне посоветовали, но у меня все равно не получается.
У меня программа для кнопки (программа с этого сайта). Прога на Lisp'е, файл и слои уже есть, создаю кнопку и пишу программку:
(defun layer (/)
  (if (not (tblsearch "layer" "rgl"))
    (progn (command "_.layer" "_new" "rgl" "" "")
      (command "_.layer" "_lw" "ByLayer" "rgl" "" "")
     (command "_.layer" "_c" "ByLayer" "rgl" "" "")
     (setvar "clayer" "rgl")
    ) ;_ end progn
    (setvar "clayer" "rgl")
  ) ;_ end if
) ;_ end defun
(defun c:mypline (/ echo_old *error* layer_old)
  (defun *error* (msg)
    (command)
    (setvar "cmdecho" echo_old)
    (setvar "clayer" layer_old)
    (princ)
   ) ;_ end defun
  (setq echo_old (getvar "cmdecho")
  layer_old (getvar "clayer")
  ) ;_ end setq
  (setvar "cmdecho" 0)
  (layer)
   (initget 6)
   (setq d1 (Getreal "\nВведите ширину <0.5>:"))
   (if (not d1) (setq d1 0.5))
    (initget 1)
  (setq p1 (Getpoint "Укажите базовую точку:"))
  (command "_.pline" p1 "w" d1 "")
  (while (= (getvar "CMDACTIVE") 1) (command pause))
  (setvar "cmdecho" echo_old)
  (setvar "clayer" layer_old)
  (princ)
) ;_ end defun
Макрос для нее:
^C^C^P(if (not c:mypline) (load "reka")) mypline ^P
Но при запуске ACad и нужного файла, и нажатии на кнопку в коммандной строке выдается надпись:
Command: ; error: no function definition: LAYER
Ну, не понимаю почему так!?
Помогите пожалуйста!

Re: Ошибка: "Command: ; error: no function definition: LAYER"

> Julia
IMHO, нельзя для слоя задавать цвет, тип линии и вес линии "ByLayer" ("ПоСлою").

Re: Ошибка: "Command: ; error: no function definition: LAYER"

Предлагаю такой вариант:

(defun lay (/)
(if (not (tblsearch "layer" "rgl"))
(progn (command "_.layer" "_m" "rgl" "")
(command "_.layer" "_lw" "0.4" "rgl" "")
(command "_.layer" "_c" "1" "rgl" "")
) ;_ end progn
(setvar "clayer" "rgl")
) ;_ end if
) ;_ end defun
(defun c:mypline (/ echo_old *error* layer_old)
(defun *error* (msg)
(command)
(setvar "cmdecho" echo_old)
(setvar "clayer" layer_old)
(princ)
) ;_ end defun
(setq echo_old (getvar "cmdecho")
layer_old (getvar "clayer")
) ;_ end setq
(setvar "cmdecho" 0)
(lay)
(initget 6)
(setq d1 (Getreal "\nВведите ширину <0.5>:"))
(if (not d1) (setq d1 0.5))
(initget 1)
(setq p1 (Getpoint "Укажите базовую точку:"))
(princ "\n Укажите следующую точку (Enter-завершить): ")
(command "_.pline" p1 "_w" d1 "")
(while (= (getvar "CMDACTIVE") 1) (command pause))
(setvar "cmdecho" echo_old)
(setvar "clayer" layer_old)
(princ)
)

Re: Ошибка: "Command: ; error: no function definition: LAYER"

Текст программы сохранить в файл с именем reka.lsp, положить этот файл в одну из папок, включенных в пути поддержки АКАД-а, после этого выполнить макрос пробовали?

Re: Ошибка: "Command: ; error: no function definition: LAYER"

Во-первых, а обе функции в одном и том же файле? Во-вторых, измени в layer слова "ByLayer" на реальные значения - иначе срабатывать не будет! Говорили же... > Владимир Громов (2005-12-22 14:41:00)
И попробуй такой код:

(defun c:mpline (/ _cmdecho_ _clayer_ *error* layer cmd-string)
  (defun cmd-string (cmd)
    (while (/= (getvar "cmdactive") 0)
      (command cmd)
      ) ;_ end of while
    ) ;_ end of defun
  (defun layer (/)
;;; Это вариант четкого создания слоя.
;;;    (command "_.-layer" "_make" "rgl" "_lw" 0.25 "" "_c" 4)
;;;    (cmd-string "")
;;; А вот вариант с предварительной проверкой данных:
    (if (tblsearch "layer" "rgl")
      (setvar "clayer" "rgl")
      (command "_.-layer" "_new" "rgl" "_lw" 0.25 "" "_c" 4 "" "")
      ) ;_ end of if
    ) ;_ end of defun
  (defun *error* (msg)
    (cmd-string nil)
    (if _cmdecho_
      (setvar "cmdecho" _cmdecho_)
      ) ;_ end of if
    (if _clayer_
      (setvar "clayer" _clayer_)
      ) ;_ end of if
    (princ msg)
    (princ)
    ) ;_ end of defun
  (setq _cmdecho_ (getvar "cmdecho")
        _clayer_  (getvar "clayer")
        ) ;_ end of setq
  (layer)
  (setvar "cmdecho" 0)
  (initget 6)
  (setq d1 (getreal "\nВведите ширину <0.5>:"))
  (if (not d1)
    (setq d1 0.5)
    ) ;_ end of if
  (initget 1)
  (setq p1 (getpoint "Укажите базовую точку:"))
  (command "_.pline" p1 "w" d1 "")
  (cmd-string pause)
  (mapcar 'setvar '("cmdecho" "clayer") (list _cmdecho_ _clayer_))
  (princ)
  ) ;_ end of defun

Re: Ошибка: "Command: ; error: no function definition: LAYER"

Да, попробовала :( Ничего! Точнее все то же...
Command:  ; error: no function definition: LAYER
Файл сохранен как .lsp, в папке support(включена в пути поддержки АКАД-а)

Re: Ошибка: "Command: ; error: no function definition: LAYER"

> kpblc
Надо бы поставить подчерк в опции "w":

  (command "_.pline" p1 "_w" d1 "")

Неочевидны действия после указания базовой точки. Не мешало бы дописать, как у меня:

(setq p1 (Getpoint "Укажите базовую точку:"))
(princ "\n Укажите следующую точку (Enter-завершить): ")

> Julia
Что вы попробовали? У вас ошибки в коде. Попробуйте мой код или код kpblc с моими предложениями. Сравните наши коды со своим.

Re: Ошибка: "Command: ; error: no function definition: LAYER"

> Владимир Громов
ну да, да, посыпаю голову пеплом...

Re: Ошибка: "Command: ; error: no function definition: LAYER"

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

Re: Ошибка: "Command: ; error: no function definition: LAYER"

> Владимир Громов
Честно скажу, мне больше нравится такой подход:

(defun c:mpline (/ ent width layer *error* active_layer active_layer_state)
  (defun layer (/ vla_layer)
    (setq vla_layer (vla-add (vla-get-layers *kpblc-activedoc*) "rgl"))
    (vla-put-color vla_layer 4)
    (vla-put-lineweight vla_layer aclnwt050)
    (vla-put-linetype vla_layer "Continuous")
    vla_layer
    ) ;_ end of defun
  (defun *error* (msg)
    (if (and active_layer active_layer_state)
      (progn
        (vla-put-lock active_layer (car active_layer_state))
        (vla-put-layeron active_layer (cadr active_layer_state))
        ) ;_ end of progn
      ) ;_ end of if
    (if ent
      (vla-erase ent)
      ) ;_ end of if
    (vla-endundomark *kpblc-activedoc*)
    (princ msg)
    (princ)
    ) ;_ end of defun
  (vl-load-com)
  (if (not *kpblc-activedoc*)
    (setq *kpblc-activedoc* (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of if
  (vla-startundomark *kpblc-activedoc*)
  (setq active_layer       (vla-get-activelayer *kpblc-activedoc*)
        active_layer_state (list (vla-get-lock active_layer)
                                 (vla-get-layeron active_layer)
                                 ) ;_ end of list
        ) ;_ end of setq
  (vla-put-layeron active_layer :vlax-true)
  (vla-put-lock active_layer :vlax-false)
  (command "_.pline")
  (while (/= (logand (getvar "cmdactive") 31) 0)
    (command pause)
    ) ;_ end of while
  (setq ent (vlax-ename->vla-object (entlast)))
  (vla-put-color ent acbylayer)
  (vla-put-lineweight ent -1)
  (vla-put-linetype ent "ByLayer")
  (vla-put-constantwidth ent 0.0)
  (vla-put-layer ent (vla-get-name (layer)))
  (vla-put-lock active_layer (car active_layer_state))
  (vla-put-layeron active_layer (cadr active_layer_state))
  (vla-endundomark *kpblc-activedoc*)
  ) ;_ end of defun

Т.е. сначала рисуется, а потом назначаются свойства.

Re: Ошибка: "Command: ; error: no function definition: LAYER"

> kpblc
Понимаешь, какая штука. Опять после вызова команды

Команда: MPLINE

в командной строке пустота, что делать - не понятно. На самом деле надо указывать точки до нажатия Enter. Кроме того, во время отрисовки можно задавать опции полилинии (наугад). Самое интересное (или, наоборот, удручающее) - можно задать ширину полилинии (опять-таки, в пустой командной строке), но после завершения программы ширина полилинии обнуляется.
А если вдуматься, то что здесь у Julia требуется выполнить? Всего лишь отрисовать полилинию с заданной шириной на отдельном слое. Нет слоя, так его можно моментально создать в диспетчере слоев.  Отрисовка полилинии идет без опций в командной строке. Хорошо, если требуются только линейные сегменты, а если нужны и дуговые? Опций нет, контекстного меню нет, правая кнопка заканчивает программу. Не в обиду будь ей сказано, задача не очень-то требует программирования, IMHO. И вот для такой элементарной задачи товарищ kpblc проявляет чудеса в программировании, не в обиду будь ему сказано...

Re: Ошибка: "Command: ; error: no function definition: LAYER"

> Владимир Громов
Дык ить все ж поменять можно :)
Перед (command "_.pline") поставить (princ "\nУкажите начальную точку полилинии : <Отмена>").
Обнуление установленной ширины снимается комментированием строки (vla-put-constantwidth ent 0.0) - ибо нефиг. Предустановленная ширина полилинии иногда ведет к труднообъяснимым последствиям вычисления площадей, например. Вес линии слоя задается в (vla-put-lineweight vla_layer aclnwt050).

...проявляет чудеса в программировании...

Доброе слово и ламеру приятно :)

Re: Ошибка: "Command: ; error: no function definition: LAYER"

А если еще подумать, то можно прийти к выводу, что задача не столь элементарна. Чувствуется, что Julia хочет оперировать с объектно-ориентированными слоями, причем переключение этих слоев должно происходить принудительно. Вот это мне понятно. У меня самого многие объекты (типа "перегородки", "оси", "колонны" - условные названия, ясно, что отрисовываются они примитивами AutoCAD'а) рисуются на своих слоях и эти слои переключаются автоматически. Только у меня нужные слои созданы изначально, в программе установки рабочих параметров, а Julia желает создавать нужный слой (если его нет) в процессе отрисовки. Только и то правда, что опция "_make" позволяет обходиться без (tblsearch), IMHO.
Для kpblc.
А ты разве ламер?

Re: Ошибка: "Command: ; error: no function definition: LAYER"

> Владимир Громов
Предпочитаю думать, что да :)
Порежут, 100 пудов порежут! Поскольку оффтоп.
---
А вот насчет "указывать точки до нажатия Enter" - сорри, чуть-чуть не согласен. Лично я предпочитаю видеть, что будет нарисовано. По такой же технологии рисуются примитивы штатными командами "_.line", "_.pline" etc. Применять здесь (имею в виду в данной задаче) grdraw, grread ИМХО не надо - лишняя нагрузка.

Re: Ошибка: "Command: ; error: no function definition: LAYER"

> kpblc
Да я не то имел в виду, что сначала натыкать точек, а потом пусть отрисовывается по точкам. Я имел в виду, что хоть запроса о вводе начальной и последующих точек нет, но надо догадаться и тыкать курсором (и хорошо, что линия отрисовыается), а потом догадаться и в нужный момент нажать Enter.

Re: Ошибка: "Command: ; error: no function definition: LAYER"

А корректно ли давать функции имя, соответствующее команде Автокада - Layer?

Re: Ошибка: "Command: ; error: no function definition: LAYER"

> Коваленко Сергей
Вот и я подумал о том же. В моем варианте функция имеет имя lay.

Re: Ошибка: "Command: ; error: no function definition: LAYER"

> Коваленко Сергей
В данном конкретном случае - да. Т.к. вызов layer из ком.строки вызовет стандартное окно, а (layer) - в первоначальном варианте вызовет пользовательскую функцию, а в последнем - ошибку (функция не определена), поскольку она записана как локальная, т.е. недоступная прочим приложениям и функциям. Таким образом можно любые команды в принципе переопределять.

Re: Ошибка: "Command: ; error: no function definition: LAYER"

Всем большое спасибо! У меня все заработало!!!
Огромнейшее спасибо Владимиру Громову и kpblc.