Bolted Plate 2 definition works, but we get to write so many lines of parametric definition just for 2 plates -- a project may contain hundreds, even thousands of these plates. A better way to handle this is to define the steel plate object once as template and use that single definition many times throughout the project.
The 3D view of the project does not change. In fact it is the exact same model except I made the vertical plate thickness twice as much as the horizontal plate. In this case, we will do the parametric plate definition once and then use that definition to define two plates in space.
<O N="Bolted Plate 3" T="Project">
<!-- This time we want to define the plate once and reuse it
multiple times. Below is the definition of the bolted steel plate.
Setting ObjTypeDef parameter to 1 tells STARK that this is not an
actual object in space - just a definition at this point.
We will create the actual objects of this definition later in the project.
ObjLabel parameter allows you to give more friendly names to your definitions.
Notice the Role="Input" attributes on some parameters. This tells STARK that
if the end user wants to add an object of this definition to the project,
they need to set the values of these parameters.
-->
<O N="BoltedSteelPlate" T="Surface">
<P N="ObjTypeDef" V="1" />
<P N="ObjLabel" V="Bolted Steel Plate" T="Text" />
<P N="w" V="48" D="width of the plate" Role="Input" />
<P N="h" V="48" D="height of the plate" Role="Input" />
<P N="t" V="1" D="thickness of the plate" Role="Input" />
<P N="nr" V="5" D="number of rows" Role="Input" />
<P N="nb" V="5" D="number of equally spaced bolts per row" Role="Input" />
<P N="r" V="1" D="radius of bolt hole" Role="Input" />
<P N="c" V="6" D="clearance from edge" Role="Input" />
<P N="Thickness" V="t" />
<P N="spX" V="(w-c*2)/(nb-1)" D="spacing between bolt holes along X direction" />
<P N="spY" V="(h-c*2)/(nr-1)" D="spacing between bolt holes along Y direction" />
<O T="Point" X="-w/2" Y="-h/2" Z="0" />
<O T="Point" X="w/2" Y="-h/2" Z="0" />
<O T="Point" X="w/2" Y="h/2" Z="0" />
<O T="Point" X="-w/2" Y="h/2" Z="0" />
<O T="Repeat">
<P N="S" V="0" />
<P N="I" V="1" />
<P N="E" V="nr-1" />
<P N="CTRL" V="j" T="Text" />
<P N="j" V="0" />
<O T="Repeat">
<P N="S" V="0" />
<P N="I" V="1" />
<P N="E" V="nb-1" />
<P N="CTRL" V="i" T="Text" />
<P N="i" V="0" />
<P N="locX" V="-w/2 + c + spX * i" D="X location of the bolt hole" />
<P N="locY" V="-h/2 + c + spY * j" D="Y location of the bolt hole" />
<O T="Circle" X="locX" Y="locY">
<P N="IsCutout" V="1" />
<P N="Radius" V="r" />
</O>
</O>
</O>
</O>
<!-- I will define the first plate with its default values, very simple!
I basically define an object named Plate 1 of type Surface that extends
the definition of BoltedSteelPlate object (defined above). -->
<O N="Plate1" T="Surface" Extends="BoltedSteelPlate" />
<!-- I will define the second plate with its default values except
I will change the thickness of the plate. Any parameter I would like to
change I can put inside this object, everything else will be provided
by the exnteded object named BoltedSteelPlate.
I also want this plate to be positioned to perpendicularly to the side of
the first plate. -->
<O N="Plate2" T="Surface" Extends="BoltedSteelPlate" Y="Plate1.h/2" Z="w/2" RX="PI/2">
<P N="t" V="2" D="thickness of the plate" Role="Input" />
</O>
</O>