Author Topic: Why, Oh Why!?  (Read 5663 times)

0 Members and 1 Guest are viewing this topic.

mmason

  • Guest
Why, Oh Why!?
« on: May 20, 2009, 03:15:00 PM »

Using the following happy code:

Code: [Select]
(setq LispFolder "C:\\mlm_DEV\\")
(if (findfile (strcat LispFolder "FE_EraseBlankText.lsp"))
  (autoload (strcat LispFolder "FE_EraseBlankText") '("EBT"))
)


(setq LispFolder "C:\\mlm_DEV\\")   returns
"C:\\mlm_DEV\\"   OK so far...

(strcat LispFolder "FE_EraseBlankText.lsp")   returns
"C:\\mlm_DEV\\FE_EraseBlankText.lsp"    As it should...

(findfile (strcat LispFolder "FE_EraseBlankText.lsp"))   returns
"C:\\mlm_DEV\\FE_EraseBlankText.lsp"    Still good, the file is there...

(autoload (strcat LispFolder "FE_EraseBlankText") '("EBT"))   returns
nil    Ummmm...

EBT   returns
The file C:mlm_DEVFE_EraseBlankText(.lsp/.exe/.arx) was not found in your
search path folders.
Check the installation of the support files and try again.nil


What?

This has gotten me all confused, unhappy, frustrated, tired and extremely thirsty.   
What happened to my little slash thingys in the filepath? 
Didn't this used to work?
Isn't this supposed to still work?
Oh!  My head!  Al, please take your heimers back!
 

ronjonp

  • Needs a day job
  • Posts: 7025
Re: Why, Oh Why!?
« Reply #1 on: May 20, 2009, 04:21:24 PM »
Is "LispFolder" in your support file search path? If not add it then you don't have to check for it.

Windows 10 x64 - AutoCAD /C3D 2020

Custom Build PC

uncoolperson

  • King Gator
  • Posts: 4430
  • Doing everything in metric inches!
Re: Why, Oh Why!?
« Reply #2 on: May 20, 2009, 04:42:44 PM »
Code: [Select]
(setq LispFolder "C:\\mlm_DEV\\")
(if (findfile (strcat LispFolder "FE_EraseBlankText.lsp"))
  (autoload (vl-string-translate "\\" "/" (strcat LispFolder "FE_EraseBlankText.lsp")) '("EBT"))
)

causes some kind of crazy loop for me... that was cool.
when all else fails On Error Resume Next
-----------------------
Livin like I'm on borrowed time
-----------------------
Searching for the Ballmer Peak

mmason

  • Guest
Re: Why, Oh Why!?
« Reply #3 on: May 20, 2009, 05:26:30 PM »
Is "LispFolder" in your support file search path? If not add it then you don't have to check for it.

I know that works, but I'm kinda lookin' at a situation where I'd rather not add some folders to everyboy's search paths.
Besides, I thought this worked!  The help file says that it will use search paths if a filepath is not specified - one would assume that if a filepath IS specified, the routine would look there.

Of course, we all know about assuming...

mmason

  • Guest
Re: Why, Oh Why!?
« Reply #4 on: May 20, 2009, 05:29:02 PM »
Code: [Select]
(setq LispFolder "C:\\mlm_DEV\\")
(if (findfile (strcat LispFolder "FE_EraseBlankText.lsp"))
  (autoload (vl-string-translate "\\" "/" (strcat LispFolder "FE_EraseBlankText.lsp")) '("EBT"))
)

causes some kind of crazy loop for me... that was cool.

 :-)  I tried the slashes both ways, but I never got loopy.

Jeff_M

  • King Gator
  • Posts: 3942
  • C3D user & customizer
Re: Why, Oh Why!?
« Reply #5 on: May 20, 2009, 08:07:14 PM »
I thought this worked in older versions, as you said. However, after looking at the code for (autoload) ...this is just another lisp in the acadXXXXdoc.lsp file..... I see that it is stripping out the backslashes when using folders. If you do this it should work:
Code: [Select]
(setq LispFolder "C:\\\\mlm_DEV\\\\")
(autoload (strcat LispFolder "FE_EraseBlankText") '("EBT"))
Looking back at the code from Acad2002 it is identical, so the problem must've been there, too.

mmason

  • Guest
Re: Why, Oh Why!?
« Reply #6 on: May 20, 2009, 10:35:56 PM »
I thought this worked in older versions, as you said. However, after looking at the code for (autoload) ...this is just another lisp in the acadXXXXdoc.lsp file..... I see that it is stripping out the backslashes when using folders.

Looking back at the code from Acad2002 it is identical, so the problem must've been there, too.

And thus, I refer back to the thread subject...
I'll be danged if I can figure out why they would want to do that?


Jeff_M

  • King Gator
  • Posts: 3942
  • C3D user & customizer
Re: Why, Oh Why!?
« Reply #7 on: May 21, 2009, 12:33:38 PM »
I don't think they 'wanted' to do that, it's just the way it worked out and evidently they neglected to test for it. The command works fine as long as you give just the filename, sans path. Once you include the path (even though help says you can) is when it falls apart.....which is due to the way they constructed the code. Essentially they create a new lisp command on the fly, using the CMD name(s) you provide, and use the ai_ffile (a fancy version of (findfile) that looks for lsp, arx, exp, & exe files) to locate the specified file. The trouble is, when you wrap the (strcat ..... filename .....) inside a (read) function, the "\"'s get used incorrectly. I'm sure there's a way to add a check, prior to the creation of the new defun, for the "\"'s and insert additional backslashes as needed.....but I don't have time to do so right now.

John Kaul (Se7en)

  • Administrator
  • Needs a day job
  • Posts: 9248
Re: Why, Oh Why!?
« Reply #8 on: May 21, 2009, 01:03:42 PM »
Devils advocate: why dont you just build your own autoload. -i.e. build a simple "hook".
“Common sense is not so common.” ~Voltaire

--> Donate to TheSwamp.org <--

jammie

  • Mosquito
  • Posts: 1
Re: Why, Oh Why!?
« Reply #9 on: May 21, 2009, 02:53:16 PM »
Hi,

I found the autoloader a little bit tempermental at times. So wrote this as an alternative..works pretty well

Code: [Select]
(defun autoloader (fname ListCommands)

(if

  (findfile fname)

(MAPCAR
'(LAMBDA (f)
(eval
(read
(strcat
"(defun c:"f" () (load \"" fname "\") (c:" f "))"))))
ListCommands
)
(print (strcat "\n*** Unable to locate " fname " ***"))
)
)
           
             ;Sample
(autoloader "acad commands.lsp" '("bf" "mc"))


« Last Edit: May 21, 2009, 02:57:23 PM by jammie »

CAB

  • Global Moderator
  • Seagull
  • Posts: 10362
Re: Why, Oh Why!?
« Reply #10 on: May 21, 2009, 02:58:37 PM »
Why not just LOAD the lisp and be done with it? 8-)
I've reached the age where the happy hour is a nap. (°¿°)
Windows 10 core i7 4790k 4Ghz 32GB GTX 970
Please support this web site.

John Kaul (Se7en)

  • Administrator
  • Needs a day job
  • Posts: 9248
Re: Why, Oh Why!?
« Reply #11 on: May 21, 2009, 03:27:36 PM »
Why not just LOAD the lisp and be done with it? 8-)

CAB,
I thought the same thing too (I never even heard of "autoload" before today) but i assumed there was some sort of reason for its use (maybe the preserving of variable definitions re-defined in the lisp or something).

jammie,
kinda what i was thinking.
“Common sense is not so common.” ~Voltaire

--> Donate to TheSwamp.org <--

CAB

  • Global Moderator
  • Seagull
  • Posts: 10362
Re: Why, Oh Why!?
« Reply #12 on: May 21, 2009, 03:36:19 PM »
AUTOLOAD saves memory the lisp routine would be occuping. I use it but most have lots of memory these days. :)

My autload file, jut a small segment. So I would not LOAD all these but if you have a path problem just LOAD that one.
Code: [Select]
;;; ===============================================
;;;    Lisp Routine Loader
;;;    AUTOLOAD only loads the routine when needed
;;; ===============================================
;;;------  Lisp name -- Function name(s) -------  Discription  -----------------------
(AUTOLOAD "AlignAllDCL CAB" '("AlignAll")) ; Align Text or Objects
(AUTOLOAD "Angle Bisect" '("BISECT")) ;
(AUTOLOAD "AreaPrt" '("AreaPrt")) ; Print the Area of "POLYLINE"  "LWPOLYLINE" "CIRCLE" "ELLIPSE"
(AUTOLOAD "arrow line" '("arw")) ; draw a arrow line on stairs, plan view
(AUTOLOAD "ArrowDrainage" '("darrow")) ; draw a drainage arrow
(AUTOLOAD "Arrows by Tim W" '("DPA")) ; draw a hollow arrow, by Tim Willey
(AUTOLOAD "AttrMatch CAB" '("AttrMatch" "attrm" "attm")) ; Match block Attributes
(AUTOLOAD "Block 2 Layer 0-CAB" '("FixBlock")) ; Repair Block Layers
(AUTOLOAD "Block UnmirrorCAB" '("bum")) ; Unmirror blocks picked
(AUTOLOAD "BlockDel CAB" '("BlockDel")) ; Delete ALL matching blocks & purge the DWG
I've reached the age where the happy hour is a nap. (°¿°)
Windows 10 core i7 4790k 4Ghz 32GB GTX 970
Please support this web site.

John Kaul (Se7en)

  • Administrator
  • Needs a day job
  • Posts: 9248
Re: Why, Oh Why!?
« Reply #13 on: May 21, 2009, 03:44:16 PM »
CAB, ah. I see. kinda cool.

jammie,
I had a closer look at your routine and i couldnt really get you procedure to work so i whiped up my own.

I was thinking something along these lines. ...this could be modified to accept a list of commands to closer resemble autoload, but this is more of a proof of concept kinda thing.

This is a brief example on how I would go about making my own `autoload' procedure.

For example:
In my lisp file (C:\test.lsp) I have the following:

Code: [Select]
(defun c:ebt ( / ) (alert "I'm a lisp command"))

In my other lisp file I would define a simple hook procedure.

Code: [Select]
(defun hook ( func path )
  ;; given: (hook "EBT" "C:\\test.lsp")
  ;; >
  ;;  (DEFUN C:EBT (/) (DEFUN C:EBT (/) (PRINC "\n[ EBT ] Command not availble") (PRINC)) (LOAD "C:/test.lsp") (C:EBT))
  (eval
   (list
     'defun
     (read (strcat "c:" func))
     '( / )
       (list 'defun
             (read (strcat "c:" func))
             '( / )
             (list 'princ
                   (strcat "\n[ " func " ] Command not availble"))
                   (list 'princ))
     (list 'load path)
     (list (read (strcat "c:" func))))) )

Then I can just hook the commands I want to be `autoloaded' (hooked)

Code: [Select]
(hook "EBT" "C:\\test.lsp")
(hook "TBE" "C:\\test.lsp") ; not defined in file

Simple and effective? ...maybe. I still kinda agree with CAB though; just load it.
« Last Edit: May 21, 2009, 04:02:04 PM by Se7en »
“Common sense is not so common.” ~Voltaire

--> Donate to TheSwamp.org <--

CAB

  • Global Moderator
  • Seagull
  • Posts: 10362
Re: Why, Oh Why!?
« Reply #14 on: May 21, 2009, 03:47:29 PM »
OBTW welcome to The Swamp jammie 8-)
I've reached the age where the happy hour is a nap. (°¿°)
Windows 10 core i7 4790k 4Ghz 32GB GTX 970
Please support this web site.