I have a lisp where i am inserting a block and exploding it. so what i done is put an * infront of the block o explode it. when i insert it. it will explode but it rotates the block slightly. can anyone help. see lisp below.
(defun C:aa()
(setvar "cmdecho" 0)
(command "-insert" "*aa" pause
(getvar "dimscale")
(getvar "dimscale")
0
)
(setvar "cmdecho" 1)
(princ)
)
Solved! Go to Solution.
Solved by Kent1Cooper. Go to Solution.
Set cmdecho to 1 in your lisp,
run the command and check the textscreen[F2] what happen.
Can you see the problem?
I guess your block aa is defined to 'scale uniformly' ? Then you will see that you put in a rotation of <whatever (getvar "dimscale") value is>
and then you fire a "0" to the commandline, what isn't a command.
Without you file, hard to say..
Sebastian
Hi,
Try this......
(defun C:aa()
(setvar "cmdecho" 0)
(command "-insert" "aa" pause (getvar "dimscale") (getvar "dimscale") 0)
(command "explode" (cdr (assoc -1 (entget (entlast)))));; To Explode either use this
;(command "explode" (ssname (ssget "l") 0));; Or use this (ie. to Explode)
(setvar "cmdecho" 1)
(princ)
)
@Anonymous wrote:
I have a lisp where i am inserting a block and exploding it. so what i done is put an * infront of the block o explode it. when i insert it. it will explode but it rotates the block slightly. ….
When you INSERT something pre-exploded like that, it does not ask for both X and Y scale factors, but only for one scale factor, whether or not the Block is defined for uniform scaling. It's taking your second scale-factor answer as the rotation angle. Remove one of those (getvar "dimscale") entries.
I remove the "*" and added an explode and it worked. like below.
(defun C:aa()
(setvar "cmdecho" 0)
(command "-insert" "aa.dwg" pause
(getvar "dimscale")
(getvar "dimscale")
0
(command "explode" "last")
)
(setvar "cmdecho" 1)
(princ)
)
thanks for pointing me in the right direction.
Hi dbhunia, yours worked great too. I figure it out with adding a explode command. What i am trying to do here is create a second clipboard. Is it possible to have two commands in one lisp? i would like to be asked the name of the block i want to use and for it to retain that next time i use autocad. so i guess one command to run the settings part as well.
thanks for the help
@Anonymous wrote:
I remove the "*" and added an explode and it worked. ....
Would you prefer to see it at dimscaled size as you place it? That's something that you can't do if Inserting it pre-Exploded, so if you're going to Insert it first and then Explode it, you may as well take advantage of the option to drag it into place visually, at the intended size [and rotation]. If so, you can give it the scale before the insertion point:
(defun C:aa ()
(setvar "cmdecho" 0)
(command
"-insert" "aa" "_scale" (getvar "dimscale") "_rotate" 0 pause
"explode" "last"
)
(setvar "cmdecho" 1)
(princ)
)
And in that situation, as with Inserting pre-Exploded, it asks for only one scale.
I took the .dwg off the aa, because 1) it's not needed [it won't Insert any other kind of file], and 2) once the Block is in the drawing, when you use it again, it may as well just use it from the Block definition that's now internal to the drawing, rather than reaching outside to the drawing file again every time.
[And I combined the two commands into one (command) function, which a lot of people apparently don't realize you can do.]
Hi,
As you asked.....
@Anonymous wrote:Hi dbhunia, yours worked great too. I figure it out with adding a explode command. What i am trying to do here is create a second clipboard. Is it possible to have two commands in one lisp? i would like to be asked the name of the block i want to use and for it to retain that next time i use autocad. so i guess one command to run the settings part as well.
..................
Try this.....
(defun C:aa( / Blk) (setvar "cmdecho" 0) (or *userinput1* (setq *userinput1* "")) (setq *userinput1* (if (= "" (setq Blk (getstring T (strcat "\nEnter Block Name <" *userinput1* ">: ")))) *userinput1* Blk)
) (command "-insert" Blk pause (getvar "dimscale") (getvar "dimscale") 0 (command "explode" "last") ) (setvar "cmdecho" 1) (princ) )
Hi dbhunia, that worked great but would it possible for it to remember the block name that was picked so i dont have to enter it everytime. thats what i was saying about a second command for the settings. would this require a dcl file?
@Anonymous wrote:
.... i would like to be asked the name of the block i want to use and for it to retain that next time i use autocad. so i guess one command to run the settings part as well. ....
For that, not just to retain it in the current editing session, probably the best thing is to use an Environment Variable, using the (setenv) and (getenv) functions. One way, very lightly tested [EDIT the blue parts]:
(defun C:YourCommandName (/ blk) (while (and (= "" ; empty string [Enter] (setq blk (getstring (strcat "\nBlock name for whatever purposes this is" (if (getenv "YourCommandNameBlock") (strcat " <" (getenv "YourCommandNameBlock") ">"); then "" ; else -- no default offered if no prior value ); if ": " ); strcat ); getstring ); setq ); = (not (getenv "YourCommandNameBlock")); no prior value ); and (prompt "\nEnter not allowed --") ); while (setenv "YourCommandNameBlock" (if (= blk ""); Enter when allowed (getenv "YourCommandNameBlock"); then -- prior value blk ; else -- User input other than Enter ); if ); setenv (setvar "cmdecho" 0) (command "-insert" (getenv "YourCommandNameBlock") "_scale" (getvar "dimscale") "_rotate" 0 pause "explode" "last" ); command (setvar "cmdecho" 1) (princ) ); defun
"YourCommandNameBlock" is the name of the environment variable. Unlike an AutoLisp variable, it will remain. Its name should include some aspect or abbreviation of whatever command name you use, so that it won't accidentally have conflicts with any other environment variables you may develop.
Can't find what you're looking for? Ask the community or share your knowledge.