IMCScript

1 Introduction

This guide contains key information to setup Manufacturing Sales Platform (MSP) IMCScript effectively. The guide provides the concepts and detailed definition of the functions, aiming to enable administrator to have sufficient knowledge to setup the function with minimal supervision.

The document will be continually edited and updated based on latest product releases. Taking into the consideration of expensive effort keeping the document updated and effective usage of it, only major and complex features should be covered.

To better illustrate how to setup certain feature, some examples are given. It also contains the steps linked to relevant screens. Each step contains actions which the administrator needs to perform to complete the setup.

This administration guide is based on Manufacturing X (MX) release version 1902.

Enjoy!

The Product Engineering Team

2  IMCScript Introduction

IMCScript – InMindCloud’s own graph traversal scripting language helps user to read-from/write-into data available in runtime for the application. IMCScript provides flexibility of supporting multiple use-cases beneath its simple syntax, which helps semi-technical user to support/maintain custom use cases of application. Eventually, this provides good separation of custom features with generic ones.

Enriched with inbuilt function libraries, IMCScript supports usages of variables, operators, conditional loops / statements, and user-defined functions as well. To improve user experience, an intuitive UI editor has also been added into the application.

IMCScript is built on top of JEXL (Java Expression Language) library, which follows ECMA specification (Same followed by JavaScript). There are several enhancements and extensions implemented on top of it, one of that is IMCExpression.

3 Features

  • Simple syntax to be used by semi-technical user.
  • Flexible enough to support multiple READ/WRITE use cases in the system.
  • Richness of inbuilt libraries provided to use while scripting.
  • InMindCloud’s own graph traversal language.
  • Has capability to run scripts in parallel if needed.
  • Optimized with better Performance for the execution.
  • Provides Traceability across groups of scripts by providing audit log at the end of execution.
  • Provides a Harmonized solution for legacy (Conditional Triggers/Calculations) and upcoming use-cases.

4 Steps to configure

4.1 Create

Go to Model è IMCScript Management tab.

Click on add button, to create new IMCScript.

Provide script name and comment. Please take note that the script name must be unique.

Create IMCScript

Default script status for empty script will be INVALID.

Create IMCScript

To deep dive into the script, click on script row, as shown below.

Create IMCScript

Alternatively, the user can delete the scrip anytime, by selecting the checkbox and clicking on delete icon, as shown below.

The user can either select the custom template (as shown below) or start from scratch to create new script. To persist it, click on save.

Editor will do certain several checks and balances, and there is possibility of Error/Warning, as shown below in case script is invalid. Try to fix them, all first.

4.2 Test

To test the outcome of script, select icon, shown in below screenshot, which will help user to test the script on selected Quote/SalesItem.

Select a Quote from system and click on view line items of selected quote(s). (Boxes shown in green can be helpful to filter the quote user is interested in.)

Select a SalesItem and click on close.

Selected Quote and SalesItem will be shown on top left.

Clicking on Execute Script user can see outcome of the script on selected context (Quote and SalesItem) on right hand side. If the outcome is as per expectation user can click on Save to proceed further.

Saving the script will automatically validate the script and turn INVALID status to INACTIVE, if script has no compilation errors.

Clicking on Play button will turn the script status ACTIVE, which means, script syntax is valid and now ready to be executed in appropriate entry-points (Groups).

4.3 Add To Group

Clicking on tab Script Group will lead to another UI, where multiple entry-points (Groups) are available to execute bunch of scripts. These entry points are predefined by development team, which will help user to execute selected script to run at specific point of time. Click on ‘+’ under appropriate group to add the script under it.

Click on + under appropriate group to add the script under it.

Clicking on + will open list of scripts (As shown below), which will allow user to select one or more scripts, which will be added to that group. Click on Add to add script(s) in the group.

User can provide execution priorities. The scripts will be executed as per sequence (Lower number scripts will run first than higher once). The scripts with same priorities will be executed in parallel, which can give better efficiency in run time, however execution sequence of such scripts will be arbitrary.

4.4 Execute and Audit

After the execution in run-time, the audit logs can be found under tab Model è Content Management. (To see audit logs, Server should be running under DEBUG mode with log for IMCScript enabled).

All the scripts, which were executed can be seen with its relevant details.

Execute and Audit

5 IMCScript

