ZBrushCentral

ZScript Lesson II: ISliders

This lesson is the second in an ongoinging series. It’s designed to follow ZScript Lesson I: IButtons and Formatting.

Thank you all for the terrific responses to Lesson I. :slight_smile: To give people more time to practice and discuss the skills presented in these lessons, Lesson III will be presented in two weeks’ time.

<hr>


In this lesson, you’ll create the ZScript shown above. Each line of sliders displays some settings for Tool, Color, Material and Texture, which you can “grab” from the ZBrush interface by pressing the Grab button. Once grabbed, you can edit the settings by adjusting the sliders. Any time you like, you can change the ZBrush palettes to these settings by pressing the Apply button.

In Lesson I, you learned how to create interactive buttons using the IButton command. In this lesson you’ll learn how to create and manipulate interactive sliders, using the ISlider command.

<font color="#ffa000" size=“3”>1) Examining the ISlider Command</font>
In this section you’ll become familiar with the ISlider command and its arguments. If you’re already familiar with the ISlider command, you can skip to section 2.

The ISlider command is similar to the IButton command, with a few more arguments that describe the way it slides.

Here are the arguments:
<blockquote> </blockquote>
The Slider Text, Popup Info, Commands Group, Initially Disabled and Slider Width arguments are the same as their counterparts in the IButton command, except that the Commands Group executes whenever the slider is moved.

The remaining arguments are simple:

Starting Value is the value displayed in the slider when it’s first loaded. Don’t be confused – this isn’t the lowest possible number the slider can have – that argument is the Minimum Value. The Starting Value could be the same as the slider’s Minimum Value, Maximum value, or anything inbetween.

Resolution is the amount of each “tick” of the slider – that is, the smallest amount by which the slider can change. Suppose the Starting Value is 0; a Resolution of 1 means the slider can change to values like 0,1,2,3 and so on. A Resolution of 10 means the slider can change to values like 0,10,20,30 and so on. A Resolution of .05 means the slider can change to values like 0,.05,.10,.15 and so on.

Minimum and Maximum Values are the numbers at the far left and right ends of the slider. Your slider can go from 0 to 10, 1 to 100, -255 to 255, or any two numbers as long as the Minimum Value is less than the Maximum Value.

Here’s a typical way you might use the Slider:
<blockquote><table border=“0” cellpadding=“6” cellspacing=“0” bgcolor="#cccccc"><tr><td bgcolor="#cccccc"><font color=“black” size=“2”>[ISlider,“Set The Draw Size”,
64, 1, 1, 128,
“This Sets the Draw Size”,
[ISet,Draw: Draw Size,[IGet,ZScript:Set The Draw Size]]
]
</font></td></tr></table></blockquote>
This slider looks like this:

It has a Starting Value of 64, and goes from 1 to 128 (Minimum and Maximum Values) in increments of 1 (Resolution). When you change it, the Commands Group executes (and the Draw Size is changed to match its value). We’ll examine the commands in the Commands Group later.

Notice something about the slider: you can’t see the value of the slider unless you hold your cursor over it:

Not only do you see the Popup Text, but the Slider Text moves to the right in the ISlider and the value appears.

You can create the slider so the value is always displayed, by changing its width to allow enough room for the Slider Text and the value. Do this by adjusting the Slider Width argument:
<blockquote><table border=“0” cellpadding=“6” cellspacing=“0” bgcolor="#cccccc"><tr><td bgcolor="#cccccc"><font color=“black” size=“2”>[ISlider,“Set The Draw Size”,
64, 1, 1, 128,
“This Sets the Draw Size”,
[ISet,Draw: Draw Size,[IGet,ZScript:Set The Draw Size]]
,200
]
</font></td></tr></table></blockquote>
Now, the slider displays its value even when your cursor is not floating over it:

<hr><font color="#ffa000" size=“3”>2) Variables and The VarSet Command</font>
You’ll work a little backward on this ZScript: you’ll first lay out the ISliders and IButtons, then later you’ll insert a Commands Groups into each one.

In the next section, you’ll create a single line of ISliders and IButtons that looks like this:

You’ll need to know the width of each ISlider and IButton. You could meticulously figure out each width, but by planning ahead you can let ZBrush calculate the widths for you.

In the above image, notice that there are two sizes: small and large. The large size is twice the width of the small size. So first, figure out the small size. Count the items in the image, counting once for each small item and twice for each large item, and once for the space between the two IButtons. Your count should be 11:

