Тема: Помогите с OpenDCL

Доброго времени суток всем!

Пожалуйста, натолкните на мысль, в чем может быть дело.
Решил изучить OpenDCL. Сделал простенькую форму (картинка и кнопка).
Сама форма в AutoCADе отображается, но ни изображение не загружается, ни
выхода при нажатии на кнопку не происходит... что не так делаю?

(defun Odcl_Hello_Max (/ c:salutation_Hello_Picture_OnPaint
                 c:salutation_Hello_OK_OnClicked)

(defun OpenDCL_LoadArx ()
   (if (not (member "OpenDCL.16.arx" (arx)))
      (arxload "C:\\Program Files\\Common Files\\OpenDCL\\OpenDCL.16.arx")
   )
)

(defun c:salutation_Hello_Picture_OnPaint  (HasFocus /)
  (dcl_PictureBox_LoadPictureFile salutation_Hello_Picture "D:\\Program Files\\AutoCAD 2005\\Support\\pict1.bmp" 1)
    )

(defun c:salutation_Hello_OK_OnClicked ( /)
  (dcl_Form_Close salutation_Hello)
)
  
(OpenDCL_LoadArx)
 (dcl_LoadProject "D:\\Program Files\\AutoCAD 2005\\Support\\salutation.odcl" T)
  (dcl_FORM_SHOW salutation_Hello)
  
  (prin1)
);defun

Re: Помогите с OpenDCL

Максим Горшенин, Объясни, зачем ты добавляешь префикс c: к названиям функций ( c:salutation_Hello_Picture_OnPaint и c:salutation_Hello_OK_OnClicked) ?
Префикс c: делает из фукнции команду. Команде нельзя передавать агрументы ( (defun c:salutation_Hello_Picture_OnPaint  (HasFocus /) ).

Re: Помогите с OpenDCL

:?:  Имя функции обработки события обязательно начинается с "с:". Такое ограничение связано с особенностями внутренней организации ObjectDCL (я так понимаю, что и OpenDCL). Программистов, которые привыкли к тому, что с "с:" в LISP начинаются имена функций, которые определяют команды AutoCAD, это может первоначально смущать. (Н.Н. Полещук, "Разработка приложений...")

Разве не так всё??

Re: Помогите с OpenDCL

Если имя ф-ции начинается на C:, то это особый вид функции - команда.

Программистов, которые привыкли к тому, что с "с:" в LISP начинаются имена функций, которые определяют команды AutoCAD, это может первоначально смущать.

И смущает, так как в такие ф-ции нельзя передавать аргументы, а ты в свою salutation_Hello_Picture_OnPaint пытаешься передать. Их справки по lisp'у

C:XXX Functions


If an AutoLISP function is defined with a name of the form C:xxx, it can be issued at the AutoCAD Command prompt in the same manner as a built-in AutoCAD command. This is true regardless of whether you define and load the function in VLISP or at the AutoCAD Command prompt. You can use this feature to add new commands to AutoCAD or to redefine existing commands.

To use functions as AutoCAD commands, be sure they adhere to the following rules:

The function name must use the form C:XXX (upper- or lowercase characters). The C: portion of the name must always be present; the XXX portion is a command name of your choice. C:XXX functions can be used to override built-in AutoCAD commands. (See Redefining AutoCAD Commands.)
The function must be defined with no arguments. However, local variables are permitted and it is a good programming practice to use them.
A function defined in this manner can be issued transparently from within any prompt of any built-in AutoCAD command, provided the function issued transparently does not call the command function. (This is the AutoLISP function you use to issue AutoCAD commands; see the entry on command in the AutoLISP Reference.) When issuing a C:XXX defined command transparently, you must precede the XXX portion with a single quotation mark (').

You can issue a built-in command transparently while a C:XXX command is active by preceding it with a single quotation mark ('), as you would with all commands that are issued transparently. However, you cannot issue a C:XXXcommand transparently while a C:XXX command is active.

NoteWhen calling a function defined as a command from the code of another AutoLISP function, you must use the whole name, including the parentheses; for example, (C:HELLO). You also must use the whole name and the parentheses when you invoke the function from the VLISP Console prompt.

Re: Помогите с OpenDCL

Владимир Азарко пишет:

И смущает, так как в такие ф-ции нельзя передавать аргументы, а ты в свою salutation_Hello_Picture_OnPaint пытаешься передать

Володя. В данном случае ты не прав. Можно определить функцию с C: и передать ей параметр/параметры (не всегда следует обращать внимание на то, что написано в документации), чем ObjectDCL и пользуется. В чем в данном случае ошибка я не знаю, т.к. никогда ObjectDCL не использовал.

Re: Помогите с OpenDCL

Спасибо за ответы. С командой все понятно, но именно так описано в документации, да и сам OpenDCL генерирует код именно с префиксом "с:"  :) самому тоже непривычно...
Но вопрос остается открытым. И очень хочется разобраться с программой... многие ведь пользуются и хвалят.

Re: Помогите с OpenDCL

Александр Ривилис пишет:

... Можно определить функцию с C: и передать ей параметр/параметры (не всегда следует обращать внимание на то, что написано в документации), чем ObjectDCL и пользуется. В чем в данном случае ошибка я не знаю, т.к. никогда ObjectDCL не использовал.

А я ей (документации) так верил  :D
Тогда так же помочь не смогу, т.к. также ObjectDCL не пользовался. Попробуй задать вопрос на форуме ObjectDCL

Re: Помогите с OpenDCL

Спасибо, попробую...  :) заодно, английский по изучаю. Тоже полезно

Re: Помогите с OpenDCL

На сколько я понял, необходимо было добавить событие инициализации окна...  :) может кому, из тоже начинающих, чем-то поможет работающий пример:

(defun Odcl_Hello_Max (/ c:salutation_Hello_OnInitialize
                 c:salutation_Hello_Picture_OnPaint
                 c:salutation_Hello_OK_OnClicked)

 (dcl_project_load  "salutation.odcl")
  (dcl_form_show salutation_Hello 400 200)  


(defun OpenDCL_LoadArx ()
   (if (not (member "OpenDCL.16.arx" (arx)))
      (arxload "C:\\Program Files\\Common Files\\OpenDCL\\OpenDCL.16.arx")
   )
)

(OpenDCL_LoadArx)

  (defun c:salutation_Hello_OnInitialize (/)
     (princ "\nЗагружаем окно приветствия...")
    )
  
(defun c:salutation_Hello_Picture_OnPaint (HasFocus /)
  (dcl_PictureBox_LoadPictureFile salutation_Hello_Picture "D:\\Program Files\\AutoCAD 2005\\Support\\picture1.bmp" 1)
    )

(defun c:salutation_Hello_OK_OnClicked (/)
  (dcl_Form_Close salutation_Hello)
)
  
  (prin1)
);defun