GC SS6 - Creating and Modifying ABD Floors

The GC Floor Node can be used to create and update AECOsim Building Designer floors.

[Updated 29 April 2016 for ABD/GC SS6 Update 1]

The simplest workflow to achieve this is to start with a project floor master file that contains the Site but no Buildings. All floors will then be managed by the GC script that follows. The GC script will be used for all subsequent floor management.

Create a file for exclusive use by the team members responsible for floor management, e.g. FloorManagement_GC.dgn. The only use for this file should be floor creation/update.

Note that when GC is started for the first time in your project it will create a required folder "support\Assemblies" within your project folder.

The GC Nodes that will be used are:

  • Coordinate System
  • Building
  • Floor

As you progress it is a good idea to give meaningful names to the GC Nodes that you create and to the transactions that you save. This helps to make both the GC Graph and the underlying script legible when working with and maintaining them, particularly when revisiting a GC graph/script after a significant time interval.

This example has been updated to demonstrate

The steps required are:

  1. Create a Coordinate System node using the 'AtModelOrign' method. Name the node 'Building_A_CS'.
  2. Create a Coordinate System node using the 'ByCartesianCoordinates' method, pin the 'Z' output to the node for use in the next step. Name the node 'Building_A_RelElev'. Connect the output of 'Building_A_CS' to the CoordinateSystem port.
  3. Create a Building node using the 'CreateNewBuilding' method. Name the node 'Building_A'. In the CatalogItem, pick Building; Default. This will add the relevant DataGroup properties to the node. Note that the 'ArchBuilding_BuildingName' property is added to the techniques displayed on the node. Rename this property to match the node name, this avoids confusion later, use single quotation marks to contain the name, i.e. 'Building_A'. Connect the BaseElevation input to the 'Building_A_RelElev' Z output.
  4. Save a transaction, rename the transaction 'Create Building A'.
  5. Create a floor node using the 'CreateAtBuilding' method. Click in the CatalogItem technique, pick Floor; Default from the drop down.
    Connect the Output from Building_A to the OwningBuilding input of the new floor node.
    Double-click on the node to open the Node Properties panel. In this enter any information that you need to have in the node now and enter placeholder values in any properties that you anticipate needing to use later in the life of the project. (This is so that the relevant properties and values are included in the node before you copy it to all the other floors.)
    1. Name the node appropriately, e.g. A_Floor_00, enter a name in the 'ArchFloor_FloorName' property (this does not have to be the same as the node name, but it may be clearer if it is, on the other hand a short codename for the node may be better than a longer display name. The  'ArchFloor_FloorName' property is used by Floor Manager so this is the floor name that you will see used in the ABD interface.
    2. Enter the FFL or SSL in the 'ArchFloor_FinishedFloorElevation', this is the value that will be used by the Floor Manager Elevation field. (Note that in GC/ABD SS6 the floor to floor values are calculated from the input elevation values, whereas in ABD SS6 the floor to floor is the editable value that drives the floors.)
  6. Copy the floor node a couple of times and edit the names and elevation values.
  7. Save a transaction.

    Take a look at the results in Floor Manager:
  8. To add more floors (using this very simple demo method) copy and paste another floor node, edit the names and elevation values.
  9. Save a transaction.

Obviously copying and editing the floor node many times in the Graph view is a fairly tedious process. At this point go to the transactions panel and click on the 'Edit this transaction file' icon. Take a look at the structure of the script.

Note: More detailed descriptions of the transactions can be found in the Building Help documents, look for the Bentley GenerativeComponents Extension >  Getting Started > Transactions topic.

Rather than copying the floor nodes in the Graph view, copy and paste the node within this third transaction as many times as required, then edit the names and elevation values in the transaction script, this is much quicker than using the GUI and gives an understanding of what lies behind the GUI.

For very tall buildings this will also be relatively time consuming. If floors can be grouped logically into sets with the same floor to floor height, GC scripting could be used to generate groups of floors based on variables. Doing that is beyond the scope of this introductory article but the possibilities available through scripting are endless. The object of this article is to demonstrate a relatively simple example.

transaction modelChange 'Add Upper Floors'
{
    node User.Objects.Floor_08 Bentley.GC.NodeTypes.Floor
    {
        Technique                 = 'CreateAtBuilding';
        CatalogItem               = {'Floor','Default'};
        OwningBuilding            = Building_A;
        ArchFloor_FloorName       = 'A_Floor_09';
        ArchFloor_FinishedFloorElevation = 8000;
       
GraphLocation             = {505.0, 372.0};
    }
}

The Red text is the transaction, the green text is the node. Copy and paste as many nodes as you need.

See the attached text file for an example. To use this:

  1. Run ABD with GenerativeComponents
  2. Create a new file.
  3. Check that your Floor Manager does not have an existing building named 'Building_A'
  4. Go straight to the Transaction File Script Editor and paste the whole text. Click Ok.
  5. Run the transactions
  6. View the results in the Floor Manager.

You can:

  • Amend the script and re-run
  • Add further transactions with additional floors and re-run
  • Insert floors by adding them in sequence to an existing transaction and re-run

You cannot (in SS6):

  • Insert floors by adding them to a later transaction, this results in invalid floor to floor heights. This will be addressed in a future release.

The reason for adding the 'Building_A_RelElev coordinate system node is to add a control for the Floor Manager Relative Elevation value. The default Z value for a new node is 0.0 so it does not initially change the Relative Elevation value. Once this Z value is modified the Relative Elevation value will be updated:

The workflow for utilising Relative Elevation in the Floor Manager and drawing output will be covered in another article shortly.

Watch Out For:

Be aware that undoing the GC transactions will remove the floors created so take care with the timing of any changes/updates.

Any changes made within the Floor Manager interface would be overwritten by later GC updates as a GC script will run every time the file containing it is opened.(If the transactions are undone, removing all floors, and the file is then saved in that state, every time it runs it will remove any floors related to the Building in the script.)

Regularly backup the BB_Floormaster.dgnlib and the text of scripts used. Export to GCT is available for the latter.

The example script is here:

transaction modelChange 'Add GC Building and Coordinate System'
{
    node User.Objects.Basetransaction modelChange 'Create Building A'
{
    node User.Objects.Building_A_CS Bentley.GC.NodeTypes.CoordinateSystem
    {
        Technique                 = 'AtModelOrigin';
        DGNModelName              = 'Design Model';
        GraphLocation             = {43.0, 19.0};
    }
    node User.Objects.Building_A_RelElev Bentley.GC.NodeTypes.CoordinateSystem
    {
        Technique                 = 'ByCartesianCoordinates';
        XTranslation              = 0.0;
        YTranslation              = 0.0;
        ZTranslation              = <free> 120000.0;
        GraphLocation             = {43.0, 165.333};
    }
    node User.Objects.Building_A Bentley.GC.NodeTypes.Building
    {
        Technique                 = 'CreateNewBuilding';
        BaseElevation             = Building_A_RelElev.Z;
        GraphLocation             = {230.0, 19.0};
        CatalogItem               = {'Building','Default'};
        ArchBuilding_BuildingName = 'Building_A';
    }
}

transaction modelChange 'Add Floors B1 to 02'
{
    node User.Objects.A_Floor_B1 Bentley.GC.NodeTypes.Floor
    {
        Technique                 = 'CreateAtBuilding';
        CatalogItem               = {'Floor','Default'};
        OwningBuilding            = Building_A;
        ArchFloor_FloorName       = 'A_Floor_B1';
        ArchFloor_FinishedFloorElevation = -4000;
        ArchFloor_Description     = 'Basement 1';
        GraphLocation             = {424.0, 19.0};
    }
    node User.Objects.A_Floor_00 Bentley.GC.NodeTypes.Floor
    {
        Technique                 = 'CreateAtBuilding';
        CatalogItem               = {'Floor','Default'};
        OwningBuilding            = Building_A;
        ArchFloor_FloorName       = 'A_Floor_00';
        ArchFloor_Description     = 'Ground Floor';
        GraphLocation             = {424.0, 165.333};
    }
    node User.Objects.A_Floor_01 Bentley.GC.NodeTypes.Floor
    {
        Technique                 = 'CreateAtBuilding';
        CatalogItem               = {'Floor','Default'};
        OwningBuilding            = Building_A;
        ArchFloor_FloorName       = 'A_Floor_02';
        ArchFloor_FinishedFloorElevation = 4000;
        ArchFloor_Description     = 'First Floor';
        GraphLocation             = {424.0, 311.667};
    }
    node User.Objects.A_Floor_02 Bentley.GC.NodeTypes.Floor
    {
        Technique                 = 'CreateAtBuilding';
        CatalogItem               = {'Floor','Default'};
        OwningBuilding            = Building_A;
        ArchFloor_FloorName       = 'A_Floor_03';
        ArchFloor_FinishedFloorElevation = 8000;
        ArchFloor_Description     = 'Second Floor';
        GraphLocation             = {424.0, 458.0};
    }
}

transaction modelChange 'Add Floors 03 to 02'
{
    node User.Objects.A_Floor_03 Bentley.GC.NodeTypes.Floor
    {
        Technique                 = 'CreateAtBuilding';
        CatalogItem               = {'Floor','Default'};
        OwningBuilding            = Building_A;
        ArchFloor_FloorName       = 'A_Floor_04';
        ArchFloor_FinishedFloorElevation = 12000;
        ArchFloor_Description     = 'Second Floor';
        GraphLocation             = {424.0, 480.0};
    }
    node User.Objects.A_Floor_04 Bentley.GC.NodeTypes.Floor
    {
        Technique                 = 'CreateAtBuilding';
        CatalogItem               = {'Floor','Default'};
        OwningBuilding            = Building_A;
        ArchFloor_FloorName       = 'A_Floor_05';
        ArchFloor_FinishedFloorElevation = 16000;
        ArchFloor_Description     = 'Second Floor';
        GraphLocation             = {424.0, 520.0};
    }
    node User.Objects.A_Floor_05 Bentley.GC.NodeTypes.Floor
    {
        Technique                 = 'CreateAtBuilding';
        CatalogItem               = {'Floor','Default'};
        OwningBuilding            = Building_A;
        ArchFloor_FloorName       = 'A_Floor_06';
        ArchFloor_FinishedFloorElevation = 20000;
        ArchFloor_Description     = 'Second Floor';
        GraphLocation             = {424.0, 550.0};
    }
    node User.Objects.A_Floor_06 Bentley.GC.NodeTypes.Floor
    {
        Technique                 = 'CreateAtBuilding';
        CatalogItem               = {'Floor','Default'};
        OwningBuilding            = Building_A;
        ArchFloor_FloorName       = 'A_Floor_07';
        ArchFloor_FinishedFloorElevation = 24000;
        ArchFloor_Description     = 'Second Floor';
        GraphLocation             = {424.0, 580.0};
    }
    node User.Objects.A_Floor_07 Bentley.GC.NodeTypes.Floor
    {
        Technique                 = 'CreateAtBuilding';
        CatalogItem               = {'Floor','Default'};
        OwningBuilding            = Building_A;
        ArchFloor_FloorName       = 'A_Floor_08';
        ArchFloor_FinishedFloorElevation = 28000;
        ArchFloor_Description     = 'Second Floor';
        GraphLocation             = {424.0, 610.0};
    }
    node User.Objects.A_Floor_08 Bentley.GC.NodeTypes.Floor
    {
        Technique                 = 'CreateAtBuilding';
        CatalogItem               = {'Floor','Default'};
        OwningBuilding            = Building_A;
        ArchFloor_FloorName       = 'A_Floor_09';
        ArchFloor_FinishedFloorElevation = 32000;
        ArchFloor_Description     = 'Second Floor';
        GraphLocation             = {424.0, 640.0};
    }
}

_CS Bentley.GC.NodeTypes.CoordinateSystem
    {
        Technique                 = 'AtModelOrigin';
        DGNModelName              = 'Design Model';
        GraphLocation             = {-56.0, 231.0};
    }
    node User.Objects.GC_building_01_CS Bentley.GC.NodeTypes.CoordinateSystem
    {
        Technique                 = 'ByCartesianCoordinates';
        CoordinateSystem          = Base_CS;
        XTranslation              = 0.0;
        YTranslation              = 0.0;
        ZTranslation              = <free> 20000.0;
    }
    node User.Objects.GC_building_01 Bentley.GC.NodeTypes.Building
    {
        Technique                 = 'CreateNewBuilding';
        CatalogItem               = {'Building','Default'};
        BaseElevation             = GC_building_01_CS.Z;
        ArchBuilding_BuildingName = 'GC_building_01';
        ArchBuilding_YearConstructed = '2015';
        ObjectClassification_Uniclass = 'D33';
        ObjectClassification_Uniclass2015 = '00 00 00';
        ObjectClassification_NBS  = '10';
        GraphLocation             = {227.0, 33.0};
    }
}

transaction modelChange 'Add Basements and Ground Floors'
{
    node User.Objects.B_02 Bentley.GC.NodeTypes.Floor
    {
        Technique                 = 'CreateAtBuilding';
        CatalogItem               = {'Floor','Default'};
        OwningBuilding            = GC_building_01;
        ArchFloor_FloorName       = 'Basement_01';
        ArchFloor_FinishedFloorElevation = -8000;
        ArchFloor_ApproxLength    = 8000;
        ArchFloor_ApproxWidth     = 5000;
        GraphLocation             = {509.0, 51.0};
    }
    node User.Objects.B_01 Bentley.GC.NodeTypes.Floor
    {
        Technique                 = 'CreateAtBuilding';
        CatalogItem               = {'Floor','Default'};
        OwningBuilding            = GC_building_01;
        ArchFloor_FloorName       = 'Basement_00';
        ArchFloor_FinishedFloorElevation = -4000;
        ArchFloor_ApproxLength    = 8000;
        ArchFloor_ApproxWidth     = 5000;
        GraphLocation             = {508.0, 209.0};
    }
    node User.Objects.Floor_00 Bentley.GC.NodeTypes.Floor
    {
        Technique                 = 'CreateAtBuilding';
        CatalogItem               = {'Floor','Default'};
        OwningBuilding            = GC_building_01;
        ArchFloor_FloorName       = 'Floor_00';
        ArchFloor_FinishedFloorElevation = 0;
        ArchFloor_ApproxLength    = 8000;
        ArchFloor_ApproxWidth     = 5000;
        GraphLocation             = {505.0, 372.0};
    }
}

transaction modelChange 'Add Upper Floors'
{
    node User.Objects.Floor_01 Bentley.GC.NodeTypes.Floor
    {
        Technique                 = 'CreateAtBuilding';
        CatalogItem               = {'Floor','Default'};
        OwningBuilding            = GC_building_01;
        ArchFloor_FloorName       = 'Floor_01';
        ArchFloor_FinishedFloorElevation = 6000;
        ArchFloor_ApproxLength    = 8000;
        ArchFloor_ApproxWidth     = 5000;
        GraphLocation             = {505.0, 372.0};
    }
    node User.Objects.Floor_02 Bentley.GC.NodeTypes.Floor
    {
        Technique                 = 'CreateAtBuilding';
        CatalogItem               = {'Floor','Default'};
        OwningBuilding            = GC_building_01;
        ArchFloor_FloorName       = 'Floor_02';
        ArchFloor_FinishedFloorElevation = 10000;
        ArchFloor_ApproxLength    = 8000;
        ArchFloor_ApproxWidth     = 5000;
        GraphLocation             = {505.0, 372.0};
    }
    node User.Objects.Floor_03 Bentley.GC.NodeTypes.Floor
    {
        Technique                 = 'CreateAtBuilding';
        CatalogItem               = {'Floor','Default'};
        OwningBuilding            = GC_building_01;
        ArchFloor_FloorName       = 'Floor_03';
        ArchFloor_FinishedFloorElevation = 14000;
        ArchFloor_ApproxLength    = 8000;
        ArchFloor_ApproxWidth     = 5000;
        GraphLocation             = {505.0, 372.0};
    }
    node User.Objects.Floor_04 Bentley.GC.NodeTypes.Floor
    {
        Technique                 = 'CreateAtBuilding';
        CatalogItem               = {'Floor','Default'};
        OwningBuilding            = GC_building_01;
        ArchFloor_FloorName       = 'Floor_04';
        ArchFloor_FinishedFloorElevation = 18000;
        ArchFloor_ApproxLength    = 8000;
        ArchFloor_ApproxWidth     = 5000;
        GraphLocation             = {505.0, 372.0};
    }
    node User.Objects.Floor_05 Bentley.GC.NodeTypes.Floor
    {
        Technique                 = 'CreateAtBuilding';
        CatalogItem               = {'Floor','Default'};
        OwningBuilding            = GC_building_01;
        ArchFloor_FloorName       = 'Floor_05';
        ArchFloor_FinishedFloorElevation = 22000;
        ArchFloor_ApproxLength    = 8000;
        ArchFloor_ApproxWidth     = 5000;
        GraphLocation             = {505.0, 372.0};
    }
    node User.Objects.Floor_06 Bentley.GC.NodeTypes.Floor
    {
        Technique                 = 'CreateAtBuilding';
        CatalogItem               = {'Floor','Default'};
        OwningBuilding            = GC_building_01;
        ArchFloor_FloorName       = 'Floor_06';
        ArchFloor_FinishedFloorElevation = 26000;
        ArchFloor_ApproxLength    = 8000;
        ArchFloor_ApproxWidth     = 5000;
        GraphLocation             = {505.0, 372.0};
    }
    node User.Objects.Floor_07 Bentley.GC.NodeTypes.Floor
    {
        Technique                 = 'CreateAtBuilding';
        CatalogItem               = {'Floor','Default'};
        OwningBuilding            = GC_building_01;
        ArchFloor_FloorName       = 'Floor_07';
        ArchFloor_FinishedFloorElevation = 29500;
        ArchFloor_ApproxLength    = 8000;
        ArchFloor_ApproxWidth     = 5000;
        GraphLocation             = {505.0, 372.0};
    }
    node User.Objects.Floor_08 Bentley.GC.NodeTypes.Floor
    {
        Technique                 = 'CreateAtBuilding';
        CatalogItem               = {'Floor','Default'};
        OwningBuilding            = GC_building_01;
        ArchFloor_FloorName       = 'Floor_08';
        ArchFloor_FinishedFloorElevation = 33000;
        ArchFloor_ApproxLength    = 8000;
        ArchFloor_ApproxWidth     = 5000;
        GraphLocation             = {505.0, 372.0};
    }
    node User.Objects.Floor_08a Bentley.GC.NodeTypes.Floor
    {
        Technique                 = 'CreateAtBuilding';
        CatalogItem               = {'Floor','Default'};
        OwningBuilding            = GC_building_01;
        ArchFloor_FloorName       = 'Floor_08a';
        ArchFloor_FinishedFloorElevation = 35000;
        ArchFloor_ApproxLength    = 8000;
        ArchFloor_ApproxWidth     = 5000;
        GraphLocation             = {505.0, 372.0};
    }
    node User.Objects.Floor_09 Bentley.GC.NodeTypes.Floor
    {
        Technique                 = 'CreateAtBuilding';
        CatalogItem               = {'Floor','Default'};
        OwningBuilding            = GC_building_01;
        ArchFloor_FloorName       = 'Floor_09';
        ArchFloor_FinishedFloorElevation = 39000;
        ArchFloor_ApproxLength    = 8000;
        ArchFloor_ApproxWidth     = 5000;
        GraphLocation             = {505.0, 372.0};
    }
}

transaction modelChange 'Add Floor 10 and 11'
{
    node User.Objects.Floor_10 Bentley.GC.NodeTypes.Floor
    {
        Technique                 = 'CreateAtBuilding';
        CatalogItem               = {'Floor','Default'};
        OwningBuilding            = GC_building_01;
        ArchFloor_FloorName       = 'Floor_10';
        ArchFloor_FinishedFloorElevation = 42000;
        ArchFloor_ApproxLength    = 8000;
        ArchFloor_ApproxWidth     = 5000;
        GraphLocation             = {505.0, 372.0};
    }
    node User.Objects.Floor_11 Bentley.GC.NodeTypes.Floor
    {
        Technique                 = 'CreateAtBuilding';
        CatalogItem               = {'Floor','Default'};
        OwningBuilding            = GC_building_01;
        ArchFloor_FloorName       = 'Floor_11';
        ArchFloor_FinishedFloorElevation = 45000;
        ArchFloor_ApproxLength    = 8000;
        ArchFloor_ApproxWidth     = 5000;
        GraphLocation             = {505.0, 372.0};
    }
}

Just open in notepad and paste into the Transaction Script Editor.