You’ll use a PageSetWidth command to set the page width to 640 (ZBrush’s default canvas width, and the only canvas width possible for Demo users). So, the width of each small item is 640 divided by 11.

Use a variable to tell ZBrush that a “small width” is 640/11 (the slash means “divided by”). The command which does this is VarSet.
<blockquote><table border=“0” cellpadding=“6” cellspacing=“0” bgcolor="#cccccc"><tr><td bgcolor="#cccccc"><font color=“black” size=“2”>[VarSet,
Variable Name,
Value
]
</font></td></tr></table></blockquote>
The Variable Name can be anything you like, as long as it’s spelled with letters and numbers. In this case, call it SmallWidth, so you can remember it easily.
<blockquote><table border=“0” cellpadding=“6” cellspacing=“0” bgcolor="#cccccc"><tr><td bgcolor="#cccccc"><font color=“black” size=“2”>[VarSet,
SmallWidth ,
640/11
]
</font></td></tr></table></blockquote>
Variables are extremely useful; you can use them in your ZScripts in any place you’d use a number, and even sometimes where you’d use a word or phrase, or a brushstroke.

Now ZBrush knows that whenever you put the word ‘SmallWidth’ in a command, it’ll use the value of 640 divided by 11.

Create another variable for your large item widths. The large items are twice the size of the small items, and you’ve already specified a variable for the small widths, so you’ll use another VarSet:
<blockquote><table border=“0” cellpadding=“6” cellspacing=“0” bgcolor="#cccccc"><tr><td bgcolor="#cccccc"><font color=“black” size=“2”>[VarSet,
LargeWidth ,
SmallWidth * 2
]
</font></td></tr></table></blockquote>
The asterisk (*) means “multiplied by”.

So far, your ZScript looks like this (with the VarSets condensed to one line each):
<blockquote><table border=“0” cellpadding=“6” cellspacing=“0” bgcolor="#cccccc"><tr><td bgcolor="#cccccc"><font color=“black” size=“2”>[PageSetWidth,640]
[VarSet, SmallWidth, 640/11]
[VarSet, LargeWidth, SmallWidth * 2]
</font></td></tr></table></blockquote>
One thing you should know: the two VarSet commands must appear in this order. Why? Because the second VarSet command uses a variable you’ve already created, SmallWidth. If it hadn’t already been created, ZBrush wouldn’t know what value to use for SmallWidth, and you’d get an error message when you loaded the ZScript.

<hr><font color="#ffa000" size=“3”>3) Laying It Out, and Comments</font>
Now that you’ve got the widths figured out, you can lay out the first line of ISliders and IButtons.

As I mentioned before, you’ll work a little backward: you’ll lay them out first, and later insert the Commands Groups into each one. To help you find the place where each Command Group goes, you’ll insert a Comment.

Comments are not really commands; they’re simply notes to yourself or other “ZCoders”. One way to write Comments is with a double-slash:
<blockquote><table border=“0” cellpadding=“6” cellspacing=“0” bgcolor="#cccccc"><tr><td bgcolor="#cccccc"><font color=“black” size=“2”>[IButton,Button,Popup,
// Commands Group will go here
]
</font></td></tr></table></blockquote>
Comments can go anywhere, inside or outside ZScript commands. ZBrush completely ignores everything after the //, up through the end of the line. When the ZScript is loaded, Comments are not displayed.

In this case, you’ll place a Comment into each ISlider and IButton, so you can easily find where to insert the Commands Groups later.

Start with the first ISlider which displays the Tool Item Info number.

Decide on the arguments:
:white_small_square:Slider Text = “Tool”
:white_small_square:Starting Value = let’s make it 1.
:white_small_square:Resolution = You know the Tool Item Info numbers are 1,2,3, etc., so this should be 1.
:white_small_square:Minimum Value = 0 (smallest possible Tool Item Info number)
:white_small_square:Maximum Value = let’s make it 38, the largest Tool Item Info number in the Tool Palette if no tools have been loaded. But we’ll take another look at this later…
:white_small_square:Popup Info = “Tool Item Info Number”
:white_small_square:Commands Group = for now, it’ll be a Comment: // Commands Group goes here
:white_small_square:Initially Disabled? = empty
:white_small_square:Slider Width = the variable, SmallWidth.

