Visual LISP, AutoLISP and General Customization

Reply
Distinguished Mentor
Moshe-A
Posts: 735
Registered: ‎09-14-2003
Message 1 of 6 (1,049 Views)
Accepted Solution

problem in callback function

1049 Views, 5 Replies
09-15-2012 03:17 PM

Hi Guys,

 

i have encounter a problem in callback function...i am using (client_data_file) to attach string (in a list)

to be transfer to callback function. in the callback i set a local variable to get this string and autocad set it

to nil but if i declare the variable as global it works (not sure if it is a steady problem)

 

does any one seen this or am i  missing something?

 

here is an example of my code:

 

(setq some_string "abcde")
(client_data_tile "accept" "(some_string)")
(action_tile "accept" "(ctrl_accept $data)")

(defun ctrl_accept (data / str) 
 (setq str (eval (car (read data)))) ; this returns nil
 (done_dialog 1)
)

; but this one works
(defun ctrl_accept (data) 
 (setq str (eval (car (read data)))) ; this returns "abcde"
 (done_dialog 1)
)

 

thanks in advance

Moshe

 

 

*Expert Elite*
scot-65
Posts: 2,124
Registered: ‎12-11-2003
Message 2 of 6 (1,012 Views)

Re: problem in callback function

09-17-2012 03:24 PM in reply to: Moshe-A

For your first defun you declare a local variable STR which does not leave the

confides of the opening and closing parenthesis of the defun. In other words,

it is a local variable that stays local. If you want it to leave this area, you show

one of the many tricks that are available.

 

I personally keep the done_dialog on the same line as "accept". It's easier for me to follow...

 

Try this (untested)

 

(defun ctrl_accept (data) 
 (eval (car (read data)))
)

..."(setq str (control_accept $data))(done_dialog 1)"
Scot-65
Dyslexia is a permanent physical disability that cannot be seen.
*Expert Elite*
pbejse
Posts: 2,406
Registered: ‎11-24-2009
Message 3 of 6 (1,006 Views)

Re: problem in callback function

09-17-2012 06:06 PM in reply to: scot-65

scot-65 wrote:

....

I personally keep the done_dialog on the same line as "accept". It's easier for me to follow...

.....


 

I concur...

 

Distinguished Mentor
Moshe-A
Posts: 735
Registered: ‎09-14-2003
Message 4 of 6 (995 Views)

Re: problem in callback function

09-18-2012 12:38 AM in reply to: scot-65

Hi Scot,

 

thank you very much for your help.

 

i expand a little of what i'm doing:

 

suppose in main function i have a registry key and a file name

(that were build in main and ofcourse defined as locals) as the user picks th OK button

i need them in the (ctrl_accept) callback function to write the file name to registry.

all of that include some error cheaking could not be done from (action_tile) call

i suppose you agree with me?!

 

the problem arise in buttons i use and edit_box tiles.

 

this code is a small example of my program

 

(defun ctrl_accept (data / rkey filename)
 (setq rkey (eval (car (read data)))
 (setq filename (eval (cadr (read data))))

 (if (vl-registry-read rkey)
  (vl-registry-write rkey "datafilename" filename) 
 )

 (done_dialog 1)
)

(defun c:main (/ rkey filename dcl_id what_next)

 (setq rkey (strcat "HKEY_LOCAL_MACHINE\\" (vlax-product-key) "\\Applications")
       rkey (strcat rkey "\\AppName")
 )

 (if (not (vl-registry-read rkey))
  (vl-registry-write rkey)
 )
  
 (setq filename "appdata.txt")

 (setq dcl_id (ai_dcl "appdata")); load dcl file
 (setq what_next 3)
  
 (While (> what_next 1)
  (if (not (new_dialog "app_dialog" dcl_id "" '(-1 -1))); open dialog
   (exit)
  )
     
  (client_data_tile "accept" "(rkey filename)")
  (action_tile "accept" "(ctrl_accept $data)")

  (SetQ what_next (start_dialog)); start dialog

 ); while

 (princ)
)

 

as i said earlier the problem is not steady it arise from time to time

but i can not relay on it.

 

Moshe

 

Distinguished Mentor
Moshe-A
Posts: 735
Registered: ‎09-14-2003
Message 5 of 6 (988 Views)

Re: problem in callback function

09-18-2012 02:11 AM in reply to: scot-65

Scot,

 

i have changed the local variable name and it seems that autocad is pleased with that

(wonder why in callback a local variable 'filename' is not accepted but 'fname' does -

undocumented bug?) hope it will stay

 

Scot, could you take a look at my other theard TDINDWG v TDUSRTIMER?

 

thanks

Moshe

 

  

*Expert Elite*
scot-65
Posts: 2,124
Registered: ‎12-11-2003
Message 6 of 6 (972 Views)

Re: problem in callback function

09-18-2012 04:04 PM in reply to: Moshe-A

I'm not sure what is "client_data_tile"?

It's not set_tile, mode_tile, or action_tile.

Getting past that, what is "(rkey filename)"? Looks like a call to a subroutine?

 

If you want the gremlin to remain inside a program, yet still have access to that

gremlin while inside a function (subroutine) restructure your program as follows:

 

(defun c:MAIN ( / a b c...)

 (defun SUB1 (f g / h k...) ... ) ;a b c f and g can be seen inside here, h and k is local to SUB1.

 (defun SUB2 (m / n...) ... ) ;again, a b c and m can be seen inside here, n is local to SUB2.

 ...

 (princ)

);end MAIN

 

One might have conflicts with declared variables (gremlins) for this structure above.

I have used a suffix "1", "2", etc. inside my subs, especially with numbers or counters

(sslength, setq n1, etc.).

 

???

 

TDINDWG Time Display in Drawing I looked at once upon a time,

but never investigated the other one (is it a Dunsel variable???).

We use UNNAMED profiles here. It serves us no purpose(?).

 

???

 

Scot-65
Dyslexia is a permanent physical disability that cannot be seen.

You are not logged in.

Log into access your profile, ask and answer questions, share ideas and more. Haven't signed up yet? Register

Announcements
Are you familiar with the Autodesk Expert Elites? The Expert Elite program is made up of customers that help other customers by sharing knowledge and exemplifying an engaging style of collaboration. To learn more, please visit our Expert Elite website.

Need installation help?

Start with some of our most frequented solutions to get help installing your software.

Ask the Community