Building and Civil Resources

This topic provides an overview of the Building and Civil Resources resource table in Data Setup and the resources used by Civil Engineering 3D Design. A resource is a PLM object (for example, a catalog or a business rule) or another type of file (for example, a bitmap or a spreadsheet).

This page discusses:

Logical Name Resource Type Mandatory Criteria Description
Alignment Design Customization XML Document

available in win_b64\startup\Civil\AlignmentDesign

- Customizes the behavior of alignment features.
Alignment Design Rules Definition XML Document

available in win_b64\startup\Civil\AlignmentDesignRules

- Defines the design rules to check an alignment definition.
Building Information Modeling Definition XML Document

available in win_b64\startup\Civil\BIM

- Defines the IFC/OmniClass/UniFormat extensions that can be set on Building & Civil objects.

Provides the list of IFC/OmniClass/UniFormat extensions that can be assigned to Building & Civil objects at creation. Also provides the list of extensions that can be added manually by the designer during edition.

Important:
  • You can either modify xml files or create new ones by adding customized extensions to be available at creation or in edition.
  • For more information about adding "customized" extensions" see Model Specialization Management User Guide: Creating and Editing an Extension.

Concrete Design Customization XML Document

available in win_b64\startup\Civil\ConcreteDesign

- - Customizes the behavior of concrete features.
Supported Standards XML Document

available in win_b64\startup\Civil\aecstd

- Defines the supported standards.
Road attainment methods Business Rule

available in win_b64\resources\knowledge\scripts

- - Defines the road attainment methods.
BIM Attribute Completion Business Rule

available in win_b64\resources\knowledge\scripts

-

The script of the Runtime View is read,

  • if the rule is UNSET in Data Setup and if the Fact Type contains either the "VPMReference" value, or the exact Aec type of the object (for example: "AecSlab" value)
  • or if the rule is SET and the Fact Type contains "Any Value"

Script files are located in the following runtime view directory: <os>\resources\knowledge\scripts.

The script (BIMAttributeCompletionRule_Sample.CATRule ) of the Data Setup is read, if the rule is SET and if the Fact Type contains the "VPMReference" value.

Defines the BIM Attribute Completion behavior.

From the BIM Completeness dialog box, the missing attributes of Civil Engineering objects are automatically defined/computed through the script of the Business Rules, and set directly in the BIM Attributes panel.

Railway attainment methods Business Rule

available in win_b64\resources\knowledge\scripts

- The script of the Runtime View is read, if no rule is set in Data Setup. Defines the railway attainment methods.
Railway cant and transition length rules Business Rule

available in win_b64\resources\knowledge\scripts

- The script of the Runtime View is read, if no rule is set in Data Setup. Defines the railway cant and transition length values.
Road Superelevation and Transition Length Rules Business Rule

available in win_b64\resources\knowledge\scripts

- The script of the Runtime View is read, if no rule is set in Data Setup. Defines the road superelevation and transition length values.
Road Widening and Transition Length Rules Business Rule

available in win_b64\resources\knowledge\scripts

- The script of the Runtime View is read, if no rule is set in Data Setup. Defines the road widening and transition length values.
Subgrade Surface width and transition length Business Rule

available in win_b64\resources\knowledge\scripts

- The script of the Runtime View is read, if no rule is set in Data Setup. Defines Subgrade Surface width and transition length.
Subgrade Surface curve widening and transition length Business Rule

available in win_b64\resources\knowledge\scripts

- The script of the Runtime View is read, if no rule is set in Data Setup. Defines Subgrade Surface curve widening and transition length.
Building Information Modeling Customization Know-how component

available in win_b64\startup\Civil\BIM\

The script of the Runtime View is read, if no rule is set in Data Setup. Defines the customized extensions that can be set on Building and Civil features.

About Building & Civil Resources

The xml files from the directories indicated in the table above are used when there are no files referenced in Data Setup.

A building & civil resource is an XML document that describes building and civil objects along with their expected behaviors at creation and in edition mode. Sample files are available in win_b64\resources\standard\aec or win_b64\resources\knowledge\scripts. You can modify the xml files of interest with the specifying values for AddAtCreation and AtEdition attributes for each extension (Yes or No). Or you can add customized extensions in a new xml file. The extract below shows an example for the IfcPset_ChimneyCommon extension.

Note: For information, see About Adding Customized Extensions in Building and Civil Assemblies.

XML File Example

 <Extension
      AddAtCreation="Yes"
      AtEdition="Add|Remove"
      Name="IfcPset_ChimneyCommon" />
    <Extension

Description of XML Elements

The table below describes the elements and their possible attributes.

Element Attribute (s) Description
AddAtCreation
  • Yes
  • No
Specifies whether an extension is to be added if not present.
AddAtEdition
  • Add
  • Replace
  • Remove
Can be the combination of
  • Add that allows you to add an extension
  • Replace that allows you to replace a base extension and ensures that there is always a base extension. As an example IfcWall, IfcWallStandardCase, IfcWallElementedCase are the base extensions of the wall entity
  • Remove that allows you to remove an existing extension

Supported Standards

Example of Supported Standards
standards version="1">  
<standard name="IFC4" activated="true"/>  
<standard name="OmniClass_Table_11" activated="false"/>  
<standard name="OmniClass_Table_12" activated="false"/>  
<standard name="OmniClass_Table_13" activated="false"/>  
<standard name="OmniClass_Table_14" activated="false"/>  
<standard name="OmniClass_Table_21" activated="false"/>  
<standard name="OmniClass_Table_22" activated="false"/>  
<standard name="OmniClass_Table_23" activated="false"/>  
<standard name="OmniClass_Table_31" activated="false"/>  
<standard name="OmniClass_Table_32" activated="false"/>  
<standard name="OmniClass_Table_33" activated="false"/>  
<standard name="OmniClass_Table_34" activated="false"/>  
<standard name="OmniClass_Table_35" activated="false"/>  
<standard name="OmniClass_Table_36" activated="false"/>  
<standard name="OmniClass_Table_41" activated="false"/>  
<standard name="OmniClass_Table_49" activated="false"/>  
<standard name="Uniformat_II_Elemental_Classification" activated="false"/>  
<standard name="Proposed_Uniformat_II_Bridge_Elements" activated="false"/>
</standards>

Alignment Design Customization

The script below is a stationing script. If no XML resource file is set in Data Setup, the AlignmentDesign.xml file delivered in startup\Civil\AlignmentDesign is used.

<AlignmentDesign>

  <Units>
     <DefaultValues>
       <!-- Default values are used while creating a new alignment, road/railway surface, road/railway design -->
       <!-- Ulterior Data Setup modifications do not impact existing entities -->
       <Speed value="km_h"/> <!--km_h, mph-->
       <Gradient value="%_angle"/> <!--%_angle, m_m, deg, rad, grad, in_ft--> <!-- NOT USED -->
       <Superelevation value="%_angle"/> <!--%_angle, m_m, deg, rad, grad, in_ft-->
       <Cant value="%_angle"/> <!--%_angle, m_m, deg, rad, grad, in_ft--> <!-- NOT USED -->
       <CrossSection>
         <SmallAngle value="%_angle"/> <!--%_angle, m_m, deg, rad, grad, in_ft-->
         <LargeAngle value="m_m"/> <!--%_angle, m_m, deg, rad, grad, in_ft-->
         <LimitSmallLarge value="20%_angle"/>
       </CrossSection>
	<RoadGeometry value="mm"/> <!--mm, m, in, ft-->
	<VehicleTypeGeometry value="mm"/> <!--mm, m, in, ft-->
	<Stationing value="m"/> <!-- Can be represented in any length unit e.g. "m","ft","in" ...-->
     </DefaultValues>
   </Units>
  
  <Stationings>

    <!-- Default values are used while creating a new alignment or the first stationing -->
    <!-- Ulterior Data Setup modifications do not impact existing alignments or stationings -->
    <DefaultValues>
      <MajorInterval value="100m"/>
      	<!-- Can be expressed in any length unit e.g. "100 feet"-->
      <MinorInterval value="20m"/>
      <!-- Can be expressed in any length unit e.g. "100 feet"-->
      <StationTextHeightRatio value="0.02"/>
      <!-- Expressed as a ratio of the MajorInterval-->
      <StationOffsetRatio value="1"/>