Plug these arguments into the ISlider command (some arguments are placed together on one line):
<blockquote><table border=“0” cellpadding=“6” cellspacing=“0” bgcolor="#cccccc"><tr><td bgcolor="#cccccc"><font color=“black” size=“2”>[ISlider,Tool,
1, 1, 0, 38,
“Tool Item Info Number”,
// Commands Group goes here
,
, SmallWidth
]
</font></td></tr></table></blockquote>
Notice something important: where I’ve put the Comment, I’ve put the comma on the next line. You might be tempted to put the comma right after the Comment ( // Commands Group goes here, ) but remember, everything after the double slash (//) is ignored – so this would mean even the comma was ignored.

Note: In some of these ISliders, you won’t replace the Comments with Commands Groups, but that’s okay – the Comments won’t change the way they work.

Now for the three Color components: Red, Green and Blue. Each can go from 0 to 255, in increments of 1 (Resolution). For each, start with a value of, let’s say, 128.
<blockquote><table border=“0” cellpadding=“6” cellspacing=“0” bgcolor="#cccccc"><tr><td bgcolor="#cccccc"><font color=“black” size=“2”>[ISlider,R,
128, 1, 0, 255,
“Red Component”,
// Commands Group goes here
,
, SmallWidth
]

[ISlider,G,
128, 1, 0, 255,
“Green Component”,
// Commands Group goes here
,
, SmallWidth
]

[ISlider,B,
128, 1, 0, 255,
“Blue Component”,
// Commands Group goes here
,
, SmallWidth
]</font></td></tr></table></blockquote>
Same for the Material ISlider, but this time use the LargeWidth variable. The Material palette can go from 0 to 65; use a Starting Value of 1:
<blockquote><table border=“0” cellpadding=“6” cellspacing=“0” bgcolor="#cccccc"><tr><td bgcolor="#cccccc"><font color=“black” size=“2”>[ISlider,Material,
1, 1, 0, 65,
“Material Item Info Number”,
// Commands Group goes here
,
, LargeWidth
]
</font></td></tr></table></blockquote>
Now the Texture ISlider. Similar to the Tool palette, the Texture palette starts with items from 0 to 44, but can be expanded. So use 44 as the maximum, but we’ll take another look at this later…
<blockquote><table border=“0” cellpadding=“6” cellspacing=“0” bgcolor="#cccccc"><tr><td bgcolor="#cccccc"><font color=“black” size=“2”>[ISlider,Texture,
0, 1, 0, 44,
“Texture Item Info Number”,
// Commands Group goes here
,
, LargeWidth
]
</font></td></tr></table></blockquote>
Now for the Grab IButton. This button will examine the various ZBrush palettes, and put those (current) values into these ZScripted ISliders. Again, use a Comment to tell yourself where the Commands Group will be placed later:
<blockquote><table border=“0” cellpadding=“6” cellspacing=“0” bgcolor="#cccccc"><tr><td bgcolor="#cccccc"><font color=“black” size=“2”>[IButton,Grab,“Grab Current Values”,
// Commands Group goes here
,
, SmallWidth
]
</font></td></tr></table></blockquote>
Move the “Pen” forward one SmallWidth:
<blockquote><table border=“0” cellpadding=“6” cellspacing=“0” bgcolor="#cccccc"><tr><td bgcolor="#cccccc"><font color=“black” size=“2”>[PenMove, SmallWidth]</font></td></tr></table></blockquote>
Finally, the Apply IButton, which will do the opposite of the Grab IButton: take the value of each ZScripted ISlider, and place that value into the appropriate ZBrush palette.
<blockquote><table border=“0” cellpadding=“6” cellspacing=“0” bgcolor="#cccccc"><tr><td bgcolor="#cccccc"><font color=“black” size=“2”>[IButton,Apply,“Apply These Values”,
// Commands Group goes here
,
, SmallWidth
]
</font></td></tr></table></blockquote>

<hr><font color="#ffa000" size=“3”>4) Expandable Sliders: IGetMax and ISetMax</font>
In the last section I promised we’d “take another look” at the Maximum Values of the Tool and Texture ISliders.

Wouldn’t it be nice if the Tool ISlider first checked how many items were in the Tool palette, and adjusted itself to match that number?