IMCScript is combination of variables, operators, conditional loops/statements, custom functions, In-built functions and IMCExpression and reserved keywords.

5.1 Variables

Variables are used to store values/functions to be referenced and/or manipulated during the scope of script. They are case-sensitive and must start with a-z, A-Z, _ or $, followed by 0-9, a-z, A-Z, _ or $.

Valid                :           var1, _99, $1

Invalid              :           9v, !a99, 1$

Here is how you can define as and initialize them.

5.1.1 Literal Variables

Integer, Double and String are the literal variables available under IMCScript.

5.1.2 Non-Literal Variables

List and Map are standard non-literal variables available under IMCScript.

List and Map returns EBList and EBMap datatype respectively. Kindly refer the relevant library methods for each of them.

5.1.3 Accessing and Manipulating List / Map

Array and Map can be initialized, accessed and manipulated as shown below.

5.2 Operators

Operators are special symbols that performs specific action on one, two or three operands.

5.2.1 Arithmetic Operators

5.2.1.1 Additional (+)

It produces the sum of numeric operands or concatenation in case of string operands.

5.2.1.2 Subtraction (-)

It produces the sum of numeric operands or concatenation in case of string operands.

5.2.1.3 Multiplication (*)

It produces the multiplication of numeric operands.

5.2.1.4 Division (/)

It produces the quotient of numeric operands where the left operand is dividend and the right one is the divisor.

5.2.1.5 Modulus (%)

It produces the remainder of numeric operands where the left operand is dividend and the right one is the divisor.

5.2.2 Logical Operators

5.2.2.1 Logical AND (&& / and)

It performs logical AND between operands.

5.2.2.2 Logical OR (|| / or)

It performs logical OR between operands.

5.2.2.3 NOT (!)

It performs the logical NOT for the operand.

5.2.3 Bitwise Operators

5.2.3.1 Bitwise AND (&)

It performs Bitwise AND between operands. On Binary level, it returns 1 in each bit position for which the corresponding bits of both operands are 1s.

5.2.3.2 Bitwise OR (|)

It performs Bitwise OR between operands. On Binary level, it returns 1 in each bit position for which the corresponding bits of either or both operands are 1s.

5.2.3.3 Bitwise NOT (~)

It performs Bitwise NOT (or complement) for an operand. On Binary level, it inverts the bits of an operand.

5.2.3.4 Bitwise XOR (^)

It performs Bitwise OR between operands. On Binary level, it returns 1 in each bit position for which the corresponding bits of either or both operands are 1s.

5.2.4 Conditional Operators

5.2.4.1 Equality (=)

It compares equality between operands.

5.2.4.2 Inequality (!=)

It compares equality between operands.

5.2.4.3  Less Than (<)

It returns true if left side operand is less than the right operand, otherwise returns false.

5.2.4.4  Less Than or Equal To (<=)

It returns true if left side operand is less than or equal to the right operand, otherwise returns false.

Less Than or Equal To(<=)
5.2.4.5 Greater Than (>)

It returns true if left side operand is greater than the right operand, otherwise returns false.

5.2.4.6 Greater Than or Equal To (<)

It returns true if left side operand is greater than or equal to the right operand, otherwise returns false.

5.2.4.7  Ternary ( ? : )

Ternary operator is short-hand operation of simple if-else statements. If condition can be converted to true, the operator returns the value of exprT, otherwise it returns value of exprF (See below).

Syntax: condition ? exprT : exprF

5.2.5 Recursive Traversal Operators

5.2.5.1 Recursive Plus (<intermediate_step>)

This is same as + operator in RegEx. It gives one or more level of recursive traversal on Intermediate Steps of IMCExpression. It can be used adding underscore (_) at the end of intermediate step. Below example will clear the usage.

5.2.5.2 Recursive Star ( _<intermediate_step>_ )

This is same as + operator in RegEx. It gives one or more level of recursive traversal on Intermediate Steps of IMCExpression. It can be used adding underscore (_) at the end of intermediate step. Below example will clear the usage.

5.3 Conditional Loops / Statements

JEXL – the backbone of IMCScript provides 3 most important conditional syntax.

5.3.1 If-Else Statements

If-Else statements help to perform logic based on certain condition. Below is simple example of if-else conditions to check if number is Odd or Even.

Alternatively, user can also have multiple else-if statements. Here is an example which sets fruit according to season.

5.3.2 For Loop