<!-- Offset between the alignment and the station text. Expressed as a ratio of TextHeight -->
    </DefaultValues>

    <!-- Global values are shared among all alignments contained in a given PLM representation -->
    <!-- They are stored in this representation during the first alignment creation -->
    <!-- Ulterior Data Setup modifications do not impact PLM representations in which alignments were already created -->
    <GlobalValues>
       <!-- Alignment -->
      <LockIntervals value="false"/>
      <!-- true: Major\Minor intervals parameter cannot be edited -->
						<!-- Numbers -->
      <LengthDecimalPlaces value="3"/>
      <LengthDisplayTrailingZeros value="false"/>
      
      <!-- Station annotation -->
      <StationTailRatio value="1"/>
      <!-- Expressed as a ratio of the TextHeight -->
      <StationOverrunRatio value="1"/>
      <!-- Expressed as a ratio of the TextHeight -->

      <!-- Station equation annotation -->
      <StationEquationBackLabel value="@unset"/>
      <!-- @unset to have an internationalized value equivalent to 'BACK' -->
      <StationEquationAheadLabel value="@unset"/>
      <!-- @unset to have an internationalized value equivalent to 'AHEAD' -->
      <StationEquationSideOffsetRatio value="1"/>
      <!-- Expressed as a ratio of the TextHeight -->
      <StationEquationTailRatio value="1"/>
      <!-- Expressed as a ratio of the TextHeight -->
      <StationEquationOverrunRatio value="1"/>
      <!-- Expressed as a ratio of the TextHeight -->

      <StationingFormat value="1"/> <!-- Stationing format : '1' for [123+456.789] and '2' for [1234+56.789] --> 

    </GlobalValues>

  </Stationings>

  <VehicleTypes>
      <VehicleType type="Passenger Car" symbol="P"
             height="1300mm" width="2130mm" length="5790mm"
             frontOverhang="910mm" rearOverhang="1520mm"
             wheelbase="3350mm"
             emptySpeedLimit="130km_h" loadSpeedLimit="130km_h"
             unloadedWeight="1200kg" payload="500kg"
             autonomous="false"
             heightOfEye="1.06m" headlightSightDistance="150m"
             headlightHeight="0.65m" lightBeamDivergence="1deg"
             decelerationRate="3.4m_s2"
             taillightHeight="600m"
             reactionTime="2.5s"
             wheelHeight"500m"/>  
  </VehicleTypes> 

  <LaneTypes>
     <LaneType name="3.5m lane - One way"
          designVehicles="P;SU-9;WB-20"
          width="3500mm" lateralClearance="910mm"
          travelingDirection="2"
          speed="130km_h;130km_h;110km_h"/> 
          <!--1: None; 2: OneWay; 3: TwoWays-->
          <!--None: no traveling (e.g. raised median)-->
          <!--OneWay: only one direction of traveling (e.g. Bus lane)-->
          <!--TwoWays: can be traveled on both directions (e.g. Pedestrian lane)-->
  </LaneTypes> 
 <PointTypes>
    <!-- 
	label for text1 and text2
	%s : stationning (exemple: PO+189.456)
	%r : radius (radius of the corner, in local distance unit)
	%d : distance from start point (in local distance unit)
	%i : point index (only for PI and VI index of the point, order of alignment)
		starti: start of the index (exemple 1), stepi: step of the index
	%v : velocity (exemple 70 km/h)
	%c : category (Catefory field content on profile specification)
	%t : type  (exemple : Tunnel / Bridge ...)
	%e : elevation (only on vertical alignment : ###,## in local distance unit)
	%w : width of road
	
	pointType :
  "CROSS", "PLUS", "CONCENTRIC", "COINCIDENT", "FULLCIRCLE", "FULLSQUARE",
    "STAR", "DOT", "SMALLDOT"
		
	Show : 
	0 : hide text + point
	1 : display text + point
	
	Output :
	0 : don't output the point 
	1 : output the point 
	-->
    <KeyPoint>
      <Horizontal>
        <!--
				PI : Point of Intersection
				TS : Tangent to Spiral
				TC : Tangent to Curve
				SC : Spiral to Curve
				CM : Curve to middle
				CC : Curve to curve
				SS : Spiral to Spiral
				CS : Spiral to Curve
				CT : Curve to Tangent
				ST : Spiral to Tangent
        CE : Curve extremum
        TT : Tangent to Tangent            
			-->
        <PI		text1="PI%i" text2="" 		      color="255 0 0" pointType="CONCENTRIC" start_index="1" step_index="1" output="false"/>
        <TS 	text1="TS = %s" text2="" 		    color="0 0 255" pointType="FULLSQUARE" output="false"/>
        <TC 	text1="TC = %s" text2="R = %r" 	color="0 0 255" pointType="FULLSQUARE" output="false"/>
        <SC 	text1="SC = %s" text2=""	      color="0 0 255" pointType="FULLSQUARE" output="false"/>
        <CM 	text1="CM = %s" text2="R = %r" 	color="0 0 255" pointType="FULLSQUARE" output="false"/>
        <CC 	text1="CC = %s" text2="R = %r" 	color="0 0 255" pointType="FULLSQUARE" output="false"/>
        <SS		text1="SS = %s" text2="" 		    color="0 0 255" pointType="FULLSQUARE" output="false"/>
        <CS 	text1="CS = %s" text2="" 	      color="0 0 255" pointType="FULLSQUARE" output="false"/>
        <CT		text1="CT = %s" text2="R = %r" 	color="0 0 255" pointType="FULLSQUARE" output="false"/>
        <ST 	text1="ST = %s" text2="" 		    color="0 0 255" pointType="FULLSQUARE" output="false"/>
        <CE 	text1="CE = %s" text2="" 		    color="0 0 255" pointType="FULLSQUARE" output="false"/>
        <TT 	text1="TT = %s" text2="" 		    color="0 0 255" pointType="FULLSQUARE" output="false"/>
      </Horizontal>
      <Vertical>
        <!--
				VPI : Vertical Point of Intersection
				GS : Gradient to Spiral
				SC : Spiral to Curve
				GC : Gradient to Curve
				CE : Curve extremum
				CC : Curve to curve
				CG : Curve to Gradient
				CS : Curve to Spiral
				SG : Spiral to Gradient
			-->
        <VPI 	text1="VPI%i" text2="" 	color="255 0 0" pointType="CONCENTRIC" start_index="1" step_index ="1"  output="false"/>
        <GS		text1="GS = %s"  text2=""  	color="0 0 255" pointType="FULLSQUARE" output="false"/>
        <SC		text1="SC = %s"  text2=""  	color="0 0 255" pointType="FULLSQUARE" output="false"/>
        <GC		text1="GC = %s"  text2=""  	color="0 0 255" pointType="FULLSQUARE" output="false"/>
        <CE		text1="CE = %s"  text2=""  	color="0 0 255" pointType="FULLSQUARE" output="false"/>
        <CC		text1="CC = %s"  text2=""  	color="0 0 255" pointType="FULLSQUARE" output="false"/>
        <CG		text1="CG = %s"  text2=""  	color="0 0 255" pointType="FULLSQUARE" output="false"/>
        <CS		text1="CS = %s"  text2=""  	color="0 0 255" pointType="FULLSQUARE" output="false"/>
        <SG		text1="SG = %s"  text2=""  	color="0 0 255" pointType="FULLSQUARE" output="false"/>
        <GG		text1="GG = %s"  text2=""  	color="0 0 255" pointType="FULLSQUARE" output="false"/>
      </Vertical>
    </KeyPoint>
    <EventPoint>
      <!--
      BA : Begin of Alignement
			EA : End of Alignement
			SE : Station equation : #back# / #head# value override for internationalized value
			VE : Change of Speed
			TY : Change of underlying infrastructure type (e.g. Start of bridge)
      WI : Change of width
			OT : Other
		-->
      <BA 	text1="%s" 		text2="" 		color="60 190 240" pointType="FULLSQUARE" output="true"/>
      <EA		text1="%s"		text2="" 		color="0 0 255" pointType="FULLSQUARE" output="true"/>
      <SE		text1="#back# %s" text2="#ahead# %s" 	color="0 0 255" pointType="FULLSQUARE" output="true"/>
      <VE		text1="%v" 		text2="" 	color="127 0 255" pointType="FULLSQUARE" output="false"/>
      <TY		text1="%t" 		text2="" 	color="127 0 255" pointType="FULLSQUARE" output="true"/>
      <WI		text1="%w" 		text2="" 	color="127 0 255" pointType="FULLSQUARE" output="false"/>
      <OT		text1="%s"		text2="" 	color="127 0 255" pointType="FULLSQUARE" output="false"/>
    </EventPoint>
    <SurveyPoint>
      <!-- SP : StationPoint -->
      <SP		text1="%s"		text2=""	color="9 82 40" pointType="STAR" output="false"/>
      <!-- GP : GeoPoint -->
      <GP		text1="%s"		text2=""	color="27 157 44" pointType="STAR" output="false"/>
    </SurveyPoint>
  </PointTypes>

  <Profile name="Road" iconLocalPath="I_CegRoad108x144.png">
    <Design>
      <DefaultValues>
        <TraveledWayType value="2"/>
        <!--1: Planar; 2: Crowned-->
        <RotationMode value="1"/>
        <!--1: CenterLine; 1: InnerEdge; 2: OuterEdge; 3: Right; 4: Left-->
        <DesignVehicle value="SU-9"/>
        <DesignSpeed value="80km_h"/>
        <NormalSlope value="2%_angle"/>
        <RightShoulderSlope value="4%_angle"/>
        <LeftShoulderSlope value="4%_angle"/>
        <FirstWayRightWidth value="3.5m"/>
        <FirstWayLeftWidth value="3.5m"/>
        <FirstWayRightShoulderSlope value="4%_angle"/>
        <FirstWayLeftShoulderSlope value="4%_angle"/>
        <FirstWayRightShoulderWidth value="2m"/>
        <FirstWayLeftShoulderWidth value="2m"/>
        <WideningTransition value="10m"/>
        <WideningSmoothing value="2m"/>
        <RollOver value="6%_angle"/>
        <StoppingSightDistance value="true"/>
        <HeightOfObjectForStoppingSightDistance value="0.6m"/>
        <PassingSightDistance value="true"/>
        <HeightOfObjectForPassingSightDistance value="0.10m"/>
        <LengthOfPassingSections value="true"/>
        <RatioOfPassingSections value="true"/>
        <HeadlightSightDistance value="true"
        <DrainageControl value="true"/>
        <PassengerComfort value="true"/>
        <VerticalCentripetalAccelerationThreshold value="true"/>
        <VerticalCurveType value="2"/>
</DefaultValues>
    </Design>
    <TraveledWayLaneDistribution>
      <FirstWayLeftSide>
        <Lane name="3m lane - One way" direction="3"/>
        <!--1: None; 2: Along; 3: Opposite-->
        <!--None: not a traveling lane-->
        <!--Along: traveling from alignment Start to alignment End-->
        <!--Opposite: traveling from alignment End to alignment Start-->
      </FirstWayLeftSide>
      <FirstWayRightSide>
        <Lane name="3m lane - One way" direction="2"/>
      </FirstWayRightSide>
    </TraveledWayLaneDistribution>
    <Rules>
      <DefaultValues>
        <RadiusTable value="Sample eMax 4%"/>
        <LengthTable value="DefaultLengthBySpeed"/>
        <GradientTable value="DefaultGradientBySpeed"/>
        <SuperelevationTable value="Sample eMax 4%"/>
        <AttainmentMethodsTable value="Default"/>
      </DefaultValues>
    </Rules>
  </Profile>

</AlignmentDesign>
Where:
MajorInterval Corresponds to the major interval of stationing at alignment creation. This value is stored on the alignment when creating this alignment. It is not updated if the value is modified later in Data Setup. The value used at creation is kept.
MinorInterval Corresponds to the minor interval of stationing at alignment creation. This value is stored on the alignment when creating this alignment. It is not updated if the value is modified later in Data Setup. The value used at creation is kept.
StationTextHeightRatio Corresponds to the text height at alignment creation. Expressed as a ratio of the major interval value. This value is stored on the alignment when creating this alignment. It is not updated if the value is modified later in Data Setup. The value used at creation is kept. For example, it could be 0.02, which results in a text height of 2m if the major interval is set to 100m.
StationOffsetRatio Corresponds to the distance between the station name and the alignment. Expressed as a ratio of the text height. This value is stored on the alignment when creating this alignment. It is not updated if the value is modified later in Data Setup. The value used at creation is kept.
LockIntervals Locks/unlocks the edition of minor and major intervals at 3D Shape level. This value is stored on the alignment when creating this alignment. It is not updated if the value is modified later in Data Setup. The value used at creation is kept.
LenghtDecimalPlaces Gives the number of significant decimals for stations.
LenghtDisplayTrailingZeros Displays trailing zeros for stations.
StationTailRatio Corresponds to the length of the station annotation beyond the alignment (that is, the opposite side of the text). This value is stored on the alignment when creating this alignment. It is not updated if the value is modified later in Data Setup. The value used at creation is kept.
StationOverrunRatio Corresponds to the length of the station annotation from the alignment (that is, on the side of the text). This value is stored on the alignment when creating this alignment. It is not updated if the value is modified later in Data Setup. The value used at creation is kept.
StationEquationBackLabel Corresponds to the back label at first stationing point creation. This value is stored on the alignment when creating this alignment. It is not updated if the value is modified later in Data Setup. The value used at creation is kept.
StationEquationAheadLabel Corresponds to the ahead label at first stationing point creation. This value is stored on the alignment when creating this alignment. It is not updated if the value is modified later in Data Setup. The value used at creation is kept.
StationEquationSideOffsetRatio Corresponds to the distance between the equation texts and the line perpendicular to the alignment. This value is stored on the alignment when creating this alignment. It is not updated if the value is modified later in Data Setup. The value used at creation is kept.
StationEquationTailRatio Corresponds to the length of the station equation annotation beyond the alignment (that is, the opposite side of the text). This value is stored on the alignment when creating this alignment. It is not updated if the value is modified later in Data Setup. The value used at creation is kept.
StationEquationTailRatio Corresponds to the length of the station equation annotation beyond the text (that is, on the side of the text). This value is stored on the alignment when creating this alignment. It is not updated if the value is modified later in Data Setup. The value used at creation is kept.
Speed Corresponds to the speed value of the vehicle on the infrastructure.
Gradient Corresponds to the longitudinal slope of the alignment.
Superelevation Corresponds to the Superelevation value for roads.
Cant Corresponds to the Cant value for railways.
CrossSection Corresponds to the CrossSection value for ditches, filling and excavation. The unit is chosen according to the angle value.

Alignment Design Rules Definition

Example of Radius Table
<Alignments> 
    <!-- ********************* -->
    <!--      Radius Tables    -->  
    <!-- ********************* -->  

    <RadiusTables>

        <!--   Sample Radius Table by speed values   -->        

          <RadiusTable Name="DefaultRadiusBySpeed">      
           <HorizontalRadiusTable>        
             <Radius Speed="40km_h"  Minimum="40m"/>        
             <Radius Speed="60km_h"  Minimum="120m"/>        
             <Radius Speed="80km_h"  Minimum="240m"/>        
             <Radius Speed="100km_h" Minimum="400m"/>        
             <Radius Speed="120km_h" Minimum="665m"/>      
           </HorizontalRadiusTable>
           <VerticalRadiusTable>        
             <CrestRadiusTable>
               <Radius Speed="40km_h"  Minimum="500m"/>          
               <Radius Speed="60km_h"  Minimum="1500m"/>
               <Radius Speed="80km_h"  Minimum="3000m"/>
               <Radius Speed="100km_h" Minimum="6000m"/>
               <Radius Speed="120km_h" Minimum="12000m"/>
             </CrestRadiusTable>   
             <SagRadiusTable>
                <Radius Speed="40km_h"  Minimum="700m"/>          
                <Radius Speed="60km_h"  Minimum="1500m"/>          
                <Radius Speed="80km_h"  Minimum="2200m"/>          
                <Radius Speed="100km_h" Minimum="3000m"/>  
                <Radius Speed="120km_h" Minimum="4200m"/>        
                </SagRadiusTable>      
             </VerticalRadiusTable>    
      </RadiusTable>        

         <!--  Sample Radius Table by category values  -->    

            <RadiusTable Name="DefaultRadiusByCategory">    
               <HorizontalRadiusTable>        
                  <Radius Category="R60"  Minimum="120m"/>        
                  <Radius Category="R80"  Minimum="240m"/>        
                  <Radius Category="T80"  Minimum="240m"/>        
                  <Radius Category="T100" Minimum="425m"/>
              </HorizontalRadiusTable>      
              <VerticalRadiusTable>        
                <CrestRadiusTable>          
                  <Radius Category="R60"  Minimum="1500m"/>          
                  <Radius Category="R80"  Minimum="3000m"/>          
                  <Radius Category="T80"  Minimum="3000m"/>          
                  <Radius Category="T100" Minimum="6000m"/>  
                 </CrestRadiusTable>        
                 <SagRadiusTable>          
                   <Radius Category="R60"  Minimum="1500m"/>          
                   <Radius Category="R80"  Minimum="2200m"/>          
                   <Radius Category="T80"  Minimum="2200m"/>          
                   <Radius Category="T100" Minimum="3000m"/>        
                 </SagRadiusTable>      
               </VerticalRadiusTable>    
              </RadiusTable>
        </RadiusTables>
Design Rules: Example of Length Table

<!-- ********************* --> 
 <LengthTables>
    <!--   Sample Length Table by speed values   -->
    <LengthTable Name="DefaultLengthBySpeed">
      <HorizontalLengthTable>
        <LineLengthTable>
          <Length Speed="30km_h"  Minimum="10m"/>
          <Length Speed="50km_h"  Minimum="10m"/>
          <Length Speed="70km_h"  Minimum="10m"/>
          <Length Speed="80km_h"  Minimum="10m"/>
          <Length Speed="90km_h"  Minimum="10m"/>
          <Length Speed="110km_h"  Minimum="10m"/>
          <Length Speed="130km_h"  Minimum="10m"/>
        </LineLengthTable>
        <ArcLengthTable>
          <Length Speed="30km_h"  Minimum="min(45.0m, 0.2695*R+3.2871m)"/>
          <Length Speed="50km_h"  Minimum="min(45.0m, 0.2695*R+3.2871m)"/>
          <Length Speed="70km_h"  Minimum="min(45.0m, 0.2695*R+3.2871m)"/>
          <Length Speed="80km_h"  Minimum="min(45.0m, 0.2695*R+3.2871m)"/>
          <Length Speed="90km_h"  Minimum="min(45.0m, 0.2695*R+3.2871m)"/>
          <Length Speed="110km_h"  Minimum="min(45.0m, 0.2695*R+3.2871m)"/>
          <Length Speed="130km_h"  Minimum="min(45.0m, 0.2695*R+3.2871m)"/>
        </ArcLengthTable>
        <TransitionLengthTable>
          <Length Speed="30km_h"  Minimum="10m"/>
          <Length Speed="50km_h"  Minimum="10m"/>
          <Length Speed="70km_h"  Minimum="10m"/>
          <Length Speed="80km_h"  Minimum="10m"/>
          <Length Speed="90km_h"  Minimum="10m"/>
          <Length Speed="110km_h"  Minimum="10m"/>
          <Length Speed="130km_h"  Minimum="10m"/>
        </TransitionLengthTable>
      </HorizontalLengthTable>
      <VerticalLengthTable>
        <LineLengthTable>
          <Length Speed="30km_h"  Minimum="10m"/>
          <Length Speed="50km_h"  Minimum="10m"/>
          <Length Speed="70km_h"  Minimum="10m"/>
          <Length Speed="80km_h"  Minimum="10m"/>
          <Length Speed="90km_h"  Minimum="10m"/>
          <Length Speed="110km_h"  Minimum="10m"/>
          <Length Speed="130km_h"  Minimum="10m"/>
        </LineLengthTable>
        <TransitionLengthTable>
          <Length Speed="30km_h"  Minimum="10m"/>
          <Length Speed="50km_h"  Minimum="10m"/>
          <Length Speed="70km_h"  Minimum="10m"/>
          <Length Speed="80km_h"  Minimum="10m"/>
          <Length Speed="90km_h"  Minimum="10m"/>
          <Length Speed="110km_h"  Minimum="10m"/>
          <Length Speed="130km_h"  Minimum="10m"/>       
        </TransitionLengthTable>
        <CrestArcLengthTable>
          <Length Speed="30km_h"  Minimum="2.5m"/>
          <Length Speed="50km_h"  Minimum="9m"/>
          <Length Speed="70km_h"  Minimum="20m"/>
          <Length Speed="80km_h"  Minimum="30m"/>
          <Length Speed="90km_h"  Minimum="40m"/>
          <Length Speed="110km_h"  Minimum="85m"/>
          <Length Speed="130km_h"  Minimum="130m"/>
        </CrestArcLengthTable>
        <SagArcLengthTable>
          <Length Speed="30km_h"  Minimum="2.5m"/>
          <Length Speed="50km_h"  Minimum="9m"/>
          <Length Speed="70km_h"  Minimum="20m"/>
          <Length Speed="80km_h"  Minimum="30m"/>
          <Length Speed="90km_h"  Minimum="40m"/>
          <Length Speed="110km_h"  Minimum="85m"/>
          <Length Speed="130km_h"  Minimum="130m"/>
        </SagArcLengthTable>
        <CrestParabolaLengthTable>
          <Length Speed="30km_h"  Minimum="50m"/>
          <Length Speed="50km_h"  Minimum="50m"/>
          <Length Speed="70km_h"  Minimum="50m"/>
          <Length Speed="80km_h"  Minimum="50m"/>
          <Length Speed="90km_h"  Minimum="50m"/>
          <Length Speed="110km_h"  Minimum="50m"/>
          <Length Speed="130km_h"  Minimum="50m"/>
        </CrestParabolaLengthTable>
        <SagParabolaLengthTable>
          <Length Speed="30km_h"  Minimum="50m"/>
          <Length Speed="50km_h"  Minimum="50m"/>
          <Length Speed="70km_h"  Minimum="50m"/>
          <Length Speed="80km_h"  Minimum="50m"/>
          <Length Speed="90km_h"  Minimum="50m"/>
          <Length Speed="110km_h"  Minimum="50m"/>
          <Length Speed="130km_h"  Minimum="50m"/>
        </SagParabolaLengthTable>
      </VerticalLengthTable>
    </LengthTable>
  </LengthTables>

Design Rules: Example of Gradient Table

<!-- ********************* -->
<!--    Gradient Tables    -->  
<!-- ********************* -->  

<GradientTables>    

  <!--   Sample Gradient Table by speed values   -->    
  <GradientTable Name="DefaultGradientBySpeed">      
     <Gradient Speed="40km_h"  Maximum="7%"/>      
     <Gradient Speed="60km_h"  Maximum="7%"/>      
     <Gradient Speed="80km_h"  Maximum="6%"/>      
     <Gradient Speed="100km_h" Maximum="5%"/>      
     <Gradient Speed="120km_h" Maximum="5%"/>    
   </GradientTable>

   <!--   Sample Gradient Table by category values   -->    

   <GradientTable Name="DefaultGradientByCategory">      
      <Gradient Category="R60"  Maximum="7%"/>      
      <Gradient Category="R80"  Maximum="6%"/>      
      <Gradient Category="T80"  Maximum="6%"/>      
      <Gradient Category="T100" Maximum="5%"/>    
      </GradientTable>  
</GradientTables>

Design Rules: Example of Superelevation Table

Superelevation attainment methods can be defined in a dedicated Business Rule called Alignment superelevation rules available the Building & Civil Resources resource table.

The script below is a stationing script. If no XML resource file is set in Data Setup, the AlignmentDesign.xml file delivered in startup\Civil\AlignmentDesign is used.

When you create a new alignment superelevation rule and assign it to a resource, the resource's input "ThisObject" must be set to "AECAlignment3D" type.

<SuperelevationTables>
  <SuperelevationTable Name="MySuperelevationTable">
    <SuperelevationDesignSpeed Speed="20km_h">
      <Superelevation Radius="75m" tLength="15m" eRate="2.2%"/>
      <Superelevation Radius="51m" tLength="16m" eRate="2.4%"/>
      <Superelevation Radius="38m" tLength="18m" eRate="2.6%"/>
      <Superelevation Radius="30m" tLength="19m" eRate="2.8%"/>
      <Superelevation Radius="24m" tLength="20m" eRate="3%"/>
      <Superelevation Radius="20m" tLength="22m" eRate="3.2%"/>
      <Superelevation Radius="17m" tLength="23m" eRate="3.4%"/>
      <Superelevation Radius="14m" tLength="24m" eRate="3.6%"/>
      <Superelevation Radius="12m" tLength="26m" eRate="3.8%"/>
      <Superelevation Radius="8m" tLength="27m" eRate="4%"/>
      </ SuperelevationDesignSpeed >
  </SuperelevationTable>
  <!-- Available formula is : "FranceARP"   -->
  <SuperelevationTable Name="France ARP formula" FormulaId="FranceARP"/>
</SuperelevationTables>

where:
Speed (input) Corresponds to the design speed defined in Alignment. The speed value defined in Alignment must match precisely the attribute value Speed defined in the XML design rules. Otherwise the matching table containing rule values is not found. For example: Ex: if Alignment design speed = 25km/h, no table will be found since parameter Speed = 20km/h.
Radius (input) Corresponds to the curve radius as per Alignment geometries. If the radius of the alignment curve does not match precisely the attribute value Radius, for safety reason the closest lower radius value will always be selected. For example: if curve radius = 28m, select a node the attribute value of which is Radius =24m.
tLength (output) Corresponds to the transition length.
eRate Corresponds to the superelevation rate.
Design Rules: Example of Horizontal Radius Tables Depending on Superelevation Rate

<RadiusTable Name="MyRadiusTableSpeed">
      <HorizontalRadiusTable eRate="2%">>
        <Radius Speed="50km_h" Minimum="86m"/>
        <Radius Speed="70km_h" Minimum="203m"/>
        <Radius Speed="80km_h" Minimum="280m"/>
        <Radius Speed="90km_h" Minimum="375m"/>
        <Radius Speed="100km_h" Minimum="492m"/>
      </HorizontalRadiusTable>
      <HorizontalRadiusTable eRate="3%">
        <Radius Speed="50km_h" Minimum="78m"/>
        <Radius Speed="70km_h" Minimum="186m"/>
        <Radius Speed="80km_h" Minimum="240m"/>
        <Radius Speed="90km_h" Minimum="322m"/>
        <Radius Speed="100km_h" Minimum="415m"/>
      </HorizontalRadiusTable>
   </RadiusTable>

Design Rule: Example of Cant Design Table

<CantTables>
  <CantTable Name="MyCantTable">
    <CantDesignSpeed Speed="20km_h">
      <Cant radius="90m" Cant="5mm" tLength="5m"/>
    </CantDesignSpeed>
  </CantTable>
  <CantTable Name="MyCantTableByFormula" formulaId="France">
<CantTables>

where:
Speed (input) Designs speed defined in Alignment.
Radius (input) Corresponds to curve radius as per Alignment geometries.
tLength (output) Corresponds to transition length.
Cant (output) Corresponds to the railway cant.
formulaId (input) Corresponds to identifier to switch from a formula to another one in a dedicated Business rule. See next paragraph.

If no Design Rules are set in Data Setup, default cant tables are provided in startup\Civil\AlignmentDesignRules\RailwayAlignmentDesignRules_Default.xml and are used by default.

Design Rule: an example of Curve Widening Table

Under the Rules section of the Horizontal Alignment Initialization dialog box, you can select the DefaultWideningFormula or an existing curve widening table in the drop-list. By default, the DefaultWideningFormula is set to compute the widening value. Both the formula and the curve widening tables are defined in the RoadAlignmentDesign.xml file.

In the road context, to set the widening curve value from tables, choose an existing table, defined in the RoadAlignmentDesignRules.xml file. If a widening table is selected to compute widening, the Curve Widening and the Ratio on inner Edge parameters in the Horizontal Curve dialog box are automatically updated, if the automatic mode is set as true. By default, the Curve Widening Auto and Ratio on Inner Edge Auto parameters are set as true (not automatic).

The RoadAlignmentDesignRules.xml file contains all the tables, in particular a table for curve widening. See the example below. The name of the table contains the following information: the number of lanes and the lane width. This XML resource file can be set and modified to define widening. You can also add another table for curve widening.

If no Design Rules are set in Data Setup, default curve widening tables are provided in startup\Civil\AlignmentDesignRules\RoadAlignmentDesignRules_Default.xml and are used by default.

The value of curve widening of the traveled way on a horizontal curve is the difference between the width needed on the curve and the width used on a tangent. The value of curve widening is taken from the curve widening table according to the type of speed (for example 50km/h) and radius (e.g. 300m). The larger the curve is, the smaller the widening is.

You can also read or overload the widening table using the Alignment Point dialog box. When no widening value is found for the specified speed or radius, a warning icon appears.

With a design rule table, you can also compute the transition length, and not only the widening length, that corresponds to the curve widening. The Widening transition length can be determined from the following inputs: Design speed (30km/h, 50 km/h, 80 km/h), radius (for example: 300m) and the curve widening table name (lane distribution and width).
<CurveWideningTables>
    <CurveWideningTable Name="2 Lanes - 7.2m">
      <WideningDesignSpeed speed="30km_h">
        <Widening radius="3000m" widening="0.1m" tLength="10m"/>
        <Widening radius="2500m" widening="0.2m" tLength="10m"/>
        <Widening radius="2000m" widening="0.2m" tLength="10m"/>
        <Widening radius="1500m" widening="0.2m" tLength="30m"/>
        <Widening radius="1000m" widening="0.3m" tLength="30m"/>
        <Widening radius="900m"  widening="0.4m" tLength="30m"/>
        <Widening radius="800m"  widening="0.4m" tLength="10m"/>
        <Widening radius="700m"  widening="0.5m" tLength="10m"/>
        <Widening radius="600m"  widening="0.5m" tLength="10m"/>
        <Widening radius="500m"  widening="0.6m" tLength="10m"/>
        <Widening radius="400m"  widening="0.7m" tLength="15m"/>
        <Widening radius="300m"  widening="1.0m" tLength="15m"/>
        <Widening radius="250m"  widening="1.1m" tLength="20m"/>
        <Widening radius="200m"  widening="1.4m" tLength="25m"/>
        <Widening radius="150m"  widening="1.8m" tLength="30m"/>
        <Widening radius="140m"  widening="1.9m" tLength="30m"/>
        <Widening radius="130m"  widening="2.1m" tLength="35m"/>
        <Widening radius="120m"  widening="2.2m" tLength="35m"/>
        <Widening radius="110m"  widening="2.4m" tLength="40m"/>
        <Widening radius="100m"  widening="2.7m" tLength="45m"/>
        <Widening radius="90m"   widening="3.0m" tLength="45m"/>
        <Widening radius="80m"   widening="3.3m" tLength="50m"/>
 <Widening radius="70m"   widening="3.8m" tLength="60m"/>      
</WideningDesignSpeed>
      <WideningDesignSpeed speed="50km_h">
…
</WideningDesignSpeed>
      </CurveWideningTable >
  </CurveWideningTables>
Design Rule : Example of single or dual spiral configuration (reverse turn)

When you create two spirals to join two arcs traveled in opposite direction, you obtain the following configuration: Tangent-Spiral-Circle-Spiral-Spiral-Circle-Spiral-Tangent.

Single or Dual spiral configuration can be specified in the xml file of Data Setup named RoadAlignmentDesign for road and RailwayAlignmentDesign for railway.

<Profile name="Road" iconLocalPath="I_CegRoad108x144.png">
    <Design>
      <DefaultValues>
        <TraveledWayType value="2"/>
        <!--1: Planar; 2: Crowned-->
        <RotationMode value="1"/>
        <!--1: CenterLine; 1: InnerEdge; 2: OuterEdge; 3: Right; 4: Left-->
        <DesignVehicle value="SU-9"/>
        <DesignSpeed value="80km_h"/>
        <NormalSlope value="2%_angle"/>
        …
        <!-- Vertical Curve Type initialisation to create Arc(1) or Parabola(2) -->
        <VerticalCurveType value="2"/>
        <!—Reverse turn intermediate spiral configuration Single (1) or Dual(2) -->
        <ReverseTurnIntermediateSpiral value="1/>
      </DefaultValues>
    </Design>
Design Rule : Example of single or dual spiral configuration (compound turn)

When you create a compound turn with dual PI and a spiral to join two arcs traveled in the same direction, you obtain the following configuration: Tangent-Spiral-Circle-Spiral-Circle-Spiral-Tangent.

Single or Dual spiral configuration can be specified in the xml file of Data Setup named RoadAlignmentDesign for road and RailwayAlignmentDesign for railway.

<Profile name="Road" iconLocalPath="I_CegRoad108x144.png">
    <Design>
      <DefaultValues>
        …
        <!—Compound turn PI configuration Single (1) or Dual(2) -->
        <CompoundTurnPI value="1/>
        …
      </DefaultValues>
    </Design>
Design Rule : Example of Points Customization

The default values for point customization are stored as follows:

 <PointTypes>
    <!-- 
	label for text1 and text2
	%s : stationning (exemple: PO+189.456)
	%r : radius (radius of the corner, in local distance unit)
	%d : distance from start point (in local distance unit)
	%i : point index (only for PI and VI index of the point, order of alignment)
		starti: start of the index (exemple 1), stepi: step of the index
	%v : velocity (exemple 70 km/h)
	%c : category (Catefory field content on profile specification)
	%t : type  (exemple : Tunnel / Bridge ...)
	%e : elevation (only on vertical alignment : ###,## in local distance unit)
	%w : width of road
	
	pointType :
  "CROSS", "PLUS", "CONCENTRIC", "COINCIDENT", "FULLCIRCLE", "FULLSQUARE",
    "STAR", "DOT", "SMALLDOT"
		
	Show : 
	0 : hide text + point
	1 : display text + point
	
	Output :
	0 : don't output the point 
	1 : output the point 
	-->
    <KeyPoint>
      <Horizontal>
        <!--
				PI : Point of Intersection
				TS : Tangent to Spiral
				TC : Tangent to Curve
				SC : Spiral to Curve
				CM : Curve to middle
				CC : Curve to curve
				SS : Spiral to Spiral
				CS : Spiral to Curve
				CT : Curve to Tangent
				ST : Spiral to Tangent
        CE : Curve extremum
        TT : Tangent to Tangent            
			-->
        <PI		text1="PI%i" text2="" 		      color="255 0 0" pointType="CONCENTRIC" start_index="1" step_index="1" output="false"/>
        <TS 	text1="TS = %s" text2="" 		    color="0 0 255" pointType="FULLSQUARE" output="false"/>
        <TC 	text1="TC = %s" text2="R = %r" 	color="0 0 255" pointType="FULLSQUARE" output="false"/>
        <SC 	text1="SC = %s" text2=""	      color="0 0 255" pointType="FULLSQUARE" output="false"/>
        <CM 	text1="CM = %s" text2="R = %r" 	color="0 0 255" pointType="FULLSQUARE" output="false"/>
        <CC 	text1="CC = %s" text2="R = %r" 	color="0 0 255" pointType="FULLSQUARE" output="false"/>
        <SS		text1="SS = %s" text2="" 		    color="0 0 255" pointType="FULLSQUARE" output="false"/>
        <CS 	text1="CS = %s" text2="" 	      color="0 0 255" pointType="FULLSQUARE" output="false"/>
        <CT		text1="CT = %s" text2="R = %r" 	color="0 0 255" pointType="FULLSQUARE" output="false"/>
        <ST 	text1="ST = %s" text2="" 		    color="0 0 255" pointType="FULLSQUARE" output="false"/>
        <CE 	text1="CE = %s" text2="" 		    color="0 0 255" pointType="FULLSQUARE" output="false"/>
        <TT 	text1="TT = %s" text2="" 		    color="0 0 255" pointType="FULLSQUARE" output="false"/>
      </Horizontal>
      <Vertical>
        <!--
				VPI : Vertical Point of Intersection
				GS : Gradient to Spiral
				SC : Spiral to Curve
				GC : Gradient to Curve
				CE : Curve extremum
				CC : Curve to curve
				CG : Curve to Gradient
				CS : Curve to Spiral
				SG : Spiral to Gradient
			-->
        <VPI 	text1="VPI%i" text2="" 	color="255 0 0" pointType="CONCENTRIC" start_index="1" step_index ="1"  output="false"/>
        <GS		text1="GS = %s"  text2=""  	color="0 0 255" pointType="FULLSQUARE" output="false"/>
        <SC		text1="SC = %s"  text2=""  	color="0 0 255" pointType="FULLSQUARE" output="false"/>
        <GC		text1="GC = %s"  text2=""  	color="0 0 255" pointType="FULLSQUARE" output="false"/>
        <CE		text1="CE = %s"  text2=""  	color="0 0 255" pointType="FULLSQUARE" output="false"/>
        <CC		text1="CC = %s"  text2=""  	color="0 0 255" pointType="FULLSQUARE" output="false"/>
        <CG		text1="CG = %s"  text2=""  	color="0 0 255" pointType="FULLSQUARE" output="false"/>
        <CS		text1="CS = %s"  text2=""  	color="0 0 255" pointType="FULLSQUARE" output="false"/>
        <SG		text1="SG = %s"  text2=""  	color="0 0 255" pointType="FULLSQUARE" output="false"/>
        <GG		text1="GG = %s"  text2=""  	color="0 0 255" pointType="FULLSQUARE" output="false"/>
      </Vertical>
    </KeyPoint>
    <EventPoint>
      <!--
      BA : Begin of Alignement
			EA : End of Alignement
			SE : Station equation : #back# / #head# value override for internationalized value
			VE : Change of Speed
			TY : Change of underlying infrastructure type (e.g. Start of bridge)
      WI : Change of width
			OT : Other
		-->
      <BA 	text1="%s" 		text2="" 		color="60 190 240" pointType="FULLSQUARE" output="true"/>
      <EA		text1="%s"		text2="" 		color="0 0 255" pointType="FULLSQUARE" output="true"/>
      <SE		text1="#back# %s" text2="#ahead# %s" 	color="0 0 255" pointType="FULLSQUARE" output="true"/>
      <VE		text1="%v" 		text2="" 	color="127 0 255" pointType="FULLSQUARE" output="false"/>
      <TY		text1="%t" 		text2="" 	color="127 0 255" pointType="FULLSQUARE" output="true"/>
      <WI		text1="%w" 		text2="" 	color="127 0 255" pointType="FULLSQUARE" output="false"/>
      <OT		text1="%s"		text2="" 	color="127 0 255" pointType="FULLSQUARE" output="false"/>
    </EventPoint>
    <SurveyPoint>
      <!-- SP : StationPoint -->
      <SP		text1="%s"		text2=""	color="9 82 40" pointType="STAR" output="false"/>
      <!-- GP : GeoPoint -->
      <GP		text1="%s"		text2=""	color="27 157 44" pointType="STAR" output="false"/>
    </SurveyPoint>
  </PointTypes>

Concrete Design Customization

Example of Concrete Design Customization
<ConcreteDesign>
  <Numberings>

    <!-- Rounding values are used in numbering and report -->
    <RoundingValues>
      <!-- Use Rounding -->
      <UseRounding value="true"/>
      <!-- true: calculated lengths are rounded with following parameters  -->
      <!-- false: calculated lengths keep their exact values -->

      <!-- Dimension Rounding Direction  -->
      <DimensionRoundingDirection value="nearest"/>
      <!-- Acceptable values are up, down and nearest"-->

      <!-- Total Length Rounding Direction  -->
      <TotalLengthRoundingDirection value="nearest"/>
      <!-- Acceptable values are up, down and nearest"-->

      <DimensionRoundingAccuracy value="5mm"/>
      <!-- Can be expressed in any length unit e.g. "1 feet"-->

      <TotalLengthRoundingAccuracy value="25mm"/>
      <!-- Can be expressed in any length unit e.g. "1 feet"-->
    </RoundingValues>

    <!-- Numbering values are used in numbering -->
    <NumberingValues>
      <!-- Adaptive Layers -->
      <AdaptiveLayersIndividually value="false"/>
      <!-- true: Number bars individually else Number bars as a whole -->

      <!--Prefix For Coupler-->
      <PrefixForCoupler value="(C)"/>
      <!--Prefix added to the layer bar mark symbolizing the coupler relation-->
    </NumberingValues>
    
    <!-- Numbering display -->
    <Display>
      <!-- Separator used for display between Group and Number -->
      <Separator value="."/>

      <AdaptiveLayers>
        <!-- Option to group similar bars if true, no group otherwise -->
	  <GroupSimilarBars value="true"/>
        <!-- Separator used for display between Start and End values -->
          <Separator value="~"/>
      </AdaptiveLayers>
    </Display>

  </Numberings>
</ConcreteDesign>

Road Attainment Methods

/* ========================================================================== */
/* AlignmentDesignRule.CATRule                                                */
/*                                                                            */
/* Sample file to customize alignment superelevation attainment methods.      */
/* User can customize this file for each project.                             */
/*                                                                            */
/* ========================================================================== */
/* Defines formulae for the various transition lengths                        */
/* for attaining superelevation                                               */
/* Based on the following variables                                           */
/*    {e} - full superelevation rate for the curve from the tables (%)        */
/*    {c} - normal crown slope (%, positive)                                  */
/*    {s} - normal shoulder slope (%, positive)                               */
/*    {t} - the transition length from the tables                             */
/*    {w} - greatest width from the pivot point to edge of traveled way       */
/*    {l} - length of the spiral (found in alignment)                         */
/*    {p} - fractional part of transition length achieved before BC point     */
/*    {q} - Rate of increase of centripetal acceleration traveling            */
/*          along curve at constant speed                                     */
/*    {v} - speed                                                             */
/*    {r} - radius                                                            */
/* ========================================================================== */
/* Defines the following transition lengths (where approriate)                */
/*    LCtoFS - Level Crown to Full Super (runoff)                             */
/*    LCtoBC - Level Crown to Beginning of Curve                              */
/*    NCtoFS - Normal Crown to Full Super (instead of LCtoFS on planar roads  */
/*    NCtoBC - Normal Crown to Begin Curve (instead of LCtoBC on planar roads */
/*    NCtoLC - Normal Crown to Level Crown (runout)                           */
/*    LCtoRC - Level Crown to Reverse Crown                                   */
/*    NStoNC - Normal Shoulder to Normal Crown                                */
/* ========================================================================== */

/* Get inputs */
Let e(real) 
Let c(real)
Let s(real)
Let t(real)
Let w(real)
Let l(real)
Let p(real)
Let q(real)
Let v(real)
Let r(real)
Let LaneType(integer)

e = Parameters.GetAttributeReal("eRate")
c = ThisObject.GetAttributeReal("Angle")
t = Parameters.GetAttributeReal("tLength")
l = Parameters.GetAttributeReal("sLength")
p = ThisObject.GetAttributeReal("TRate")
v = Parameters.GetAttributeReal("Speed")
r = Parameters.GetAttributeReal("Radius")

LaneType = ThisObject.GetAttributeInteger("LaneType")

/* Compute outputs */
Let LCtoFS(real)
Let LCtoBC(real)
Let NCtoFS(real)
Let NCtoBC(real)
Let NCtoLC(real)
Let LCtoRC(real)
Let NStoNC(real)

if(LaneType==0)
{
  NCtoFS=t-t*c/e
  NCtoBC=t*(p-c/e)
  LCtoFS=t
  LCtoBC=p*t
  NCtoLC=t*c/e

  /* Write outputs */
  Parameters.SetAttributeReal("NCtoFS", NCtoFS)
  Parameters.SetAttributeReal("NCtoBC", NCtoBC)
  Parameters.SetAttributeReal("LCtoFS", LCtoFS)
  Parameters.SetAttributeReal("LCtoBC", LCtoBC)
  Parameters.SetAttributeReal("NCtoLC", NCtoLC)
}
else if(LaneType==1)
{
  LCtoFS=t
  LCtoBC=p*t
  NCtoLC=t*c/e
  LCtoRC=t*c/e
  NStoNC=t*(s-c)/e

  /* Write outputs */
  Parameters.SetAttributeReal("LCtoFS", LCtoFS)
  Parameters.SetAttributeReal("LCtoBC", LCtoBC)
  Parameters.SetAttributeReal("NCtoLC", NCtoLC)
  Parameters.SetAttributeReal("LCtoRC", LCtoRC)
  Parameters.SetAttributeReal("NStoNC", NStoNC)
}

Road Superelevation and Transition Length Rules

You can define a formula calculating the superelevation of a road and the superelevation transition length thanks to a Business Rule. To compute superelevation and transition length, the following parameters are used as input:

  • Speed
  • Radius
  • Rotation mode
  • Normal crown/normal slope
  • Width and lane type

Defining a superelevation and transition length from design rule tables is also possible.

/* ================================================================================ */
/* RoadSuperelevationAndTransitionLengthRules_Sample.CATRule			 */
/*											       */
/* Sample file to calculate superelevation and transition length.		   */
/* User can customize this file for each project.				      */
/*											       */
/* ============================================================================= */
/* Defines formulas for Superelevation and transition length.		       */
/* Based on the following variables						       */
/*    {FormulaId}		 - formula identifier given by design rules:       */
/*					"FranceARP"		                      */
/*					"General condition - Max 10%"                 */
/*					"General condition - Max  8%"                 */
/*					"General condition - Max  6%"                 */
/*					"Snow condition"                              */
/*    {speed}    - current design speed                         (m/s)	     */
/*    {radius}   - Curve radius from geometry                  (m)		 */
/*    {category} - Road Category (R60, R80, ...)				      */
/*    {nbLanes}  - Number of Road lanes	                                   */
/* ============================================================================= */
/* Defines superelevation and transition length values			       */
/*    superelevation    -   Applied superelevation for the curve	(%)	 */
/*    tLengthIn      - In Transition length (m)					 */
/*    tLengthOut     - Out Transition length (m)				      */
/*    tLengthInMin   - Minimum In Transition length (m)			      */
/*    tLengthInMax   - Maximum In Transition length (m)			      */
/*    tLengthOutMin  - Minimum Out Transition length (m)			     */
/*    tLengthOutMax  - Maximum Out Transition length (m)                   

/* ============================================================================= */
/* Defines superelevation and transition length values			       */
/*    superelevation    -   Applied superelevation for the curve	(%)	 */
/*    tLength			-   Transition length		  (m)	   */
/* ==============================================================================*/

/* Parameters */
Let myCurve		(AECHorizontalArc)
Let HA			(AECAlignment2DHorizontal)
Let rotationMode (TraveledWayRotationModeEnum)
Let FormulaId	(String)
Let category	(String)
Let speed		(speed)
Let radius		(Length)
Let BIn			(Length)
Let BOut		(Length)
Let BInLeft		(Length)
Let BInRight	(Length)
Let BOutLeft	(Length)
Let BOutRight	(Length)
Let Direction	(Angle)
Let NC			(Angle)
Let delta		(Angle)
Let LaneType	(integer)
Let nbLanes		(integer)
Let P			(real)

/* Outputs */
Let superelevation	(real)
Let tLength			(Length)
Let tLengthIn		(Length)
Let tLengthOut		(Length)
Let tLengthInMin	(Length) 
Let tLengthInMax	(Length) 
Let tLengthOutMin	(Length)
Let tLengthOutMax	(Length)

/* Get Inputs */
FormulaId = Parameters.GetAttributeString("FormulaId")
Set myCurve = ThisObject

/* Compute outputs */

if(NULL<>myCurve)
{
	Let centerH(Length)
	Let centerV(Length)
	Let ArcRadius(Length)
	Arc->GetCenterRadius(centerH, centerV, ArcRadius)
	Set radius=ArcRadius
	Set speed = Arc->GetSpeed()
	Set category = Arc->GetCategory()
	Set nbLanes = Arc->GetNumberOfLanes()	

	if (FormulaId=="FranceARP")
	{
		Let Rnd(real)
		Let Rdm(real)
		Let Rm(real)
		if (category=="R60")
		{
			Rnd=600
			Rdm=450
			Rm=120
			if (radius>=Rdm)
			{
				superelevation = 0.025
			} else if (radius>=Rm)
			{
				superelevation = ((736.4/radius) + 0.86)/100.0
			} else
			{
				superelevation=0.07
			}	
		} else 
		{
			Rnd=900
			Rdm=650
			Rm=240
			if (radius>=Rdm)
			{
				superelevation = 0.025
			} else if (radius>=Rm)
			{
				superelevation = ((1712/radius) - 0.13)/100.0
			} else
			{
				superelevation = 0.07
			}
		}
		/** Transition length **/
		if (nbLanes<=2)
		{
			tLength=6*(radius**0.4)
			tLength=min(tLength,67)
		} else if(nbLanes==3)
		{
			tLength=9*(radius**0.4)
			tLength=min(tLength,100)
		} else
		{
			tLength=12*(radius**0.4)
			tLength=min(tLength,133)
		}
	}

}

superelevation=max(superelevation,0.02)
tLength=max(tLength,15)

superelevation=max(superelevation,0.02)

tLengthInMax = -1m
tLengthInMin = -1m
tLengthOutMax = -1m
tLengthOutMin = -1m

/* Write outputs */
Parameters.SetAttributeReal("Superelevation", superelevation)
Parameters.SetAttributeReal("tLengthIn", tLengthIn)
Parameters.SetAttributeReal("tLengthOut", tLengthOut)
Parameters.SetAttributeReal("tLengthInMax", tLengthInMax)
Parameters.SetAttributeReal("tLengthInMin", tLengthInMin)
Parameters.SetAttributeReal("tLengthOutMax", tLengthOutMax)
Parameters.SetAttributeReal("tLengthOutMin", tLengthOutMin)
Support of National Design Rules
Country-specific design rules for superelevation and transition length are supported thanks to additional formulas in the business rules and resources tables. You can also define two outputs in formulas: the In/Out transition lengths, with minimum/maximum values.

Road Widening and Transition Length Rules

You can define a formula calculating the widening of a road and the widening transition length thanks to a Business Rule. To compute widening and transition length, the following parameters are used as input:

  • Speed
  • Radius
  • Lane Distribution

The transition length is defined in the superelevation attainment methods, by comparing superelevation transition length and widening transition length.

Defining a widening and transition length from design rule tables is also possible.

Compute road widening and the transition length corresponding to the widening: Example of Business Rule
/* ================================================================================*/
/* RoadWideningAndTransitionLengthRules_Sample.CATRule				   */
/*												  */
/* Sample file to calculate Widening and transition length.			    */
/* User can customize this file for each project.					 */
/*												  */
/* ================================================================================*/
/* Defines formulas for Widening and transition length.			        */
/* Based on the following variables							  */
/*    {FormulaId}		 - formula identifier given by design rules: 	 */
/*							- "DefaultWideningFormula"	  */
/*    {speed}    - current design speed                         (m/s)		 */
/*    {radius}   - Curve radius from geometry			(m)		  */
/*    {nbLanes}  - Number of Road lanes						    */
/*    {Direction} - Turn rotation direction						*/
/*							- "Left Turn"			  */
/*							- "Right Turn"			 */
/* ================================================================================*/
/* Defines Widening and transition length values					  */
/*    Widening				- Applied Widening for the curve	(m) */
/*    Ratio					- Widening ratio on inner edge	(%)*/
/*    tLengthIn				- In Transition length (m)		   */
/*    tLengthOut			- Out Transition length (m)			 */
/*    tLengthInMin			- Minimum In Transition length (m)	     */
/*    tLengthInMax			- Maximum In Transition length (m)	     */
/*    tLengthOutMin			- Minimum Out Transition length (m)	   */
/*    tLengthOutMax			- Maximum Out Transition length (m)	   */
/* ================================================================================*/

/* Parameters */
Let myCurve		(AECHorizontalArc)
Let FormulaId		(String)
Let Direction		(String)
Let bTurnRight		(boolean)
Let radius		(Length)
Let speed		(speed)

/* Outputs */
Let Widening		(Length)
Let Ratio		(RATIO)
Let tLength		(Length)
Let tLengthIn		(Length)
Let tLengthOut		(Length)
Let tLengthInMin		(Length) 
Let tLengthInMax		(Length) 
Let tLengthOutMin	(Length)
Let tLengthOutMax	(Length)

/* Get Inputs */
FormulaId = Parameters.GetAttributeString("FormulaId")
Set myCurve = ThisObject

/* Compute outputs */

if (NULL <> myCurve)
{
	Let centerH	(Length)
	Let centerV	(Length)
	myCurve->GetCenterRadius(centerH, centerV, radius)
	Set speed = myCurve->GetSpeed()
	Set Direction = myCurve->GetDirection()
	If (Direction == "Right Turn") bTurnRight = true

	if (FormulaId == "DefaultWideningFormula")
	{
		Let ListLeftLane		(List)
		Let ListCenterLane	(List)
		Let ListRightLane		(List)
		myCurve->GetTraveledWayLaneDistribution(ListLeftLane, ListCenterLane, ListRightLane)
		Let eTravelingDir			(LaneDirectionEnum)
		Let DesignVehicleList		(list)
		Let WidthInCurve		   	 (Length)
		Let LeftWidthInCurve		(Length)
		Let CenterWidthInCurve		(Length)
		Let RightWidthInCurve		(Length)
		Let LeftWidthInTangent		(Length)
		Let CenterWidthInTangent		(Length)
		Let RightWidthInTangent		(Length)
		Let ii				(Integer)
		Let nbLanes			(Integer)
		ii = 1
		nbLanes = ListLeftLane.Size()
		for ii while ii <= nbLanes
		{
			Let LeftLane		(AECLaneType)
			Let C			(Length)
			Let WidthOfLane		(Length)
			Let bIsMostOutside	(boolean)
			Let nbVehicles		(integer)
			Let jj			(Integer)
			jj=1
			bIsMostOutside = false
			LeftLane = ListLeftLane->GetItem(ii) 

			C = LeftLane.GetLateralClearance()
			eTravelingDir = LeftLane.GetTravelingDirection()
			if ("LaneDirection_None" == eTravelingDir) continue
			DesignVehicleList = LeftLane.GetDesignVehicles()
			if (true == bTurnRight AND nbLanes == ii) bIsMostOutside = true
			nbVehicles=DesignVehicleList.Size()
			for jj while jj <= nbVehicles
			{
				Let DesignVehicle		(AECVehicleType)
				Let U			(Length)
				Let FA			(Length)
				Let Wc			(Length)
				DesignVehicle = DesignVehicleList->GetItem(jj) 
				U = DesignVehicle.GetSweptPathWidth(radius*1.e3)
				if (false == bIsMostOutside) 
					FA = DesignVehicle.GetFrontOverhangWidth(radius*1.e3)
				Wc = U + FA + C
				WidthOfLane = max(Wc,WidthOfLane)
			}
			LeftWidthInCurve = LeftWidthInCurve + WidthOfLane
			LeftWidthInTangent = LeftWidthInTangent + LeftLane.GetWidth()
		}

		/** Compute ratio **/
		Let LeftWc	(Length)
		Let RightWc	(Length)
		LeftWc = LeftWidthInCurve - LeftWidthInTangent + (CenterWidthInCurve - CenterWidthInTangent ) / 2.
		RightWc = RightWidthInCurve - RightWidthInTangent + (CenterWidthInCurve - CenterWidthInTangent ) / 2.
		if((LeftWc + RightWc) > 0)
		{
			if (true == bTurnRight)
				Ratio = RightWc / (LeftWc + RightWc)
			else
				Ratio = LeftWc / (LeftWc + RightWc)
		}
		else
			exit

		/** Widening value **/
		// Extra width allowance Z
		Let Z 	(real)
		Z = 0.1*(3.6*speed) / sqrt(radius)*1.e3
		Widening = LeftWidthInCurve + RightWidthInCurve + CenterWidthInCurve + Z - LeftWidthInTangent - RightWidthInTangent - CenterWidthInTangent

		/** Transition length **/
		Widening = Widening * 1.e-3
		tLengthIn = 15. * Widening
		tLengthOut = 15. * Widening
		tLengthIn = max(tLengthIn, 10m)
		tLengthOut = max(tLengthOut, 10m)
	}
}

tLengthInMax = -1.m
tLengthInMin = 10.m
tLengthOutMax = -1.m
tLengthOutMin = 10.m

/* Write outputs */
Parameters.SetAttributeDimension("Widening", Widening, "LENGTH")
Parameters.SetAttributeDimension ("Ratio", Ratio, "RATIO")
Parameters.SetAttributeDimension("tLengthIn", tLengthIn, "LENGTH")
Parameters.SetAttributeDimension("tLengthOut", tLengthOut, "LENGTH")
Parameters.SetAttributeDimension("tLengthInMax", tLengthInMax, "LENGTH")
Parameters.SetAttributeDimension("tLengthInMin", tLengthInMin, "LENGTH")
Parameters.SetAttributeDimension("tLengthOutMax", tLengthOutMax, "LENGTH")
Parameters.SetAttributeDimension("tLengthOutMin", tLengthOutMin, "LENGTH")
Design Rules: Example of Widening transition length
With a design rule table, you can compute the transition length that corresponds to the curve widening. The Widening transition length can be determined from the following inputs: Design speed (30km/h, 50 km/h, 80 km/h), radius (for example: 300m) and the table name of the curve widening (lane distribution and width).
<CurveWideningTables>
    <CurveWideningTable Name="2 Lanes - 7.2m">
      <WideningDesignSpeed speed="30km_h">
        <Widening radius="3000m" widening="0.1m" tLength="10m"/>
        <Widening radius="2500m" widening="0.2m" tLength="10m"/>
        <Widening radius="2000m" widening="0.2m" tLength="10m"/>
        <Widening radius="1500m" widening="0.2m" tLength="30m"/>
        <Widening radius="1000m" widening="0.3m" tLength="30m"/>
        <Widening radius="900m"  widening="0.4m" tLength="30m"/>
        <Widening radius="800m"  widening="0.4m" tLength="10m"/>
        <Widening radius="700m"  widening="0.5m" tLength="10m"/>
        <Widening radius="600m"  widening="0.5m" tLength="10m"/>
        <Widening radius="500m"  widening="0.6m" tLength="10m"/>
        <Widening radius="400m"  widening="0.7m" tLength="15m"/>
        <Widening radius="300m"  widening="1.0m" tLength="15m"/>
        <Widening radius="250m"  widening="1.1m" tLength="20m"/>
        <Widening radius="200m"  widening="1.4m" tLength="25m"/>
        <Widening radius="150m"  widening="1.8m" tLength="30m"/>
        <Widening radius="140m"  widening="1.9m" tLength="30m"/>
        <Widening radius="130m"  widening="2.1m" tLength="35m"/>
        <Widening radius="120m"  widening="2.2m" tLength="35m"/>
        <Widening radius="110m"  widening="2.4m" tLength="40m"/>
        <Widening radius="100m"  widening="2.7m" tLength="45m"/>
        <Widening radius="90m"   widening="3.0m" tLength="45m"/>
        <Widening radius="80m"   widening="3.3m" tLength="50m"/>
 <Widening radius="70m"   widening="3.8m" tLength="60m"/>      
</WideningDesignSpeed>
      <WideningDesignSpeed speed="50km_h">
…
</WideningDesignSpeed>
      </CurveWideningTable >
  </CurveWideningTables>

Subgrade Surface Width and Transition Length

You can define a table or formula calculating the width and transition length of a subgrade surface thanks to Business Rules. To compute width and transition length, the following parameters are used as input:

  • Design speed
  • Railway track type (Mono or Dual)
  • The ballast availability

A default transition length is provided before and after the widening of the surface.

 
win_b64\resources\knowledge\scripts\SubgradeSurfaceWidthAndTransitionLengthRules_Sample.CATRule
/* ================================================================================*/
/* SubgradeSurfaceWidthAndTransitionLengthRules_Sample.CATRule			  */
/*												   */
/* Sample file to calculate width and transition length.				 */
/* User can customize this file for each project.					  */
/*												   */
/* ================================================================================ */
/* Defines formulas for Widening and transition length.				   */
/* Based on the following variables							    */
/*    {FormulaId}	- formula identifier given by design rules: 		    */
/*			- "DefaultSubgradeSurfaceWidthFormula"			      */
/*    {mySection}   	- The Current section           			       */
/*    {my3DCurve}   	- The 3D Alignment Curve           			    */
/*    {Speed}    	- The section Speed                      		(m/s)   */
/*    {Distance}	- The section Curvilinear distance       	(m)		*/
/*    {IsBallast}   	- The section Ballast availability      		(True/False)*/
/*    {trackType}   	- The Subgrade Surface Track Type 		(Mono/Dual)  */
/* ================================================================================    */
/* Defines Width and transition length values						   */
/*    LeftWidth	- Applied width for the section		(m)		      */
/*    RightWidth	- Applied width for the section		(m)		     */
/*    tLength		- Transition length			(m)			*/
/*    tLengthMin	- Minimum Transition length 		(m)			 */
/*    tLengthMax	- Maximum Transition length 		(m)			 */
/* ================================================================================    */

/* Get Inputs */
Let mySection	(AECSubgradeSection) 
Let FormulaId	(String)

Set mySection	= ThisObject
FormulaId		= Parameters.GetAttributeString("FormulaId")

/* Parameters */
Let my3DCurve	(AEC3DAlignmentCurve) 
Let trackType	(RailTrackTypeEnum)
Let isBallast	(boolean)
Let Speed		(Speed)
Let Distance	(LENGTH)

/* Outputs */
Let Width			(Length)
Let tLength			(Length)
Let tLengthMax		(Length)
Let tLengthMin		(Length)

/* Compute outputs */

if (NULL <> mySection)
{
	Distance = mySection->GetDistance()
	my3DCurve = mySection->Get3DAlignmentCurve()
	if (NULL <> my3DCurve)
	{
		Speed = my3DCurve->GetSpeed(Distance)
	}
	isBallast = mySection->GetIsBallast()
	trackType = mySection->GetTrackType()

	if (FormulaId == "DefaultSubgradeSurfaceWidthFormula")
	{
		if (isBallast == true)
		{
			If (trackType == "RailTrackType_Mono")
			{
				Width = 8.8m
			} 
			else if (trackType == "RailTrackType_Dual")
			{
				if     (Speed >= 350km_h) Width = 13.8m
				else if (Speed >= 300km_h) Width = 13.6m
				else Width = 13.4m
			}
		}
		else
		{
			If (trackType == "RailTrackType_Mono")
			{
				Width = 8.6m
			} 
			else if (trackType == "RailTrackType_Dual")
			{
			  if     (Speed >= 350km_h) Width = 13.6m
			  else if (Speed >= 300km_h) Width = 13.4m
			  else Width = 13.2m
			}
		}
		
		/** Transition length **/
		tLength = 5.m
	}
}
tLengthMax = -1.m
tLengthMin = 5.m

/* Write outputs */
Parameters.SetAttributeDimension("LeftWidth", Width/2., "LENGTH")
Parameters.SetAttributeDimension("RightWidth", Width/2., "LENGTH")
Parameters.SetAttributeDimension("tLength", tLength, "LENGTH")
Parameters.SetAttributeDimension("tLengthMax", tLengthMax, "LENGTH")
Parameters.SetAttributeDimension("tLengthMin", tLengthMin, "LENGTH")

Subgrade Surface Curve Widening and Transition Length

You can define a table or formula calculating the curve widening and transition length of a subgrade surface thanks to Business Rules. To compute widening and transition length, the following parameters are used as input:

  • Design Speed
  • Curve Radius

A default transition length corresponding to the In/Out spiral length is provided before and after the widening of the surface.

win_b64\resources\knowledge\scripts\SubgradeSurfaceCurveWideningAndTransitionLengthRules_Sample.CATRule
/* ================================================================================	*/
/* SubgradeSurfaceCurveWideningAndTransitionLengthRules_Sample.CATRule			*/
/*									*/
/* Sample file to calculate Subgrade Surface Curve widening and transition length.	*/
/* User can customize this file for each project.						*/
/*									*/
/* ================================================================================     */
/* Defines formulas for Widening and transition length.					*/
/* Based on the following variables							       */
/*    {FormulaId}	- formula identifier given by design rules: 			 */
/*			- "DefaultSubgradeSurfaceCurveWideningFormula"		       */
/*    {my3DCurve}		- The 3D Alignment Curve           			   */
/*    {Speed}    		- The Curve In Speed                    		(m/s)*/
/*    {Distance}		- The Curve In Curvilinear distance    	(m)	   */
/*    {Radius}		- The Curve Radius		   	(m)		   */
/*    {InSpiralLength}		- The In Spiral Length			(m)	 */
/*    {OutSpiralLength} 		- The Out Spiral Length			(m)    */
/* ================================================================================    */
/* Defines Widening and transition length values						*/
/*    Widening		- Applied Widening for the curve		(m)	      */
/*    Ratio			- Widening ratio on inner edge		(%)	    */
/*    InTransitionLength		- In transition length			(m)      */
/*    InTransitionLengthMin	- Minimum In Transition length		(m)	 */
/*    InTransitionLengthMax	- Maximum In Transition length		(m)	 */
/*    OutTransitionLength		- Out transition length			(m)   */
/*    OutTransitionLengthMin	- Minimum Out Transition length		(m)     */
/*    OutTransitionLengthMax	- Maximum Out Transition length		(m)     */
/* ================================================================================    */

/* Get Inputs */
Let my3DCurve		(AEC3DAlignmentCurve) 
Let FormulaId		(String)
Let Distance		(Length)
Let InSpiralLength		(Length)
Let OutSpiralLength		(Length)

Set my3DCurve	= ThisObject
FormulaId		= Parameters.GetAttributeString("FormulaId")
Distance		= Parameters.GetAttributeReal("Distance")
InSpiralLength	= Parameters.GetAttributeReal("InSpiralLength")
OutSpiralLength	= Parameters.GetAttributeReal("OutSpiralLength")

/* Parameters */
Let Radius			(Length)
Let Speed			(Speed)

/* Outputs */
Let Widening		(Length)
Let Ratio			(RATIO)
Let InTransitionLength		(Length)
Let InTransitionLengthMin	(Length)
Let InTransitionLengthMax	(Length)
Let OutTransitionLength		(Length)
Let OutTransitionLengthMin	(Length)
Let OutTransitionLengthMax	(Length)

/* Compute outputs */

if (NULL <> my3DCurve)
{
	Speed = my3DCurve->GetSpeed(Distance)
	Radius = my3DCurve->GetRadius(Distance)

	if (FormulaId == "DefaultSubgradeSurfaceCurveWideningFormula")
	{
		if (Speed == 120km_h)
		{
			if     (Radius >= 5000m) Widening = 0.1m
			else if (Radius < 5000m AND Radius >= 1600m) Widening = 0.2m
			else if (Radius < 1600m AND Radius >= 1200m) Widening = 0.3m
			else if (Radius < 1600m) Widening = 0.4m
		}
		else if (Speed == 160km_h)
		{
			if     (Radius >= 10000m) Widening = 0.1m
			else if (Radius < 10000m AND Radius >= 3000m) Widening = 0.2m
			else if (Radius < 3000m AND Radius >= 2000m) Widening = 0.3m
			else if (Radius < 2000m) Widening = 0.4m
		}
		else if (Speed == 200km_h)
		{
			if     (Radius >= 6000m) Widening = 0.2m
			else if (Radius < 6000m AND Radius >= 3500m) Widening = 0.3m
			else if (Radius < 3500m) Widening = 0.4m
		}
		else if (Speed == 300km_h)
		{
			if     (Radius >= 14000m) Widening = 0.2m
			else if (Radius < 14000m AND Radius >= 9000m) Widening = 0.3m
			else if (Radius < 9000m AND Radius >= 7000m) Widening = 0.4m
			else if (Radius < 7000m AND Radius >= 5000m) Widening = 0.5m
			else if (Radius < 5000m) Widening = 0.6m
		}
		else if (Speed == 350km_h)
		{
			if     (Radius >= 12000m) Widening = 0.3m
			else if (Radius < 12000m AND Radius >= 9000m) Widening = 0.4m
			else if (Radius < 9000m AND Radius >= 6000m) Widening = 0.5m
			else if (Radius < 6000m) Widening = 0.6m
		}		

		/** Ratio on Enner Edge **/
		Ratio = 0%

		/** Transition length **/
		if (InSpiralLength > 0)
		{
			InTransitionLength = InSpiralLength
		}
			
		if (OutSpiralLength > 0)
		{
			OutTransitionLength = OutSpiralLength
		}
		InTransitionLength = max(InTransitionLength, 5.m)
		OutTransitionLength = max(OutTransitionLength, 5.m)
	}
}

InTransitionLengthMax = -1.m
InTransitionLengthMin = 5.m
OutTransitionLengthMax = -1.m
OutTransitionLengthMin = 5.m

/* Write outputs */
Parameters.SetAttributeDimension("Widening", Widening, "LENGTH")
Parameters.SetAttributeDimension ("Ratio", Ratio, "RATIO")
Parameters.SetAttributeDimension("InTransitionLength", InTransitionLength, "LENGTH")
Parameters.SetAttributeDimension("InTransitionLengthMax", InTransitionLengthMax, "LENGTH")
Parameters.SetAttributeDimension("InTransitionLengthMin", InTransitionLengthMin, "LENGTH")
Parameters.SetAttributeDimension("OutTransitionLength", OutTransitionLength, "LENGTH")
Parameters.SetAttributeDimension("OutTransitionLengthMax", OutTransitionLengthMax, "LENGTH")
Parameters.SetAttributeDimension("OutTransitionLengthMin", OutTransitionLengthMin, "LENGTH")

Railway Attainment Methods

/* ========================================================================== */
/* RailwayAttainmentMethods.CATRule                                           */
/*                                                                            */
/* Sample file to customize Railway attainment methods.                       */
/* User can customize this file for each project.                             */
/*                                                                            */
/* ========================================================================== */
/* Defines formulae for the various transition lengths                        */
/* for attaining Cant								     */
/* Based on the following variables                                           */
/*    {l} - spiral length from geometry					       */
/*    {t} - transition length from table					      */
/*    {m} - maximum cant value on Tangent					     */
/*    {a} - applied cant for the curve					        */
/*    {p} - fractional part of transition length achieved before curve point  */
/* ========================================================================== */
/* Defines the following transition lengths (where approriate)                */
/*    LRtoFC - Level Rail to Full Cant                                        */
/*    LRtoBC - Level Rail to Beginning of Curve                               */
/* ========================================================================== */
/* Get inputs */Let l(real)Let t(real)Let m(real)Let a(real)Let p(real)l = Parameters.GetAttributeReal("sLength")t = 
   Parameters.GetAttributeReal("tLength")m = Parameters.GetAttributeReal("MaxCantOnTangent")a = 
   Parameters.GetAttributeReal("Cant")p = ThisObject.GetAttributeReal("TRate")
/* Compute outputs */Let LRtoFC(real)Let LRtoBC(real)if(l>0){	LRtoFC=l	LRtoBC=l*p}else {LRtoFC=t if (a>0 AND m>0) 
   {		Let threshold(real)		threshold=m/a		if(threshold<p ){LRtoBC=t*threshold} else {LRtoBC=t*p}}	
   else 	{		LRtoBC=t*p	}}/* Write outputs */Parameters.SetAttributeReal("LRtoFC", 
   LRtoFC)Parameters.SetAttributeReal("LRtoBC", LRtoBC)

Railway Cant and Transition Length Rules

/* ================================================================================ */
/* RailwayCantAndTransitionLengthRules_Sample.CATRule				    */
/*											         */
/* Sample file to calculate cant and transition length.				  */
/* User can customize this file for each project.					 */
/*											         */
/* ================================================================================ */
/* Defines formulas for Cant and transition length.				       */
/* Based on the following variables							   */
/*    {FormulaId}    - formula identifier given by design rules			 */
/*               -"France": "China" and "CantDeficiency"				 */
/*                   Cant(mm)   = 6*Speed^2/radius				       */
/*                   tLength(m) = max(50,5.8*Speed*Speed*Speed/(180*radius))	 */
/*               -"China":								     */
/*                   Cant(mm)   = 0.64*trackWidth*Speed*Speed/(3.6*3.6*g*radius)    */
/*                   tLength(m) = 0.01*Cant*Speed					  */
/*               -"CantDeficiency":						         */
/*                   Cant(mm)   = ceil((eqCant-md)*2)/2				  */
/*                   tLength(m) = 0.012*cantDeficiency*Speed			    */
/*    {trackWidth}  - track width                                     (m)	    */
/*    {speed}		- current design speed                            (m/s)   */
/*    {radius}		- Curve radius from geometry                      (m)    */
/*    {md}			- maximum allowable cant deficiency               (m) */
/*    {me}			- maximum allowable cant excess                   (m) */
/*    {smax}		- maximum speed                                   (m/s)   */
/*    {smin}		- minimum speed                                   (m/s)   */
/*    {g}			- gravity acceleration                            (m/s^2)*/
/* ================================================================================ */
/* Defines cant and transition length values					       */
/*    cant    -   Applied cant for the curve                      (m)		  */
/*    tLength -   Transition length                               (m)		  */
/* ================================================================================ */

/* Get inputs */
Let FormulaId	(String)
Let trackWidth  (Length)
Let speed		(real)
Let radius		(Length)
Let md			(Length)
Let me			(Length)
Let smax		(real)
Let smin		(real)
Let myHA		(AECAlignment2DHorizontal)
Let Arc			(AECHorizontalArc)

/* Compute outputs */
Let cant		(real)
Let tLength		(real)

FormulaId    = Parameters.GetAttributeString("FormulaId")
Set Arc = ThisObject

if (NULL<>Arc)
{
	Let centerH		(Length)
	Let centerV		(Length)
	Let ArcRadius	(Length)
	Arc->GetCenterRadius(centerH, centerV, ArcRadius)
	Set radius=ArcRadius
	Set speed = Arc->GetSpeed()
	Set myHA = Arc->GetHorizontalAlignment()
	if(NULL<>myHA)
	{
		Set trackWidth = myHA->GetTrackWidth()
		Set md    = myHA->GetMaximumAllowableCantDeficiency()
		Set me    = myHA->GetMaximumAllowableCantExcess()
		Set smax  = myHA->GetMaximumSpeed()
		Set smin  = myHA->GetMinimumSpeed()		
	}
} 

/* Local attributs */
Let	g   (real)    /*Gravity*/
Let eqCant(real)  /*Equilibrium cant*/
g=9.806

/* Convert Speeds in km_h*/	
Let maxSpeed (Real)
speed=speed*3.6 
maxSpeed =smax*3.6
if(radius>0)
{
	if(FormulaId=="France"){
		cant=round(6*speed*speed/radius)/1000
		tLength=round(max(10,5.8*speed*speed*speed/(180*radius)))
	} 
	else if (FormulaId=="China")
	{
		cant=round(0.64*trackWidth*1000*speed*speed/(3.6*3.6*g*radius))/1000
		tLength=round(0.01*cant*1000*speed)
	}
	else if(FormulaId=="CantDeficiency") 
	{	
		eqCant=round(trackWidth*1000*maxSpeed*maxSpeed/(127*radius))/1000
		cant=ceil((eqCant-md)*2000)/2000

		Let cantDeficiency(real)
		cantDeficiency=round(trackWidth*1000*maxSpeed*maxSpeed/(127*radius))/1000-cant

		tLength=round(0.012*cantDeficiency*1000*speed)		
	}
}

cant=max(cant,0.005)
tLength=max(tLength,5)

/* Write outputs */
Parameters.SetAttributeReal("Cant", cant)
Parameters.SetAttributeReal("tLength", tLength)

BIM Attribute Completion

You can customize the behavior of BIM attributes by giving them a value through a Business Rule in Data Setup.

To perform an automatic completion of missing IFC attributes in the BIM Attributes panel, you can use the BIM Completeness command. It activates the BIM Attribute Completion Business Rule you have assigned to the Building & Civil Resources resource table. Several attributes can be defined/computed in BIM Attributes at the same time, which saves time in design.

The Business Rule script below is an example. If no XML resource file is set in Data Setup, the BIMAttributeCompletionRule_Sample.CATRule file delivered in startup\Civil\ is used. There is a condition on the Slab Reference and Gross Volume Attributes in the script. Then the Gross Volume is computed and, its value and the slab reference are added in the corresponding attribute boxes in the BIM Attributes panel.

/* ========================================================================== */
/* BIMAttributeCompletionRule_Sample.CATRule                                  */
/*                                                                            */
/* Sample file to automatize the completion of IFC attribute		     */
/*                                                                            */
/* ========================================================================== */
/* Based on the following variables                                   	  */
/*    {attributeName}                                                         */
/* ========================================================================== */
/* Defines attribute value							      */
/*    {attributeValue}								    */
/* ========================================================================== */


/* Get inputs */
Let attributeName (String)
attributeName = Parameters.GetAttributeString("AttributeName")

/* Write outputs */
if(attributeName=="IfcPset_SlabCommon_Reference"){
	(ThisObject:IfcPset_SlabCommon).IfcPset_SlabCommon_Reference="18.12.0456"
	Parameters.SetAttributeString("AttributeValue", "18.12.0456")
}

if(attributeName=="IfcQto_SlabBaseQuantities_GrossVolume"){	
	Let partBodyList(List)
	partBodyList = ThisObject ->Query("BodyFeature","x.Name like \"*PartBody*\"")

	if(partBodyList.Size() > 0)
	{
		Let volume(VOLUME)
		volume = smartVolume(partBodyList->GetItem(1)) 

		Let skeletonList(List)
		skeletonList = ThisObject ->Query("Feature","x.Name like \"*Skeleton Representation*\"")

		if(skeletonList.Size() > 0)
		{
			Let skeleton(Feature)
			skeleton = skeletonList->GetItem(1)
		
			Let childrenListParam(List)
			childrenListParam = skeleton->Query("AdvisorParameterSet","x.Name like \"Parameters*\"")
		
			Let paramSet(AdvisorParameterSet)
			paramSet = childrenListParam->GetItem(1)
		
			paramSet->SetAttributeReal("IfcQto_SlabBaseQuantities_GrossVolume",volume)
			Parameters.SetAttributeReal("AttributeValue", volume)

		}else{
			(ThisObject:IfcQto_SlabBaseQuantities).IfcQto_SlabBaseQuantities_GrossVolume=volume
			Parameters.SetAttributeReal("AttributeValue", volume)
		}
	}
}

Alignment Radius Rules

/* ================================================================================
/* AlignmentRadiusRules_Sample.CATRule					                
/*												
/* Sample file to calculate radius for horizontal arc.					
/* User can customize this file for each project.					
/*												
/* ================================================================================
/* Defines formulas for arc radius 						
/* Based on the following variables							
/*    {FormulaId}		 - formula identifier given by design rules: 		
/*							- "France ARP"			
/*												
/*    {speed}    - current design speed                         (m/s)		
/*    {angle}    - current arc central angle                    (ANGLE)		
/* ================================================================================
/* Defines arc radius values						
/*    MinRadius         		- Min radius applied radius for the curve  (m)     
/*    DefaultRadius         	   - Min radius applied radius for the curve  (m)     
/*    MaxRadius         		- Min radius applied radius for the curve  (m)     
/*												
/* ===============================================================================

/* Parameters */
Let myVerticalCurve		(AECVerticalArc)
Let myHorizontalCurve	     (AECHorizontalArc)
Let PreviousHorizontalArc	 (AECHorizontalArc)
Let Category			(STRING)
Let speed			   (SPEED)
Let angle			   (ANGLE)
Let FormulaId 		     (STRING)

/* Outputs */
Let MinRadius		      (LENGTH)
Let DefaultRadius	         (LENGTH)
Let MaxRadius		      (LENGTH)

/* Get Inputs */
FormulaId = Parameters.GetAttributeString("FormulaId")
Set myCurve = ThisObject

/* Compute outputs */

if (NULL <> myHorizontalCurve )
{
	Set speed  = myCurve->GetSpeed() 
	Set PreviousHorizontalArc = myCurve->GetPreviousArc()
Set Category = myCurve-> GetCategory()

	if (FormulaId == "France ARP")
	{
		if (Category == “R60” OR (speed < 80km_h AND Category = “”))
		{
				MinRadius     = 120m
				DefaultRadius = 450m
				MaxRadius     = 600m
		
		}
		else if (Category == “T80” OR Category == “R80” (speed < 100km_h AND Category = “”)
{			
				MinRadius     = 240m
				DefaultRadius = 650m
				MaxRadius     = 900m		
		}			
		else
		{
				MinRadius     = 425m
				DefaultRadius = 900m
				MaxRadius     = 1300m
		}								
	}
}

Else if (NULL <> myVerticalCurve )
{
	Set speed  = myCurve->GetSpeed()
Set Category = myCurve-> GetCategory()

	if (FormulaId == "France ARP")
	{
		if (Category == “R60” OR (speed < 80km_h AND Category = “”))
		{
				MinRadius     = 1500m
				DefaultRadius = 1500m
				MaxRadius     = 3000m
		
		}
		else if (Category == “T80” OR Category == “R80” (speed < 100km_h AND Category = “”	)
{			
				MinRadius     = 3000m
				DefaultRadius = 3000m
				MaxRadius     = 6000m		
		}			
		else
		{
				MinRadius     = 6000m
				DefaultRadius = 6000m
				MaxRadius     = 12000m
		}								
	}
}

/* Write outputs */
Parameters.SetAttributeDimension("MinRadius", MinRadius, "LENGTH")
Parameters.SetAttributeDimension("DefaultRadius", DefaultRadius, "LENGTH")
Parameters.SetAttributeDimension("MaxRadius", MaxRadius, "LENGTH")