The command which does this is IGetMax:
<blockquote><table border=“0” cellpadding=“6” cellspacing=“0” bgcolor="#cccccc"><tr><td bgcolor="#cccccc"><font color=“black” size=“2”>[IGetMax,Interface Item Path ]</font></td></tr></table></blockquote>
In this case:
<blockquote><table border=“0” cellpadding=“6” cellspacing=“0” bgcolor="#cccccc"><tr><td bgcolor="#cccccc"><font color=“black” size=“2”>[IGetMax,Tool:Item Info]</font></td></tr></table></blockquote>
In your ZScript, go back to the Tool ISlider and replace the Maximum Value (38) with this IGetMax command:
<blockquote><table border=“0” cellpadding=“6” cellspacing=“0” bgcolor="#cccccc"><tr><td bgcolor="#cccccc"><font color=“black” size=“2”>[ISlider,Tool,
1, 1, 0, [IGetMax,Tool:Item Info],
“Tool Item Info Number”,
// Commands Group goes here
,
, SmallWidth
]
</font></td></tr></table></blockquote>
Do the same for the Texture ISlider:
<blockquote><table border=“0” cellpadding=“6” cellspacing=“0” bgcolor="#cccccc"><tr><td bgcolor="#cccccc"><font color=“black” size=“2”>[ISlider,Texture,
0, 1, 0, [IGetMax,Texture:Item Info],
“Texture Item Info Number”,
// Commands Group goes here
,
, LargeWidth
]
</font></td></tr></table></blockquote>
That works perfectly, the first time the ZScript is loaded. But what if you change the number of tools or textures afterward?

You can use the ISetMax command to change the Maximum Value of any ISlider you create.
<blockquote><table border=“0” cellpadding=“6” cellspacing=“0” bgcolor="#cccccc"><tr><td bgcolor="#cccccc"><font color=“black” size=“2”>[ISetMax,ZScript:ISlider name, Value ]</font></td></tr></table></blockquote>
Note: you cannot use ISetMax on ZBrush interface items, only the ISliders you create in your ZScripts.

You’ll use this command so that each time the Tool and Texture ISliders are changed, they examine the Tool and Texture palettes to see if there’s a new number of items. Unfortunately, this will have to be done after the slider is changed. This means, once you’ve loaded a tool, the Tool ISlider won’t “know” it’s there until after the first time you move the ISlider.

For the ISetMax’s value, you can use another IGetMax:
<blockquote><table border=“0” cellpadding=“6” cellspacing=“0” bgcolor="#cccccc"><tr><td bgcolor="#cccccc"><font color=“black” size=“2”>[ISetMax,ZScript:Tool,[IGetMax,Tool:ItemInfo]]</font></td></tr></table></blockquote>
Find the Comment in the Tool ISlider and replace it:
<blockquote><table border=“0” cellpadding=“6” cellspacing=“0” bgcolor="#cccccc"><tr><td bgcolor="#cccccc"><font color=“black” size=“2”>[ISlider,Tool,
1, 1, 0, [IGetMax,Tool:Item Info],
“Tool Item Info Number”,
[ISetMax,ZScript:Tool,[IGetMax,Tool:ItemInfo]]
,
, SmallWidth
]
</font></td></tr></table></blockquote>
This works well, but what if there are more than one sliders called “Tool”? There’s another, even simpler way to write the ISetMax command, which I’ll explain in the next section.

<hr><font color="#ffa000" size=“3”>5) A Neat Feature</font>
In the last section you learned that interface item path to any ZScript IButton or ISlider is 'ZScript: Item Name '.

This could get confusing, especially if there are two or more ISliders or IButtons with the same name.

In the case of the Tool ISlider, you entered ‘ZScript:Tool’ as the interface item path (within the ISetMax command). You can replace that entire phrase ‘ZScript:Tool’ with the number 0. This is a special way to tell any IButton or ISlider that it’s referring to itself. In this case:
<blockquote><table border=“0” cellpadding=“6” cellspacing=“0” bgcolor="#cccccc"><tr><td bgcolor="#cccccc"><font color=“black” size=“2”>[ISetMax,0,[IGetMax,Tool:ItemInfo]]</font></td></tr></table></blockquote>
So the Tool ISlider looks like this:
<blockquote><table border=“0” cellpadding=“6” cellspacing=“0” bgcolor="#cccccc"><tr><td bgcolor="#cccccc"><font color=“black” size=“2”>[ISlider,Tool,
1, 1, 0, [IGetMax,Tool:Item Info],
“Tool Item Info Number”,
[ISetMax,0,[IGetMax,Tool:ItemInfo]]
,
, SmallWidth
]
</font></td></tr></table></blockquote>
What does the number 0 mean? It means “find the interface item that’s ‘this many’ away from this ISlider”. So you could enter a 1, and it would find the next ISlider or IButton, 2 for the one after that, and so on. Or you could enter -1 to find the previous ISlider or IButton, -2 for the one before that, and so on.