For loop helps to iterate List type of object and perform specific logic for each of its element. For example, below code iterates through each element of list and sums values in variable sum.

5.3.3 While Loop

While loop helps to iteratively perform required logic until specific condition is not violated. Here is an example, which uses while loop to iterate through numbers until it doesn’t find square-root of given number.

Alternatively continue and break are useful reserved keywords which helps to skip or break the loops unconditionally. Calculable usage of these keywords improves script execution time by skipping / breaking execution of insignificant loops.

Below script iterates list of elements and finds sum of only positive numbers. It uses continue to skip negative numbers.

Below script finds number in list and breaks loop using break keyword, once it finds number inside list.

For Loop

5.3.4 Custom Functions

Custom or User-defined functions helps user to re-use custom logic frequently under the same script. It also increases readability for the script. Here is an example which defines 2 simple custom functions: sum and multiplication, for 2 numbers. Important thing to note here is, definition of function should be before the usage of it.

5.4 In-Built Functions

IMCScript supports rich library set, which can help user define custom logic with minimal lines of code using inbuilt functions and constants.

5.4.1 Math Constants

Below are the constants, which can be used in script to make it more readable.

5.4.2  Standard Functions

5.4.2.1  Summation

Finds summation of all values.

Summation
5.4.2.2 Multiplication

Finds multiplication of all values.

5.4.2.3 Absolute

Gives absolute value (also called – mode) of the number.

5.4.2.4 Maximum

Returns greatest number from the provided numbers.

5.4.2.5 Minimum

Returns smallest from the provided numbers.

5.4.2.6 Average

Finds average of the provided numbers.

Note: This function is same as Mean function under Statistic domain.

5.4.2.7 Greatest Common Divisor (GCD)

Returns Greatest Common Divisor (GCD) of the provided numbers.

5.4.2.8 Least Common Multiplier (LCM)

Returns Least Common Multiplier (LCM) of the provided numbers.

5.4.3 Convergence Functions

5.4.3.1 Round

Rounds the number to specified decimal digits.

Round

Note: In absence of second argument, default decimal digits will be considered 2.

5.4.3.2 Ceil

Finds ceiling value for a number.

5.4.3.3 Floor

Finds floor value for a number.

5.4.4 Statistical Functions

5.4.4.1 Mean

Finds mean value for a number.

Mean

Note: This function is same as Average function given under general functions.

5.4.4.2 Median

Finds median of the provided numbers.

5.4.4.3 Mode

Finds mode of the provided numbers.

Note: This method doesn’t guarantee any order of outcomes (modes).

5.4.5  Exponential Functions

5.4.5.1 Power

Finds nth power of the number.

Note: This method doesn’t guarantee any order of outcomes (modes).

5.4.5.2 Root

Finds nth root of the number. If multiple roots exist, function returns only positive root of it.

Finds square of a number.

Note: This is special case of Power method with exponent 2, hence it’s same as calling pow(n,2).

5.4.5.3 Cube

Returns cube of a number.

Note: This is special case of Power method with exponent 3, hence it’s same as calling pow(n,3).

5.4.5.4 Square-Root

Returns positive square root of a number.

Note: This is special case of Root method with root 2, hence it’s same as calling root(n,2).

5.4.5.5 Cube-Root

Returns cube root of a number.

Note: This is special case of Root method with root 3, hence it’s same as calling root(n,3).

5.4.6 Trigonometric Functions

5.4.6.1 Degree to Radian

Converts degree to radian and returns it.

5.4.6.2 Radian to Degree

Converts radian to degree and returns it.

5.4.6.3 Sine

Converts radian to degree and returns it.

5.4.6.4 Cosine

Returns cosine value of a radian.

5.4.6.5 Tangent

Returns tangent value of a radian.

5.4.6.6 Arc-Sine

Returns arc-sine value of a number.

5.4.6.7 Arc-Cosine

Returns arc-cosine value of a number.

Note: arc-tan is nothing but inverse of Tangent function, hence practically it returns radian for the provided value.

Returns arc-tangent value of a number.

Note: arc-tan is nothing but inverse of Tangent function, hence practically it returns radian for the provided value.

5.4.7 Logarithmic Functions

5.4.7.1 Logarithm

Calculates and returns logarithmic value of a number using provided base.

Note: In absence of second argument, default base will be considered e = 2.718281828459045, which is the base of natural algorithms.

