Skip to content

Command Editor

Basics

The Command Editor is the main place where most of the magic happens. Here you can set up your actions and here is the place where Octopus runs the maxscript commands.

Each button has its own command settings, which splits up to 4 available commands. (Clicks and Click + Hold)

  • Octopus Menu
    • Octopus Button 1
      • Left Click
      • Right Click
      • Left Click (Hold Mouse Button / Spinner)
      • Right Click (Hold Mouse Button / Spinner)
    • Octopus Button 2
      • Left Click
      • Right Click
      • etc…

Simple Click

Long Click Spinner

The Command Panel of a single click is very simple. It has only 3 properties.

Auto Scene Redraw

Auto Scene Redraw calls the Force Scene Redraw function when all the maxscripts have been executed. This forces all the max viewports to redraw their contents. This is useful when the viewport doesn’t update when your commands has been executed or if you want to have an interactive behaviour.

Hover / Preview

Hover / Preview forces the button to execute its maxscript content when the mouse cursor touches it. This means that you don’t have to click with your mouse to see what will be the outcome of a command.

The Snaps and the Smoothing Octopus menus are using this technique making them fully interactive. The Snaps menu toggles each snapping on or off, while in the Smooth menu, each menu button performs an Auto Smooth based on the predefined values.

Instant Close

This is useful when you are dealing with menus or max tools like, the cut tool or similar. In these cases Octal menu will close first and only after that it will execute the maxscript commands. This prevents the Octal Menu from being kept open and it will give the control to the max tool or menu after it has been closed.

Long Click / Spinner

Spinner Commands Tab

Long Click Spinner

This is the part where Octopus really shines. A Spinner button can track your mouse movement on each axis, it can handle mouse wheel rotations and you can also set up the behaviour on each axis.

X / Y Adaptive

Turning these on will force Octopus to become adaptive when it returns the movement value from one of the axis. It is useful when you are writing geometry modifying spinners. For example when you are performing a chamfer on a huge object, you obvously need an increased sensitivity. If you have a small object you need a lower sensitivity. Without adaptivity the size of the chamfer would be very small on big objects and it would be extremely huge on small objects.

X / Y Intensity

Intensity is the “per pixel” increment change on an axis. This means if you move your mouse cursor 1 pixel, then it will increment the return value by this value. The beginning point of the click is the center, which is ZERO.

So if you have moved your mouse cursor 10 pixels from the center and your Intensity is 0.05, then the returning value will be 0.5. If the distance is 100, then the returning value is 5.

X / Y Stepping

The stepping parameter is the value of the real increment. If the value is 0.01, then the increment stepping will be the follwing: 0.01, 0.02, 0.03 etc… If the stepping is 0.5, then it will be 0.5, 1.0, 1.5, 2.0 etc… If it’s 10, then 10, 20, 30 etc.

Min / Max Values

These values forces the return values between the Min / Max values. So if the Max value is 100, then it cannot go above that. If the Min value is 0, then it can’t go below 0.

Wheel Default

This value is the default value of the Mouse Wheel (third) parameter.

MaxScript Command Editor

The maxscript command editor is the actual place where all the magic happens. Here is the place where you can write your own maxscripts to control 3ds max. The Single Click and Long Click have their own UI since they have different behaviours. Simple left clicks are just for one time executions, while the Long Click Spinners have their input parameters. Horizontal and Vertical movement and Mouse Wheel.

Single Click

Toggle Return Value This command must return a True or False value. This controls the state of the button if it’s checked or unchecked. This is just a visual feedback about a toggle switch if it’s on or off.

Maxscript Editor

The maxscript / command editor is the place where you can add your maxscript code. It can be a simple macro or an action. The maxscript editor will execute it.

Long Click

Pre-MaxScript Action The Pre-MaxScript action is being executed when you long click on a button. This will be executed once.

MaxScript Action

This part is being executed each time you move your mouse or the mouse wheel.

Post-MaxScript Action

The Pre-MaxScript action is being executed when you release the button. This will be executed once.

Dynamic Variables

