mwade93 Posted September 30, 2013 Share Posted September 30, 2013 (edited) I have discovered through my coding that diesel does not like spaces very much. I have been trying to use quotes but even those have not been functioning properly inside. Here is an example of what I mean: setenv;users1;$M=$(getvar,ctab); This works when there is no space in the layout name. However if a layout is B 17 x 11, it will set users1 to b as if there were no quotes around ctab. So my question is, is there any way to set it where the name will be stored properly. Quotes around ctab and around the whole diesel do not work. Edited October 2, 2013 by mwade93 Quote Link to comment Share on other sites More sharing options...
Tyke Posted October 1, 2013 Share Posted October 1, 2013 In general it is recommended to use a semicolon instead of a space in the command string of the macro. It makes it a lot easier to understand and you can see how many returns/spaces you have. Using quotation marks around names with spaces should work without a problem, at least there has never been a problem in my command strings. Quote Link to comment Share on other sites More sharing options...
mwade93 Posted October 1, 2013 Author Share Posted October 1, 2013 I have problems each time I issue this string with or without the quotes. Its the name of the tab not the space in the string I am having issues with. Quote Link to comment Share on other sites More sharing options...
Tuns Posted October 2, 2013 Share Posted October 2, 2013 I know you've told me about this one before, but I'll look to see if anything can be done when I get to work tomorrow. Quote Link to comment Share on other sites More sharing options...
Tyke Posted October 2, 2013 Share Posted October 2, 2013 The problem lies in the fact that there is space in the environment variable that you saved the layout name and when you call the environment variable the space is interpreted by AutoCAD as a return, as are all spaces entered in the command line. After you have saved the the layout name to the USERS1 environment variable you must when wanting to use this value assign the stored value to a normal variable and then use this variable in your DIESEL expression. Or try evaluating the text in the returned expression $M=$(eval,$(getenv,ctab) this would then treat the returned value as a text string. Quote Link to comment Share on other sites More sharing options...
mwade93 Posted October 2, 2013 Author Share Posted October 2, 2013 I can't save the layout name in the variable. That is where the problem lies. Quote Link to comment Share on other sites More sharing options...
Tuns Posted October 2, 2013 Share Posted October 2, 2013 You can't use what tyke said to save it in the variable? Is the problem occurring when you call out that variable? Quote Link to comment Share on other sites More sharing options...
mwade93 Posted October 2, 2013 Author Share Posted October 2, 2013 I tried what Tyke said and this is what happens (also you can see the layout names I am working with right now): [ATTACH=CONFIG]44300[/ATTACH] It just sits and waits here. This is how I used the code: setenv;users1;$M=$(eval,$(getenv,ctab); It seems to not like the eval part. Quote Link to comment Share on other sites More sharing options...
Tyke Posted October 2, 2013 Share Posted October 2, 2013 I can't save the layout name in the variable. That is where the problem lies. I'm not on my AutoCAD machine at the moment, but the handling of strings in DIESEL is a known difficulty. Have a look at this link and see if that helps: http://www.crlf.de/Dokumente/Diesel/Diesel2.html Quote Link to comment Share on other sites More sharing options...
mwade93 Posted October 2, 2013 Author Share Posted October 2, 2013 I will do that when I get home, that will be blocked here on my computer at work. Thanks for your help though. Quote Link to comment Share on other sites More sharing options...
Tyke Posted October 2, 2013 Share Posted October 2, 2013 I will do that when I get home, that will be blocked here on my computer at work. Thanks for your help though. The article basically explains how to use triple quotes. The quote-quote-quote Unfortunately has a lot of problems as soon as you create complicated macros. DIESEL uses a limited string space and you can easily crash AutoCAD by exceeding this limit. Also the handling of quotes is not easy to understand, if ever. From the main text you know that $(strlen,"Hello,world!") returns 12, and $(strlen,Hello,world!) returns 5. But would you imagine that $(strlen,Hello","world!) also returns 12? Even more strange is that quotes get lost during the DIESEL . What do you expext this expression to return? $(substr,$(strlen,"Hello,world!"),1,1) I would expect it to return 1, but certainly not 5! If you look at the macro trace, you see what happens: Eval: $(SUBSTR, $(strlen,Hello,world!), 1, 1) Eval: $(STRLEN, Hello, world!) ===> 5 ===> 5 As soon as the string is passed to the substr DIESEL function, the quotes are lost. Therefore the strlen funktion consequently returns 5. To pass the quotes through the substr function to the nested strlen function, you need to add some more quotes: $(substr,$(strlen,"""Hello,world!"""),1,1) Eval: $(SUBSTR, $(strlen,"Hello,world!"), 1, 1) Eval: $(STRLEN, Hello,world!) ===> 12 ===> 1 Every level of nesting the number of quotes. Therefore you need to know in advance how many levels down you still need quotes. Suppose you want to add 1 to the result above. Now the correct DIESEL expression is: $(+,1,$(substr,$(strlen,""""""""Hello,world!""""""""),1,1)) Eval: $(+, 1, $(substr,$(strlen,"""Hello,world!"""),1,1)) Eval: $(SUBSTR, $(strlen,"Hello,world!"), 1, 1) Eval: $(STRLEN, Hello,world!) ===> 12 ===> 1 ===> 2 Have you tried using 'macro trace'? Quote Link to comment Share on other sites More sharing options...
mwade93 Posted October 2, 2013 Author Share Posted October 2, 2013 That's a lot to digest but I will give it a shot. Quote Link to comment Share on other sites More sharing options...
Tyke Posted October 2, 2013 Share Posted October 2, 2013 That's a lot to digest but I will give it a shot. Best of luck and let us know how it goes. Quote Link to comment Share on other sites More sharing options...
mwade93 Posted October 2, 2013 Author Share Posted October 2, 2013 So here is what I have so far from my understanding of the article: $M=$(substr,"""""B 17""""",1)^Z Command Line Command: Eval: $(SUBSTR, ""B 17"", 1, 4) ===> B 17 BLOCK Enter block name or [?]: *Cancel* This gives me variable as B if I use it in setenv. So it is pulling it right but I am confused after that. Here is another thing I tried: ^C^C^Csetenv;users1;"$M=$(substr,"""""B 17""""",1,4)";^Z Command Line Enter variable name: (Should be variable here) Value : Eval: $(SUBSTR, ""B 17"", 1, 4) ===> B 17 Command: GETENV Enter variable name: users1 $M=17""""",1,4) This code works if I am on the model tab. This version pulls out mode because of the length of 4 I have it pulling. ^C^C^Csetenv;users1;$M=$(substr,$(getvar,ctab),1,4);^Z Quote Link to comment Share on other sites More sharing options...
Tyke Posted October 2, 2013 Share Posted October 2, 2013 This code works if I am on the model tab. This version pulls out mode because of the length of 4 I have it pulling. ^C^C^Csetenv;users1;$M=$(substr,$(getvar,ctab),1,4);^Z When using substr the first argument is the starting position and the second argument the length of the string to return. If you think that the maximum length of the layout name will be say 16 then use as the second argument a length of 20. It will not cause an error and you can be reasonably sure of always getting the whole layout name. Quote Link to comment Share on other sites More sharing options...
mwade93 Posted October 2, 2013 Author Share Posted October 2, 2013 Yes, I was just messing with those to learn them, it still does not work with my layouts that have spaces though, just pulls the part of the string that occurs before the space. Adding more and more quotes did not seem to cure the issue. Quote Link to comment Share on other sites More sharing options...
Tyke Posted October 2, 2013 Share Posted October 2, 2013 Yes, I was just messing with those to learn them, it still does not work with my layouts that have spaces though, just pulls the part of the string that occurs before the space. Adding more and more quotes did not seem to cure the issue. With the quotes, you need double quotes to start off with and then a quote for each level you go down, and of course balance the number of quotation marks at the end. By level they mean each time you have a $(...). It's a public holiday here tomorrow so I'll see if I can get to test it on an AutoCAD LT 2014 computer at home. Don't give up. Quote Link to comment Share on other sites More sharing options...
mwade93 Posted October 2, 2013 Author Share Posted October 2, 2013 I wasn't planning on it. I have some more time this afternoon, I will keep working at it. It is probably something stupid that is going to work, it always is...lol Quote Link to comment Share on other sites More sharing options...
Tyke Posted October 6, 2013 Share Posted October 6, 2013 I eventually got round to looking at this a bit closer and have come up with the solution. The following code works fine for me on layout names with spaces: ^C^C_setenv;Users1;$M=""""$(getvar,ctab)""""; Hope that it works for you too. Quote Link to comment Share on other sites More sharing options...
steven-g Posted October 6, 2013 Share Posted October 6, 2013 When you see it, it makes sense, I had tried all sorts of combinations up to """ 3 quotes. Well done that man. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.