5.4.7.2 Logarithm with base 10

Calculates and returns logarithmic value of a number using base 10.

Note: This is special case of Logarithm method with base 10, hence it’s same as calling log(n,10).

5.4.8 Parsing Functions

Parsing functions helps to parse one data type into another.

Parsing Functions

5.4.9 Check Functions

5.4.9.1 Is Finite

Checks if number is finite or not. It returns true if the argument is a finite value; returns false otherwise (For NaN and Infinity arguments).

5.4.9.2 Is Not-A-Number

Checks if number is finite or not. It returns true if the argument is a finite value; returns false otherwise (For NaN and Infinity arguments).

5.4.10 ExpressionBean Functions

5.4.10.1 Intersection

Checks if an ExpressionBean contains specific element in it.

5.4.10.2 Subtraction

Checks if an ExpressionBean contains specific element in it.

5.4.10.3 Union

Checks if an ExpressionBean contains specific element in it.

5.4.10.4 Contains

Checks if an ExpressionBean contains specific element in it.

5.4.10.5 IndexOf

Finds an index of a specific element inside the ExpressionBean. In case element doesn’t exists, it returns -1.

5.4.10.6 Equals

Finds if both ExpressionBean (Single or Collection) are equivalent to each other or not. This is same as using Equality operator.

5.4.10.7  Sort

Sorts ExpressionBean respect to IMCExpression (“this.salesItemPosition”) in given direction (Ascending: “ASC” or Descending: “DESC”).

In case of absence of IMCExpression, internally it uses ToString method to sort. In case of absence, default direction considered it Ascending: (“ASC”).

5.4.10.8 Distinct

Returns distinct elements of the ExpressionBean.

5.4.10.9 Filter

Filters ExpressionBean respect to IMCExpression (“this.salesItemPosition”) in given direction (Ascending: “ASC” or Descending: “DESC”).

In case of absence of IMCExpression, internally it uses ToString method to filter. In case of absence, default direction considered it Ascending: (“ASC”).

5.4.10.10 Size

Returns size (number of elements) of the ExpressionBean.

5.4.11 ExpressionBean (SalesItem) Functions

5.4.11.1 ExpressionBean (SalesItem) Functions

DA specific methods are self-explanatory from given examples here.

5.4.11.2 Google-Map Methods

Currently the only Google Map specific method available is shown below. Refer XXX to see more useful methods on variable of type GeoJSON.

5.4.12 GeoJSON Functions

GeoJSON is a standardized format for encoding a variety of geographic data structures. In ISS, this format is used to store the features drawn on the Google Map in a Quote.

Users can view the GeoJSON data of a map by clicking on the download button at the bottom left corner when opening the map window.

