La portada del PFG

Esta es la imagen de fondo de la portada de mi proyecto fin de grado:
Model

Variables

  • altura: altura del modelo en el eje Y.
    • Inicio: 0 mm
    • Final: 100 mm
    • Paso: 0 mm
  • giro: giro de los cuadrados
    • Inicio: 0 mm
    • Final: 100 mm
    • Paso: 0 mm
  • apertura: tamaño de los cuadrados
    • Inicio: 0 mm
    • Final: 100 mm
    • Paso: 0 mm

Y esta es la animación de cómo se mueven los cuadrados cambiando los parámetros que dejé libres:

Desarrollo del modelo generativo

En primer lugar se hace una matriz de puntos de 20×10 puntos a partir de una serie de puntos en diagonal al que se le aplica una replicación.

transaction modelChange 'Add point01'
{
    node User.Objects.point01 Bentley.GC.Features.Point
    {
        Technique                 = 'ByCartesianCoordinates';
        CoordinateSystem          = baseCS;
        XTranslation              = Series(0,80,4);
        YTranslation              = Series(0,40,4);
        ZTranslation              = 0;
        Origin                    = null;
        Replication               = ReplicationOption.AllCombinations;
        GraphLocation             = <auto> {300.0, 40.0};
    }
}

A partir de esta matriz de puntos se crea un conjunto de polígonos que usa los puntos como vértices.

transaction modelChange 'Add polygon01'
{
    node User.Objects.polygon01 Bentley.GC.Features.Polygon
    {
        Technique                 = 'ByPointGrid';
        Points                    = point01;
        Fill                      = false;
        SkipAlternates            = false;
        FacetOption               = FacetOption.Quads;
        PlaneIndex                = 1;
        TextStyle                 = null;
        UClosed                   = false;
        VClosed                   = false;
        GraphLocation             = <auto> {560.0, 40.0};
    }
}

Se calcula el centroide de cada polígono y usandolo como comienzo se traza una línea en la dirección del eje Z cuya longitud depende de la distancia a otro punto que se usará como atractor que se llama “point02”, es la línea “line01”.

transaction modelChange 'Add point02'
{
    node User.Objects.point02 Bentley.GC.Features.Point
    {
        Technique                 = 'CentroidOfSet';
        SetToFindCentroidFrom     = polygon01.Vertices;
        GraphLocation             = <auto> {820.0, 40.0};
    }
}

transaction modelChange 'Add point03'
{
    node User.Objects.point03 Bentley.GC.Features.Point
    {
        Technique                 = 'ByCartesianCoordinates';
        CoordinateSystem          = baseCS;
        XTranslation              = <free> 12.0569421656741;
        YTranslation              = <free> 16.1699104640786;
        ZTranslation              = <free> -9.03728241466236;
        Origin                    = null;
        GraphLocation             = <auto> {820.0, 180.59};
    }
}

transaction modelChange 'Add altura'
{
    node User.Objects.altura Bentley.GC.Features.GraphVariable
    {
        Technique                 = 'EvaluateExpression';
        Value                     = 25;
        LimitValueToRange         = true;
        RangeMinimum              = 0.0;
        RangeMaximum              = 100.0;
        RangeStepSize             = 0.0;
        GraphLocation             = <auto> {1080.0, 40.0};
    }
}

transaction modelChange 'Add line01'
{
    node User.Objects.line01 Bentley.GC.Features.Line
    {
        Technique                 = 'ByStartPointDirectionLength';
        StartPoint                = point02;
        Direction                 = baseCS.ZDirection;
        Length                    = Distance(point02,point03)/4-altura;
        GraphLocation             = <auto> {1080.0, 40.0};
    }
}

En cada centroide se coloca, además, un sistema de coordenadas que toma como base el sistema de coordenadas principal y le aplica un giro definido con la fórmula:

transaction modelChange 'Add coordinateSystem01, giro'
{
    node User.Objects.giro Bentley.GC.Features.GraphVariable
    {
        Technique                 = 'EvaluateExpression';
        Value                     = 27.0;
        LimitValueToRange         = true;
        RangeMinimum              = 0.0;
        RangeMaximum              = 100.0;
        RangeStepSize             = 0.0;
        GraphLocation             = <auto> {1340.0, 40.0};
    }
    node User.Objects.coordinateSystem01 Bentley.GC.Features.CoordinateSystem
    {
        Technique                 = 'ByOriginRotationAboutCoordinateSystem';
        Origin                    = point02;
        CoordinateSystem          = baseCS;
        RotationAngle             = line01.Length*giro;
        Axis                      = AxisOption.Z;
        GuideRadius               = 1.0;
        GraphLocation             = <auto> {1600.0, 40.0};
    }
}


line01.Length*giro

Por lo que el giro dependerá, además de la variable giro, de la longitud de la línea 01.

Se trazan cuatro puntos a partir del centroide basados en el sistema de coordenadas girado que formarán los vértices de un nuevo polígono. La distancia entre estos puntos está determinada por la variable apertura que divide a la longitud de la línea 01:

line01.Length/apertura

node User.Objects.point04 Bentley.GC.Features.Point
    {
        Technique                 = 'ByDirectionAndDistanceFromOrigin';
        Origin                    = point02;
        Direction                 = coordinateSystem01.XDirection;
        DistanceFromOrigin        = line01.Length/apertura;
        GraphLocation             = <auto> {1860.0, 40.0};
    }
    node User.Objects.apertura Bentley.GC.Features.GraphVariable
    {
        Technique                 = 'EvaluateExpression';
        Value                     = 5;
        LimitValueToRange         = true;
        RangeMinimum              = 0.0;
        RangeMaximum              = 100.0;
        RangeStepSize             = 0.0;
        GraphLocation             = <auto> {2120.0, 40.0};
    }
    node User.Objects.point05 Bentley.GC.Features.Point
    {
        Technique                 = 'ByDirectionAndDistanceFromOrigin';
        Origin                    = point02;
        Direction                 = coordinateSystem01.YDirection;
        DistanceFromOrigin        = line01.Length/apertura;
        GraphLocation             = <auto> {2380.0, 40.0};
    }
    node User.Objects.point06 Bentley.GC.Features.Point
    {
        Technique                 = 'ByDirectionAndDistanceFromOrigin';
        Origin                    = point02;
        Direction                 = coordinateSystem01.XDirection;
        DistanceFromOrigin        = -line01.Length/apertura;
        GraphLocation             = <auto> {2380.0, 40.0};
    }
    node User.Objects.point07 Bentley.GC.Features.Point
    {
        Technique                 = 'ByDirectionAndDistanceFromOrigin';
        Origin                    = point02;
        Direction                 = coordinateSystem01.YDirection;
        DistanceFromOrigin        = -line01.Length/apertura;
        GraphLocation             = <auto> {2380.0, 40.0};
    }
}

transaction modelChange 'Add polygon02'
{
    node User.Objects.polygon02 Bentley.GC.Features.Polygon
    {
        Technique                 = 'ByVertices';
        VertexPoints              = { point06, point07,point04, point05};
        Fill                      = false;
        ForcePlanar               = false;
        PlaneIndex                = 1;
        TextStyle                 = null;
        Key                       = "";
        GraphLocation             = <auto> {2640.0, 40.0};
    }
}

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *