# The anatools Package

The anatools package provides the base set of capabilities to build a channel. It includes the software development kit (SDK), the ana interpreter, development utilities, and a set of libraries and nodes that can be included in a channel. It is required for all channels and is installed by including it in the requirements.txt file in the main channel directory.

## Nodes in anatools

The nodes in the anatools package are general purpose capabilities that can be included in any channel. To include an anatools node, you add it to the “add_nodes” section of the channel file as follows:

```
channel:
type: blender
add_setup:
- testpkg.lib.setup
add_packages:
- testpkg
add_nodes:
- package: anatools
name: RandomUniform
category: Values
subcategory: Random
color: "#FF9933"
```

In the above example, the “RandomUniform” node is included in the channel. Note the category, subcategory, and color for the node are also specified. These override the default values.

Following are descriptions of each node in the anatools package

### ConditionalSelector

The ConditionalSelector node combines two inputs with an operator and evaluates it as a logical expression. If the result is true then it outputs the value of its ‘True’ input. If the result is false then it outputs the value of its ‘False’ input.

Inputs

ConditionA - A numeric value that is the first operand of the expression.

Operator - A string representing the comparison operator. This can be one of three values - ‘Less Than’, ‘Equal To’, or ‘Greater Than’.

ConditionB - A numeric value that is the second operand of the expression

True - The value to be output if the expression evaluates as true.

False - The value to be output if the expression evaluates as false.

Outputs

Value - The output value

### RandomChoice

Selects the specified number of choices from a list. The “List_of_Choices” is a list where each element is one of the choices. Note that if elements are strings then they must each be enclosed in double-quotes, e.g. [“choice1”, “choice2”, “choice3”].

Inputs

List_of_Choices - The list of choices to choose from

Number_of_Choices - The number of choices to make

Unique_Choices - Determines if every choice needs to be unique. This value is a string and can be either ‘True’ or ‘False’.

Outputs

Choices - The list of choices made

### RandomNormal

Draw random samples from a normal (Gaussian) distribution with mean 'loc' and standard deviation 'scale'. This node calls the numpy function numpy.random.normal.

Inputs

loc - The mean of the distribution

scale - The standard deviation of the distribution

size - The output shape. If you are drawing a single sample then leave this empty. If you are drawing multiple samples then see the numpy documentation for details.

Outputs

out - The sample(s)

### RandomRandint

Generate random integers from low (inclusive) to high (exclusive). This node calls the numpy function numpy.random.randint.

Note the upper bound is exclusive so if you want, for example, to generate random integers between 0 and 9 the low should be set to 0 and the high should be set to 10.

Inputs

low - Lower boundary of the interval (inclusive)

high - Upper boundary of the interval (exclusive)

size - The output shape. If you are drawing a single sample then leave this empty. If you are drawing multiple samples then see the numpy documentation for details.

Outputs

out - The sample(s)

### RandomTriangular

Draw random samples from a triangular distribution over the closed interval [left, right]. This node calls the numpy function numpy.random.triangular.

Inputs

left - The lower limit

mode - The value where the peak of the distribution occurs

right - The upper limit

size - The output shape. If you are drawing a single sample then leave this empty. If you are drawing multiple samples then see the numpy documentation for details.

Outputs

out - The sample(s)

### RandomUniform

Draw random samples from a uniform distribution over the half-open interval [low, high). This node calls the numpy function numpy.random.uniform.

Inputs

low - Lower boundary of the interval (inclusive)

high - Upper boundary of the interval (exclusive)

Outputs

out - The sample(s)

### SelectGenerator

The SelectGenerator node allows the user to create a multi-branch junction in a generator tree. When evaluating the generator tree, one of the weighted input branches will be randomly selected.

Inputs

Generators - Links from one or more generator or modifier nodes. These are ‘downstream’ links in the generator tree.

Outputs

Generator - The ‘upstream’ link in the generator tree.

### SetInstanceCount

Set the count property of an input generator to produce multiple instances. Note generator instance count must be implemented in the channel for this to work. Many common channels, such as the example channel, do not support generator instance count.

Inputs

Generator - Link from a generator node.

Count - The number of times to instance the input generator

Outputs

Generator - The generator with the instance count set

### String

The String node allows the user to enter a single string and use it as input to multiple nodes

Inputs

String - The string to be passed to other nodes

Outputs

String - The string

### SweepArange

Generates a value from a parameter sweep across evenly spaced values within the half-open

interval [start,stop). The range of values in the interval is determined by the numpy function numpy.arange. The value drawn from this sequence is determined by taking the current run number modulo the number of values in the sequence and using that as an index into the sequence, e.g. seq[run_num % len(seq)].

For example if start is 0, stop is 10, and step is 1 then the sequence will be [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]. If the run number is 3 then the node will output a value of 3. If the run number is 11 then the output will be 1.

Inputs

start - Start of the interval (inclusive)

stop - End of the interval (exclusive)

step - Spacing between values

Outputs

value - Value drawn from the sequence.

### SweepLinspace

Generates a value from a parameter sweep across evenly spaced values within the

interval [start,stop]. The range of values in the interval is determined by the numpy function numpy.linspace. The value drawn from this sequence is determined by taking the current run number modulo the number of values in the sequence (num) and using that as an index into the sequence, e.g. seq[run_num % num].

For example if start is 0, stop is 9, and num is 10 then the sequence will be [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]. If the run number is 3 then the node will output a value of 3. If the run number is 11 then the output will be 1.

Inputs

start - Start of the interval (inclusive)

stop - End of the interval (inclusive)

num - Number of values in the sequence

Outputs

value - Value drawn from the sequence.

### Value

The Value node allows the user to enter a single numeric value and use it as input to multiple nodes

Inputs

Value - The value to be passed to other nodes

Outputs

Value - The value

### Vector2D

Creates a 2D vector with the magnitudes specified.

Inputs

x - The magnitude in the x direction

y - The magnitude in the y direction

Outputs

Vector - The vector represented as a 2 element list

### Vector3D

Creates a 3D vector with the magnitudes specified.

Inputs

x - The magnitude in the x direction

y - The magnitude in the y direction

z - The magnitude in the z direction

Outputs

Vector - The vector represented as a 3 element list

### VolumeFile

A node that represents a file on a workspace volume that was selected by the user.

Outputs

File - A pointer to the file on the workspace volume. This is an instance of the FileObject class.

### Weight

The Weight node modifies the weight of a branch in the generator tree.

Inputs

Generator - Link from a generator node. This is a ‘downstream’ link in the generator tree.

Weight - A numeric weight to be applied to the input branch