Don’t be confused: by “next” and “previous” I mean the next and previous ISlider or IButton in your ZScript text file, even though you may use PenMove commands to place it elsewhere in the ZScript window.

This number can be any number between -99 to 99. You can use this feature on any ZScript command that uses an Interface Item Path, to find other ZScript items.

So, with the Tool ISlider modified, do the same for the Texture ISlider:
<blockquote><table border=“0” cellpadding=“6” cellspacing=“0” bgcolor="#cccccc"><tr><td bgcolor="#cccccc"><font color=“black” size=“2”>[ISlider,Texture,
0, 1, 0, [IGetMax,Texture:Item Info],
“Texture Item Info Number”,
[ISetMax,0,[IGetMax,Texture:ItemInfo]]
,
, LargeWidth
]
</font></td></tr></table></blockquote>
We’ll use this “neat feature” again in the next section, when we write the Commands Groups for the Grab and Apply IButtons.

<hr><font color="#ffa000" size=“3”>6) Setting the Values: the ISet Command</font>
Now you’ll create the Commands Groups for the two IButtons. Each of them will use the ISet command:
<blockquote><table border=“0” cellpadding=“6” cellspacing=“0” bgcolor="#cccccc"><tr><td bgcolor="#cccccc"><font color=“black” size=“2”>[ISet, Interface Item Path ,
New Value
]
</font></td></tr></table></blockquote>
Note: unlike the ISetMax command, you can use ISet on any ZBrush or ZScript interface item.

First, the Grab IButton. This IButton “grabs” information from various ZBrush palettes, and changes the ISliders in this ZScript to match. For each ISlider, you’ll read the corresponding palette item with an IGet command, and set the ISlider with an ISet command.

Take another look at the layout of your ZScript items:

Notice the Tool ISlider is 6 items away from the Grab IButton. So, to tell the Grab IButton to find the Tool ISlider, you’ll use the number -6 (that’s 6 items previous).
<blockquote><table border=“0” cellpadding=“6” cellspacing=“0” bgcolor="#cccccc"><tr><td bgcolor="#cccccc"><font color=“black” size=“2”>[ISet,-6,[IGet,Tool:Item Info]]</font></td></tr></table></blockquote>
That takes care of the first command in this Commands Group.
The next three are for the Red, Green and Blue ISliders:
<blockquote><table border=“0” cellpadding=“6” cellspacing=“0” bgcolor="#cccccc"><tr><td bgcolor="#cccccc"><font color=“black” size=“2”>[ISet,-5,[IGet,color:r]]
[ISet,-4,[IGet,color:g]]
[ISet,-3,[IGet,color:b]]
</font></td></tr></table></blockquote>
Next are the Material and Texture ISliders:
<blockquote><table border=“0” cellpadding=“6” cellspacing=“0” bgcolor="#cccccc"><tr><td bgcolor="#cccccc"><font color=“black” size=“2”>[ISet,-2,[IGet,Material:Item Info]]
[ISet,-1,[IGet,Texture:Item Info]]
</font></td></tr></table></blockquote>
Find the Comment inside your Grab IButton and replace it with these commands:
<blockquote><table border=“0” cellpadding=“6” cellspacing=“0” bgcolor="#cccccc"><tr><td bgcolor="#cccccc"><font color=“black” size=“2”>[IButton,Grab,“Grab Current Values”,
[ISet,-6,[IGet,Tool:Item Info]]
[ISet,-5,[IGet,Color:R]]
[ISet,-4,[IGet,Color:G]]
[ISet,-3,[IGet,Color:B]]
[ISet,-2,[IGet,Material:Item Info]]
[ISet,-1,[IGet,Texture:Item Info]]
,
, SmallWidth
]
</font></td></tr></table></blockquote>
Now for the Apply IButton. This time, the Tool ISlider is -7 items away, so start there:
<blockquote><table border=“0” cellpadding=“6” cellspacing=“0” bgcolor="#cccccc"><tr><td bgcolor="#cccccc"><font color=“black” size=“2”>[ISet,Tool:Item Info,[IGet,-7]]</font></td></tr></table></blockquote>
Do the same for the rest of the ISliders:
<blockquote><table border=“0” cellpadding=“6” cellspacing=“0” bgcolor="#cccccc"><tr><td bgcolor="#cccccc"><font color=“black” size=“2”>[ISet,Color:R,[IGet,-6]]
[ISet,Color:G,[IGet,-5]]
[ISet,Color:B,[IGet,-4]]
[ISet,Material:Item Info,[IGet,-3]]
[ISet,Texture:Item Info,[IGet,-2]]
</font></td></tr></table></blockquote>
Now you have a functioning ZScript that stores certain settings which you can recall later.

