AutoCAD Visual LISP / AutoLISP :: Loading Cuix From Bundle When User Is Not Administrator
Jun 5, 2013
We are using .cuix file which gives access to tools in custom .arx file in AutoCAD 2012/2013. We load the menu using the .bundle mechanism and the plug-in - using button from the menu. If the user is Administrator (or executes AutoCAD as Administrator) the menu, toolbars and ribbons are loaded correctly and the user can load and unload the application (lisp function in .mnl file is used for that), but if the user is not an administrator either the menu, toolbars and ribbons are not correctly loaded or they are loaded, but the user can not load the application.
We have found that a probable cause for this behaviour is that AutoCAD tries to create/renew the .mnr file when first loading a .cuix file and since the user has no administrator rights this can't be done in the "C:Program FilesAutodeskApplicationPlugins" folder where the bundle is and AutoCAD creates the .mnr file in its own support folder ("C:Users<User>AppDataRoamingAutodeskAutoCAD 2012R18.2...Support") together with a copy of the .cuix file and changes the path for loading the .cuix file to this location. Since the .mnl file containing the function for loading/unloading is not copied with the .cuix file the application can not be loaded.
The user has to delete the created files under the support path of AutoCAD, unload the .cuix file and then reload it from the correct location to resolve the problem. Restarting AutoCAD leads to the same problem.
Is there a way to prevent this behavior other then running AutoCAD as administrator (that is not always an option)?
I would like to update a CUIX and rename it, both the file name and the internal customization group name/description. The main issue is that the associated MNL file will fail to load after the renaming.
The internal name is currently the same as the file name with spaces replaced by underscores.
I have tried the CUIX transfer method, I have tried simply renaming the file and leaving the internal name alone, I have also tried renaming to .ZIP, and modifying the one file inside that contains the internal name/description, recompiling the ZIP and renaming back to CUIX.
As stated above, using any of the above methods the main issue is that the associated MNL file will fail to load. This is with Civil 3D 2014. Also the customization group name may appear in the CUILOAD dialog without underscores and depending on the method the ribbon tabs will not even appear.
I've also noted that the MNL file associated with the partial CUIX loads twice in Civil 3D 2014 and only once in AutoCAD 2013. I haven't done further testing on that.
This is mainly cosmetic as our current CUIX has 2011 in the name and I would like to update to 2014.
I read Robert Bell's document “Migrating from MNU to the CUI” (Autodesk University 2007) with interest. I have been using 2005 up until now and I am finally forcing myself to get to grips with 2010.
I managed to get it to work after much trial and error through the CUI transfer interface.My customizing makes use of a lot of swapping pull-down menus, which swap in and out based on current later setting.A typical command would be:
(MENUCMD "P15=RCASPOPS.mfireeqp") where RCASPOPS is my swapping menu loaded at POP15.
Then I would use (MENUCMD "P15=*") to force the “mfireeqp” area of the pull-down menu to display.Trouble is, when I CUIload RCASPOPS, it does not seem to recognize the various areas of the menu.Here is a part of that subsection of RCASPOPS:
Typically the whole of RCASPOPS is loaded but when I try to force it to display, the whole of it pops on the screen (well, the top of the file does anyway) and not just the subsection I want.
Is this a syntax issue with the newer AutoCad?Also notice that I use the -> and <- for fly-out sections of the menu - is there a syntax issue with this? I notice that the future support of drop down swapping menus is not guaranteed. What is the alternative?
Retrieving a list of Workspaces from menu files .cui and .cuix
The function to use is (workspacelist) which returns a list of workspace names, similar to (layoutlist) for retrieving a list of Layout names.
The functionality for extracting "WorkspaceRoot.cui" from .cuix requires copying the .cuix to .zip so that it can be accessed as a Windows compressed (zipped) folder which the Windows object "Shell.Application" provides.
Please rename the attachment to .lsp
I received the following error when I tried to post the .lsp: "The contents of the attachment doesn't match its file type."
I'm able to add custom panels/buttons into the Ribbons, by cloning the existing ribbon (from acade.cuix) into my partial cuix. However.. I'm not able to add more commands to the shortcut menus, using the same technique.
Is it possible to add custom commands to existing shortcut menus using a partial cuix?
how to program in lisp. I have a master lisp routine that runs when Autocad is opening. I have some computers running Autocad 2010 and others with Autocad 2012 and from the master lisp routine (which is the same) I need to load a net assembly (one for Autocad 2010 or another for Autocad 2012).
I was thinking to query for Autocad version and if it is Autocad 2010, then load the first dll, or if it is Autocad 2012 then load the second dll, but I don't know how to do this in lisp.
I have a little LISP I have been working on that creates a text object as a "label" for 2D ductwork our company does. It makes a field for the mlinescale as the duct width, combines with user input for duct depth, and prompts user for location to place the text. The routine is functional...however, I would like to tweak two things that I cannot figure out.
First, I would like the command to continue until the user escapes, similar to the "multiple" command in AutoCAD. I have tried adding a while loop to the majority of the routine..which works until the user escapes...then my error handler undoes everything.
Second, when asking for user input, is it possible to ask for user input without a default the first time, but thereafter remember the input as a default?
Below is the code in question...not including error handler, etc. :
(if (= ducttemp nil)(setq ducttemp 12)) (initget 6) (setq ductdepth (getint (strcat " Enter duct depth in inches <" (itoa ducttemp) ">, or Esc to end: "))) (if (= ductdepth nil) (setq ductdepth ducttemp) (setq ducttemp ductdepth))
I want to write a very simple AutoLISP program to scale selected objects by a factor of (1/25.4). How to I get the program to pause and allow the user to select the base point? I know that "~" will bring up a selection window, but what is the character that will allow point selection (in this context)? While we're at it, what is the operator that would trigger a pause and allow user command line input?
We have been using Custom profiles for many years. We have always had issues that just after we install, we have to reload the custom profile to get it in place. When I say reload, I mean we launch the program the first time with a /p <profile name>. (The path to our custom profile is in the string launch string.) Seems to default to a random profile, or something we don't recognize. The process here is we are pushing out installs to 200 users and don't want each user to set one of the defaults current, delete our custom one, reload our custom one and set it current.
Once the profile is loaded the next times opening all is well. Because, of course, it was last used.
What am I missing or misunderstanding? We see the profile exists in the registry before we reload. The custom profile we use is an export.
This works great so long as the user is not in the middle of another lisp routine.How can I change this to a transparent command that will work to set osnaps while running another lisp routine?I would like to store it in a toolbar button.
Is there a way to have an alert box pop up at a certain point in the code which gives the user a chance to cancel the LISP program and not proceed any further?
I am looking for a way where a user is prompted to select a row of blocks and then that row is completely mirrored about the middle of the selection set - such that if the blocks are originally inserted, from left to right "A" "B" C" then after mirroring, we want them t occupy (roughly) the same space in the drawing area as "C" "B" "A".
Then, immediately after mirroring that selection set in place, each individual block that makes up the selection set is mirrored about its insertion point along the x axis..... basically i need to mirror a selection set of a row of blocks so I change their order of occurrence and then mirror each individual block back again to the way it is meant to look.
I have situation where a block is inserted in paperspace before a leader is to be added into modelspace. I need it to work like the "CHSPACE" command - it pauses and asks the user to activate a viewport before continuing.
Is there a way to determine the type of ACAD object that the user selected? I need to retrieve the value from either a dimension or text. The info could be in either format so the lisp routine needs to determine what was selected so the correct vla-get command is used.
Once I determine what the object is I can use an if statement to retrieve the value.
;user selects the object (setq dimobj (vlax-ename->vla-object(car(entsel)))) ;If ACAD object is a dimension do this. (setq dimvalue (vla-get-textoverride dimobj)) ;If ACAD object is text do this. (setq dimvalue (vla-get-textstring dimobj))
I'm putting together a simple lisp routine to issue bound, purged drawings.
I have code that will do the binding & purging but need handling the saving.
This is my approach :
(1) ask the user to save the drawing using this line (command "_saveas" "" "~")
(2) run a subroutine that binds xrefs etc (this works ok)
(3) run the QSAVE command
Trouble is, if the user cancels or hits escape during the SAVEAS command the subroutine & QSAVE will still run, overwriting the current drawing. How do I handle this scenario? Or should my appoach be different?
Main question: I need the user to be able to type a command. Then use it or cancel it. Then i need them to type another lisp command. In the second command i need to know (have the string of) the previous command they typed in. How do i get that string?
What I have tried.
I have looked at "LASTPROMPT" though not extensively, and i believe it would just return "ineedhelp" if i tried that.
I have looked at "CMDNAMES" but that gives the command you're currently in.
And I have found one page on this forum titled: Command Line History Macro, but there was no answer on that post.
I could create a global variable for that string, but then I would have to put the set code in every function I create. Nope, will not.
Backstory:
There's a person that is going to make how-to videos on how to use some of my lisp routines.
Anyhow, I need the user to be able to type in "ineedhelp" and the lisp that runs must get the last command's string go to the shared drive and pull up the video file for that command.
I have made a lisp that opened a word file before, and if i could get the string of the previous command, i'm fairly certain that I can get the videos to work.
There will be approximately 60 lisp routine video's.
I have a list function that asks for the user to pick points when it is run. It looks something like this (foo arg1 arg2) When invoked it asks the user to pick points and press enter when done It.
Instead of getting the points from the user i want to pass it a list of pre-defined points. The code cannot be changed so I must use it as is.Is this possible, if so how can it be done?
I'm trying to change a routine i just wrote that draws 3d pipes. I wanted to make it so that when a user selects the beginning point and ending point of the pipe, the LISP changes the ucs to that vector, draws the circle at the beginning point and extrudes it to the second point.
It actually works great except when the ucs changes, so do my user points because of teh origin change. Is there a better way I might get this to do what I wnat it to?
(setq ip (getpoint " Pick First Point:"))(setq ep (getpoint " Pick Second Point:"))(command ".ucs" "za" ip ep)(setvar "osmode" 0)(command ".circle" ip "d" od)(command ".extrude" (entlast) "" (distance ip ep))(command ".ucs" "w")(setvar "osmode" oldsnap))