The downloaded file will have a json extension, which may be opened with a text editor. The content of the file will be of a similar format to the example shown below. The important features are:

  • Each feature drawn on the map (e.g. a marker, a line, or a polygon) will have a corresponding entry listed under “features”.
  • Each feature entry will include a description of its geometry (with all the coordinates of the points needed to construct it, in terms of their latitude and longitude and a list of custom properties it has.
  • In ISS, a feature may be identified by either its id (only for predefined objects such as the normalized rectangle or the slope arrow) or by its assigned type.
5.4.12.1 Is Feature Present

This function checks whether an expected feature has been drawn on the map. The expected input is either the id of the feature, or its type URI.

5.4.12.2 Get Property

This function retrieves the value of a custom property for the given feature. If the feature cannot be found or if it doesn’t have such a property, it will return an empty result. The properties that are available for each feature can be confirmed by looking at the downloaded json file.

Note that, only for point features (i.e. markers), it will also work with ‘latitude’ and ‘longitude’ as the property name (to retrieve the coordinate of the point), although these are not custom properties of the feature.

5.4.13 LookUpTable Functions

5.4.13.1 Table

This function retrieves the value of a custom property for the given feature. If the feature cannot be found or if it doesn’t have such a property, it will return an empty result. The properties that are available for each feature can be confirmed by looking at the downloaded json file.

Note that, only for point features (i.e. markers), it will also work with ‘latitude’ and ‘longitude’ as the property name (to retrieve the coordinate of the point), although these are not custom properties of the feature.

5.4.13.2 Add Select Fields

This function sets which lookup fields to retrieve. Any number of fields can be specified as input. It returns the DBLookupTable again, thus allowing other methods to be chained after it.

This method is optional, if not called, all lookup fields will be retrieved. Note that if the method is called for a second time, it will overwrite the previous setting.

5.4.13.3 Add Condition

This function sets the condition for retrieving the data. It returns the DBLookupTable again, thus allowing other methods to be chained after it.

All Conditional Operators (Except Ternary) are supported. Using any unsupported operators will result in script failure.

This method is optional, if not called, all lookup records will be retrieved without restrictions. This method may be called multiple times, and the conditions will be chained together. The lookup records that are retrieved must meet all the conditions specified.

5.4.13.4 Add Order By

This function sets how the resulting records should be sorted. It returns the DBLookupTable again, thus allowing other methods to be chained after it.

For sort_type, only ‘ASC’ or ‘DESC’ will be accepted.

This method is optional, if not called, the lookup records will be retrieved sorted by ID. This method may be called multiple times, and the conditions will be chained together. The lookup records that are retrieved will be sorted by each of the fields in turn, starting with the first one.

5.4.13.5 Search

This function retrieves the data from the specified lookup table based on any conditions that has been set previously. It will return the data as a List, even if there is only 1 record that meet the criteria.

5.4.13.6 Search One

This function retrieves the data from the specified lookup table based on any conditions that has been set previously. It will return the data as a Map. If there is more than 1 record that meet the criteria, it will only return the first one (based on the sort order).

Search One

5.4.14 System Function

5.4.14.1 Logging

Logs message of appropriate type (ERROR/WARNING/INFO) under IMCScript Audit log.

5.4.14.2 Push Notification

Pushes notification of appropriate type (ERROR/WARNING/INFO) on UI.

5.4.15  List Functions

5.4.15.1 Add

Adds an element into the List.

5.4.15.2 Delete

Deletes an element from the List.

5.4.15.3 DeleteAt

Deletes an element at certain index from the List.

5.4.15.4 Contains

Checks if List contains specific element in it.

5.4.15.5 IndexOf

Finds an index of a specific element inside the List. In case element doesn’t exists, it returns -1.

5.4.15.6 Equals

Finds if both Lists are equivalent to each other or not. This is same as using Equality operator.

5.4.15.7 Sort

Sorts List in given direction (Ascending: “ASC” or Descending: “DESC”). In case of absence, default direction considered it Ascending: (“ASC”).

5.4.15.8 Distinct

Sorts List in given direction (Ascending: “ASC” or Descending: “DESC”). In case of absence, default direction considered it Ascending: (“ASC”).

5.4.15.9 Size

Returns size (number of elements) of the list.

5.4.16 Map Functions

5.4.16.1 Add

Adds a Key-Value pair into the Map.

Deletes a pair containing specific Key from Map.

5.4.16.2 Keys

Returns List of Keys from Map.

5.4.16.3 Values

Returns List of Values from Map.

5.4.16.4 Size

Returns size (number of pairs) of the Map.

5.5 IMC Expression

IMCExpression is the beauty of IMCScript which can help user to traverse across the schematic information in the graph. That means, the syntax and suggestions are automatically generated based on the schema objects (i.e. SalesItem) and attributes (i.e. includesConfigItem) being used.

Before proceeding further, reader should refer below terms, which are usually interchanged based on the domains it is referred from. To keep it simple, we will try to follow our own notations which is same way followed in most of IT companies.

Programming world Ontology world InMindCloud/IT domain Example
Instance Individual BusinessObject (BO) SalesItem123
Class Class BusinessType (BT) SalesItem
Field Property BusinessAttribute (BA) includesConfigItem

IMCExpression is usually a single line of expression, which helps script to read/write the data based on defined schema, hence it is expected from developer/modeler to understand the schematic relation before using it. Below is a partial relation graph, generated from IMC’s standard schema file.

IMCScript is composed of 3 main parts:

  • Starting Object
  • Intermediate Steps
  • Terminal Steps

5.5.1 Starting Object

This gives starting point to IMCExpression to begin traversal inside context. Ideally user can start with any BusinessObject (BO) / BusinessType (BT) (Although there are certain cases where user can use even BusinessAttribute, however we do not want to discuss about that for now).

As shown above, user can determine to start with BT or BO. To see how that matters to outcome, we will soon discuss Parallel Universe.

The outcome of Starting Object is always ExpressionBean, which is needed to continue further traversal based on Schema.

5.5.2 Intermediate Steps

This is the most significant part of IMCExpression which helps user to traverse as per schema definition. These intermediate steps can be either BusinessAttributes (includesConfigItem, includesSalesItem, …) or ExpressionBean functions.

Below example will help user reach SalesItem BO from QuoteBO.

By default, intermediate steps return collection of elements, hence you can see [0] at the end of above IMCExpression, which helps to fetch first objectName in our case.

Please refer below graphs to see how each fragment of IMCExpression helps user to traverse in schema.

IMCExpression: Quote()

IMCExpression: Quote ().includesSalesItem

IMCExpression: Quote ().includesSalesItem.objectName[0]

The outcome of Intermediate steps is ExpressionBean, hence user can traverse further or use methods applicable on ExpressionBean. User must refer Recursive Traversal Operator at this point.

5.5.3 Terminal Steps

Throughout the traversal of IMCExpression, the outcome is always ExpressionBean, which helps user to traverse further using schema syntax or use methods applicable on ExpressionBean. In case user wants to terminate this traversal and fetch literal value wrapped inside, he can call one of the terminal steps.

5.5.3.1 Value

Method value() provides appropriate literal value wrapped inside ExpressionBean, which is nothing but an outcome IMCExpression so far. In case of non-literal objects such as BO/BT, it provides URI of it.

This operation is just for the understanding to technical users, but it’s not advisable to use this without the need, because IMCScript evaluator is smart enough to perform this operation internally whenever appropriate situations occur.

5.5.3.2 ToString

Method toString() provides appropriate string value of literal or URI of non-literal objects such as BO/BT wrapped inside ExpressionBean.

The outcome of above operation is generic in the sense that it will always provide String type outcome regardless to various kinds of IMCExpressions which may return Literal/BO/BT of single or multiple values.

5.5.4 Parallel Universe

Outcome of IMCExpression can really differ when Starting Object of the expression is changed.

i.e. Outcome of Quote.includesSalesItem.objectName[0] will be different from Quote().includesSalesItem.objectName[0].

As you can see here that earlier IMCExpression starts with BusinessType (BT) whereas the later one starts with BusinessObject (BO), that means, the first one will traverse on Schema layer, whereas second one will traverse on Data layer (which is still following syntax of Schema).

This phenomenon where even though the syntax of IMCExpressions is similar (because of IMCExpression’s dependency on Schema), but traversing surface and outcome completely differs based on Starting Object is BT or BO, can be described as Parallel Universe.

Below is an example of such different outcomes, when user determines to start with BT or BO, and continue with Intermediate Steps.

Note: Most of the time user will find a need to have BO as a Starting Object, however second approach is provided to give completeness to language as well as to provide certain validation checks on backend side by replacing starting BO with BT.

5.6 Reserved Keywords

There are several reserved keywords inclusive of but not limited to all Starting Objects of IMCExpression, Inbuilt Global variables (i.e. Math, String, Double etc), syntax of conditional statements (if, else, while, for, break, continue) as well as : var, eq, ne, le, ge.

6 Example

6.1 Change child SalesItem name

6.2 Simple calculation

6.3 Copy DA value

6.4 Hide/Show DA

6.5 Push Notification for conflicting products

7 Use Cases

  • IMCScript can harmonize/connect several features of product i.e. Pricing/Triggers/Calculations where UI can use IMCScript to grab user inputs.
  • Excel import/excel can use IMCScript as a language to define the data as well as format to download/upload.
  • It can be an endpoint for modelers/developers to test the dataset loaded into memory.
  • In future, IMCScript can be useful to bind data points under Report/Analysis tools/features of the product.

8 FAQs

  • Can IMCScript do mathematical calculations like Calculations were doing in previous releases?
    • Yes, please refer to In-Built Functions, provided in this document.
  • Can IMCScript be a better alternate to existing features – Conditional-Triggers and Calculations?
    • Yes, IMCScript has much more capability which can cover up the fundamental use-cases of Conditional-Triggers and Calculations. Switching to IMCScript can be beneficial based on its Features.
  • Can non-technical user easily use IMCScript?
    • Although non-technical user can use IMCScripts easily, as mentioned under Pre-requisite, user who develops IMCScript is expected to have some technical as well as schematic knowledge.