To review, the entire ZScript should look like this:
<blockquote><table border=“0” cellpadding=“6” cellspacing=“0” bgcolor="#cccccc"><tr><td bgcolor="#cccccc"><font color=“black” size=“2”>[PageSetWidth,640]
[VarSet, SmallWidth, 640/11]
[VarSet, LargeWidth, SmallWidth * 2]

[ISlider,Tool,
1, 1, 0, [IGetMax,Tool:Item Info],
“Tool Item Info Number”,
[ISetMax,0,[IGetMax,Tool:ItemInfo]]
,
, SmallWidth
]

[ISlider,R,
128, 1, 0, 255,
“Red Component”,
// Commands Group goes here
,
, SmallWidth
]

[ISlider,G,
128, 1, 0, 255,
“Green Component”,
// Commands Group goes here
,
, SmallWidth
]

[ISlider,B,
128, 1, 0, 255,
“Blue Component”,
// Commands Group goes here
,
, SmallWidth
]

[ISlider,Material,
1, 1, 0, 65,
“Material Item Info Number”,
// Commands Group goes here
,
, LargeWidth
]

[ISlider,Texture,
0, 1, 0, [IGetMax,Texture:Item Info],
“Texture Item Info Number”,
[ISetMax,0,[IGetMax,Texture:ItemInfo]]
,
, LargeWidth
]

[IButton,Grab,“Grab Current Values”,
[ISet,-6,[IGet,Tool:Item Info]]
[ISet,-5,[IGet,Color:R]]
[ISet,-4,[IGet,Color:G]]
[ISet,-3,[IGet,Color:B]]
[ISet,-2,[IGet,Material:Item Info]]
[ISet,-1,[IGet,Texture:Item Info]]
,
, SmallWidth
]

[IButton,Apply,“Apply These Values”,
[ISet,Tool:Item Info,[IGet,-7]]
[ISet,Color:R,[IGet,-6]]
[ISet,Color:G,[IGet,-5]]
[ISet,Color:B,[IGet,-4]]
[ISet,Material:Item Info,[IGet,-3]]
[ISet,Texture:Item Info,[IGet,-2]]
,
, SmallWidth
]</font></td></tr></table></blockquote>

Now, how about adding more lines so you can store a number of settings? That’s easy. Add a PenMoveDown command (can also be written simply [PD]), then copy and paste all the ISliders and IButtons. Since you used the “neat feature” for finding other ZScript items, each Grab and Apply IButton will work properly for the line of ISliders next to it.

<hr><font color="#ffa000" size=“3”>Exercises</font>
To get a little more practice, try these challenges on your own:

:white_small_square: Try adding a second line of ISliders which record more information such as Draw Size, Alpha:Item Info, RGB Intensity and ZIntensity.

:white_small_square: Modify the commands within the Grab and Apply IButtons, so that the sliders on each line are only grabbed/applied, if the corresponding Tool, Color, Material and Texture buttons in the Marker palette are pressed.

Feel free to post your results in this thread.

Happy ZScripting!
dave

<hr>
Next lesson:
Lesson III: CanvasStroke and Loops

Doh! I just spent a few hours trying to puzzle sliders out(non-programmer).
I’ve never even bothered with scripts before because of the learning curve. Now I’m having more fun than a monkey in a madhouse.
John :+1: :+1: :+1:

Your post is pumping out through my printer as I type!!!
Thanks Davey!!!
Upham :slight_smile:

hi davey i want to let you know that im enjoing these classes and so far ive learned alot… keep them coming and when i can find the time to actually make a zsript i will… i would also like to know if you plan to make this into a pdf file for easier printing…

Thank you very much. Somehow I missed 1 so got to go back and read that one to.

Dave, you are an un-sung hero where I live so here I am singing about you. Very cool tutorial and just as Upham said, I hear the hum of a HP printer head cranking out yer stuff.

Well done. Very clear for non-code heads like me.

Glen

Good one! Lots of fun to read, and again you help me to understand commands that I say “Why in the world…” about. Thanks! :slight_smile:

I’m really glad these lessons can be of some help :slight_smile:

Thanks,
dave