I'm fairly new to CGA, but I want to modify the existing rule package, so the pier style would be based on attribute data. The rule packages is originally from 3D Basemaps Solution. Currently, the only options for pier styles are "Solid", "2 Pipes", "3 Pipes", which means that throughtout the bridge, the shore and river piers stay the same style. However, based on my attribute data, the shore piers can be solid, but the river piers can be "2 Pipes" and "3 Pipes". How do I modify the rule package in a way that the inner and outer piers are different?
For example, in this picture, all the piers are solid.

And in this picture they are "2 Pipes".

I need to combine those two styles, so that the middle pier is "2 Pipes" and the end and start piers are solid blocks.
This is the part of the code which defines pier attributes, which I have modified a little bit. I believe I have to change the split(x) part and PierType.
pierBaseWidth = bridgeWidth * ((0.8)) #double parentheses denote undeclared constant.
pierBaseLength = pierBaseWidth * Jalami_pikkus
lengthBetweenEndPiers = bridgeLength - 2 *( _Pier_Start_Length + pierBaseLength)
pierCountBetweenEndPiers =
case Pier_Count == 1:
1
else:
Pier_Count - 2
emptySpanTotal = lengthBetweenEndPiers - (pierCountBetweenEndPiers * pierBaseLength)
emptySpan = emptySpanTotal / (pierCountBetweenEndPiers + 1)
@Hidden
attr roadSlope = 0
Piers -->
set(roadSlope, geometry.angle(maxSlope))
t(0,- _Road_Thickness ,0)
#alignScopeToAxes(y)
#t(0,10,0)
color("#808080")
PierCounts
PierCounts -->
case Pier_Count == 1:
# put 1 in the middle, but use same split pattern as Pier_Count >= 3,
# but without the repeat split operator
split(x){ _Pier_Start_Length : NIL.
| pierBaseLength: NIL.
| {{emptySpan: NIL. | pierBaseLength: PierBase} | emptySpan: NIL.}
| pierBaseLength: NIL.
| _Pier_Start_Length : NIL.}
case Pier_Count == 2:
split(x){ _Pier_Start_Length : NIL
| pierBaseLength: PierBase
| ~1: NIL
| pierBaseLength: PierBase
| _Pier_Start_Length : NIL}
case Pier_Count >= 3:
split(x){ _Pier_Start_Length : NIL.
| pierBaseLength: PierBase
| {{emptySpan: NIL. | pierBaseLength: PierBase}* | emptySpan: NIL.}
| pierBaseLength: PierBase
| _Pier_Start_Length : NIL.}
else:
NIL
#onePierEmptySpan = (bridgeLength - (_Pier_Start_Length + pierBaseLength)) / 2 #(_Pier_Start_Length + pierBaseLength)
slopedPierHypotenuse =
emptySpan + pierBaseLength
yDiff = slopedPierHypotenuse * sin(roadSlope)
yDiffPerIndex =
case pier_Slope_Flip:
yDiff * reverseIndex
else:
yDiff * pierIndex
# 1,3,5,7, ... --> 0,1,2,3, ...
zeroBaseOddIndex(oddValue) = (oddValue - 1) / 2
reverseIndex = Pier_Count - pierIndex - 1
@Hidden
attr pierIndex = 0
PierBase -->
case Pier_Count == 1:
set(pierIndex, 1) # not 0.
extrude(world.up.flatTop,-( _Pier_Height +yDiffPerIndex))
PierScale
else:
set(pierIndex, zeroBaseOddIndex(split.index))
extrude(world.up.flatTop,-( _Pier_Height +yDiffPerIndex))
PierScale
PierScale -->
s('1,'1, pierBaseWidth)
center(z)
PierVerticalSplits
PierVerticalSplits -->
split(y){pierFootingHeight: X. | ~1: PierMiddle | pierFootingHeight: X.}
PierMiddle -->
s('0.7,'1,'0.9)
center(xz)
PierDimensions
pierFootingHeight = lesserOf( _Pier_Height * ((0.25)), pierFootingHeightMax)
@Hidden
attr footShort = 0
@Hidden
attr footLong = 0
@Hidden
attr footMiddleHeight = 0
PierDimensions -->
alignScopeToAxes(y)
set(footMiddleHeight, scope.sy)
set(footShort, scope.sx)
set(footLong, scope.sz)
PierType
PierType -->
case Pier_Type == "2 Pipes":
split(z){footShort: Pipe | ~1: NIL | footShort: Pipe}
case Pier_Type == "3 Pipes":
split(z){footShort: Pipe | ~1: NIL
| footShort: Pipe | ~1: NIL | footShort: Pipe}
else:
X.
Pipe -->
primitiveCylinder()