There are 9 different dynamic variables which are returning different values based on your mouse movements and mouse wheel changes. Also they are monitoring your camera position and direction as well as your selection level.

Mouse Movement

{0} – Horizontal Mouse Move
Horizontal Mouse Move
-- myvar will change each time you move your mouse cursor horizontally
myHorizontalMove = {0}

So if you move your mouse on the horizontal axis by 100 pixels and you stepping is 0.5, while the intensity ia 0.1, then the returning value will be 100 * 0.1 = 10.0

{1} – Vertical Mouse Move
Vertical Mouse Move
-- myvar will change each time you move your mouse cursor horizontally
myVerticalMove = {1}

So if you move your mouse on the vertical axis by 50 pixels and you stepping is 0.5, while the intensity ia 0.1, then the returning value will be 100 * 0.1 = 5.0

{2} – Mouse Wheel Change
Mouse Wheel Change
-- myvar will change each time you spin the mouse wheel
myWheelChange = {2}

If you change the mouse wheel it will increment the default value by 1 or -1, based on which direction you are spinning it.

Axis / Direction Dynamic Variables

These variables should be used together. The Axis and Direction variables are representing your local screen space directions on the X, Y, Z axis. This means that you can use these variables to construct screen space based maxscripts. Imagine it as a projection of the 3D space as a 2D representation.

So when I’m saying “HORIZONTAL” then it means your horizontal axis of your viewport, whether it is the X, Y or the Z axis. If we say “VERTICAL” then it can be also any of the axis.

Long Click Spinner

Assume we have rotated our camera this way. In this case the Axis and Directions will be the following:

Axis

The axis dynamic variables are responsible for converting your world space axis to screen space axis.

Axis Remap
-- Axis Remap [Horizontal, Vertical, Depth]
-- 1 -> screen space x axis
-- 3 -> screen space y axis
-- 2 -> screen space z depth axis
axis = [1,3,2]

Each index maps to an axis in order [X, Y, Z]

Axis Remap in practice
-- When you want to move in screen space vertically
pos = [0,0,0]
pos[{2}] = 10
$.pos = pos

In this case the mapping tell to the system to set the pos Z axis to 10.

Result of mapping
-- The above will expand to
pos = [0,0,0]
pos[3] = 10
-- [0,0,10]
$.pos = pos 

This is the result of the above.

Direction

Direction shows in which direction each axis points to. If it points to left / down / towards the camera, then it’s negative. If points right / up / away from the camera, then it’s positive.

-- Direction Remap
-- screen space X axis -> points to the NEGATIVE direction
-- screen space Y axis -> points to the NEGATIVE direction
-- screen space Z axis -> points to the POSITIVE direction

axis = [-1,-1, 1]
This is also useful for direction conversions, so when one of the axis points to the opposite direction compared to the screen space direction, then using this vairable, you can flip back movement for example. (So when moving an object to the negative direction, but the viewport camera is on the other side, it won’t move to the opposite direction. The object moves to a negative direction but it points to screen space right)

Example code -- Example of how the values are changing based on the camera positions -- To check the values, open up the Listener (F11)

Basic setup of screen space mapping
ClearListener()
pos = [0, 0, 0]
pos[{3}] = {0} * {6} - Screen Space Horizontal
pos[{4}] = {1} * {7} - Screen Space Vertical
pos[{5}] = {2} * {8} - Screen Space Depth
print pos
  • The {3} {4} {5} values tell to the system which is the index of the actual screen space Horizontal, Vertical and Depth axis.

  • The {0} {1} {2} values tell to the system, how big is the actual move of the mouse cursor on the X and Y axis and the mouse wheel.

  • The {6} {7} {8} values tell to the system, the direction of the screen space axis. This is important to correct the growing and decending values if the axis points into the opposite direction.

Long Click Spinner

Spinner Params Tab

The spinner params tab contains 3 fields. All of them must return a scalar value. With these fields you can return an initial value of Horizontal, Vertival and Wheel parameters within a spinner. This is especially useful when the starting value is other than 0, or if you want to start the parameter change using the current property value.

The three fields are responsible for the 3 axis.

Long Click Spinner