Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Sometimes a certain part of an object's code may need to be repeated many times. Even the number of repetitions may be required to be determined by the user. In short, the Repeat Object is used to clone a series of objects multiple times.

...

  • S (start)

  • E (end)

  • I (increment)

  • CTRL (control parameter)

Syntax

Code Block
languagexml
...
...
<O T="Repeat"
...
</O>

Example

Code Block
languagexml
<O N="Replicate" T="Project" Category="Core Objects">
    <!-- created by ParamML Examples on 26.01.2023 -->
    <O N="Recap" T="Repeat" S="0" E="3" I="1" CTRL="j" j="0">
        <P N="Result" V="3^jpow(3,j)" />
    </O>
    <O T="Design Code">
        <P N="RecapObjectList" V="Recap" />
        <P N="RecapResult0" V="Recap[0].Result" />
        <P N="RecapResult1" V="Recap[1].Result" />
        <P N="RecapResult2" V="Recap[2].Result" />
        <P N="RecapResult3" V="Recap[3].Result" />
        <!-- -l- -->
        <P N="Result0" V="3^0pow(3,0)" />
        <P N="Result1" V="3^1pow(3,1)" />
        <P N="Result2" V="3^2pow(3,2)" />
        <P N="Result3" V="3^3pow(3,3)" />
    </O>
</O>

The above codes give exactly the same results as below.

...

The Repeat Object also allows for counting elements in a list and separating them as needed. This can be useful in situations where specific elements within the list need to be grouped or separated based on certain criteria.

Example:

Code Block
languagexml
<O N="Repeat-_in-_repeat _Object" T="Project">
    <!-- created by ParamML Examples on 26.01.2023 -->
    <O N="Recap1" T="Repeat" S="0" E="3" I="1" CTRL="i" i="0">
        <O N="Recap" T="Repeat" S="0" E="4" I="1" CTRL="j" j="0">
            <O N="Circle" T="Volume" Y="20*i" X="20*j">
                <O T="Circle" Radius="10" Z="0" />
                <O T="Circle" Radius="10" Z="10" />
            </O>
        </O>
    </O>
</O>

In the above example, there are two nested repeat objects. In these objects, when it gets i=0 first, the object inside will repeat from j=0 to j=4 5 times and clone the 3D object within 5 of them.

Later, when the inside repetitions are completed, i = 1 will be and the inside object will be 5 again and will be created once.

Thus, as each i value increases, the j value will increase 5 times. This will continue until the outermost repeat count is completed and the following 3D object will be created.

To view this example in the library, see (https://openbrim.org/platform/?application=inc&author=ParamML_Examples_OpenBrIM+Platform&folder=Core+Objects&obj=objidr5mrcuyfnw8mxik04obc)

ParamML is a programming language that employs lazy evaluation (https://en.wikipedia.org/wiki/Lazy_evaluation ), where each parameter is only computed when it is called. Unlike sequential programming (e.g., http://VB.NET ), where each line is executed one by one, ParamML doesn't compute every parameter upfront. However, a drawback is that if a parameter is called a thousand times, it needs to be computed a thousand times, which can be a significant performance issue.

To address this problem, caching is used (https://en.wikipedia.org/wiki/Cache_(computing) )."Repeat" is a specific object, and under normal circumstances, due to software limitations, we cannot employ caching within "repeat." This is where "StaticParams" comes into play. StaticParams overrides this rule. The parameters written within StaticParams are computed, and their values are manually added to the cache. As a result, when attempting to access these parameters within "repeat," there is no need to reevaluate the parameters; their values are readily available in the cache.

Example:

Code Block
languagexml
<O N="StaticParamsObject1" T="Project" Category="Core Objects">
    <!-- created by ParamML Examples on 8/29/2023 -->
    <P N="StaticParameters" V="10" />
    <O T="Repeat" S="0" E="2" I="1" CTRL="index" index="0" StaticParams="[StaticParameters]">
        <P N="width" V="StaticParameters" />
        <P N="depth" V="StaticParameters" />
        <O N="Rectangular Column" T="Line">
            <O T="Point" X="index * 15" Y="0" Z="0" />
            <O T="Point" X="index * 15" Y="0" Z="width" />
            <O N="Rectangular" T="Section">
                <O T="Shape">
                    <O T="Point" X="-width/2" Y="-depth/2" Z="0" />
                    <O T="Point" X="-width/2" Y="depth/2" Z="0" />
                    <O T="Point" X="width/2" Y="depth/2" Z="0" />
                    <O T="Point" X="width/2" Y="-depth/2" Z="0" />
                </O>
            </O>
        </O>
    </O>
</O>

To view this example in the library, see (https://openbrim.org/platform/?application=inc&author=ParamML_Examples_OpenBrIM+Platform&obj=objidro1flg1c11lprm05wr6kzo )

Parameters of Repeat Object

Label

Mandatory

Name and Type Attributes

Default Description and Value Attributes

Other Attributes

Control Variable

Yes

N="CTRL"
T="Text"

D="Control Variable: The name of the variable that holds the repeat number as the contained objects repeated."V="0"

Role="Input"

Start

Yes

N="S"

D="Start: Starting repeat number (default 0)"
V="0"

Role="Input"

End

Yes

N="E"

D="End: Ending repeat number (default 9)"V="0"

Role="Input"

Increment

(Each Step)

Yes

N="I"

D="Increment: Increment used to go from start to end (default 1)"V="0"

Role="Input"

StaticParams

No

N=”StaticParams”

D=”Parameter list which are used in repeat iterations but no need to calculate at each step”

Role="Input"