Messaggio di errore

  • Notice: unserialize(): Error at offset 2 of 521 bytes in variable_initialize() (line 1202 of /var/www/design.rootiers.it/2009/includes/bootstrap.inc).
  • Notice: unserialize(): Error at offset 2 of 549 bytes in variable_initialize() (line 1202 of /var/www/design.rootiers.it/2009/includes/bootstrap.inc).
  • Notice: unserialize(): Error at offset 2 of 576 bytes in variable_initialize() (line 1202 of /var/www/design.rootiers.it/2009/includes/bootstrap.inc).

Nodo British Museum - Scripting in Generative Components

Sto proseguendo il lavoro sulla copertura del British Museum, dopo aver creato il nodo in GC mi sono bloccato in quanto non sono riuscito a popolare correttamente una superficie con il nodo creato. 

Per esempio, volendo inserire una serie di nodi su una griglia di punti che si trovano su un piano, devo far in modo che le direzioni delle aste coincidano con i lati dei poligoni triangolari.

 

 

la direzione dell'asta è indicata dalla freccia verde

il punto di applicazione del nodo è indicato dalla freccia rossa

 

 

provando a "popolare" questa superficie dei miei nodi, questi non assumono la configurazione corretta

 

 

 Grazie ai consigli Vladimir Masinsky (thank you Vladimir!!!) ho scoperto che una strada percorribile per risolvere il problema è quello di creare una GraphFunction in GC che dia la possibilità di risolvere il problema.

Il nodo in questione è al centro di una serie di 9 punti, però deve interagire solo con 6 di questi.

Posto uno schizzo fatto da Vladimir che mi ha aiutato a capire in teroria come deve lavorare il nodo.

 

 

Il problema maggiore per creare una GraphFunction è proprio che bisogna scriverla in GCScript...

 

Gentilmente Vladimir mi ha dato un esempio di file con una superficie tassellata di poligoni esagonali che sono stati creati proprio grazie ad una GraphFunction

 

 

sto cercando di capire come funziona lo GCScript, sperando così di riuscire a crearne uno  per il nodo. 

AllegatoDimensione
Binary Data 9luglio.gct9.09 KB

commenti

Ho studiato lo script del file che mi ha gentilmente inviato Vladimir, sono riuscito a capire un pò di cose mentre altre rimangono ancora dei dubbi. Riporto qui un pezzo dello script inerente proprio alla GraphFunction che deve creare una maglia di poligoni esagonali.

------------------------------------------------------------------------------------------------------------------------

  feature graphFunction02 Bentley.GC.GraphFunction
    {
        Definition                = function (Point ptGd, int floors, int bays)
                                    {  
                                        Polygon pol = {};
                                        int hexi = 0;
                                        int hexj = 0;
                                        int col = 0;
                                        Point verts = {};
                                        int shift = 0;
                                       
                                        int patternOffseti = {1, 0, 1, 2, 3, 2};
                                                          
                                        int patternOffsetj = {0, 1, 2, 2, 1, 0};
                                           
                                        for (int i = 0; i < floors-3; i=i+2)   
                                        {       
                                           
                                            if (col%2!=0)
                                            {
                                                shift = 1;
                                            }
                                            else
                                            {
                                                shift = 0;
                                            }
                                           
                                            pol[hexi] = {};
                                            for (int j = 0; j < bays-2; j=j+2)
                                            { 
                                                for (int k = 0; k < 6; k++)
                                                {                                  
                                                    verts[k] = ptGd[ i + patternOffseti[k]][ j + patternOffsetj[k] + shift ];
                                                }
                                                pol[hexi][hexj] = new Polygon();
                                                pol[hexi][hexj].ByVertices(verts);
                                                hexj++;
                                               
                                            }
                                            hexi++;
                                            col++;
                                        }   
                                        return pol;
                                        };
        SymbolXY                  = {101, 101};
    }
}

-------------------------------------------------------------------------------------------------------------------

ho capito che gli argomenti della funzione sono una GridPoint, poi due numeri interi (int): Floors e Bays.

questi ultimi due non ho ben capito se sono valori o parole chiave che GC conosce a priori in quanto guardando l'intero script non compaiono mai.

Scorrendo più in basso si può vedere che la funzione serve per creare dei poligoni esagonali attraverso dei vertici--->PointVerts

le due righe PatternOffseti e Patternoffsetj descrivono le coordinate (i,j) dei vertici degli esagoni

a questo punto sono capace di costruire poligoni attraverso tutti i vertici che voglio...

posterò immagini il prima possibile anche per far capire il significato del PatternOffset.

Ecco un'immagine esplicativa della GraphFunction di Vladimir Masinsky, dove si può notare una griglia di punti con le coordinate (i,j) corrispondenti ai PatternOffset dello script.

 

A questo punto ho pensato che per semplificare le cose, invece di popolare una superficie di nodi creati da me, posso prima di tutto suddividere la superficie di poligoni come se fossero i nodi stessi. Dovrei quindi semplicemente lavorare una GraphFunction simile a quella postata con un pò di varianti.

 

 

infine dovrei unire i punti centrali di applicazione dei nodi con i vertici dei poligoni e tramite un'altra funzione far calcolare a GC gli angoli tra questi.

Raggiungerei così lo scopo di conoscere gli angoli tra le braccia dei nodi in un modo più semplice, senza dover popolare la superficie di un nodo complicando ed appensantendo  lo script.

 

 

 

 

 

 

 

 

 

Come avevo detto, ho pensato che sarebbe stato più semplice popolare una superficie con dei poligoni esagonali invece di usare il nodo modellato in precedenza.

Ho iniziato quindi inserendo 3 punti dai quali verrano create delle linee e di sonseguenza una superficie:

 

1. Inserimento di 3 punti

 

2. Creazione di linee tramite i punti inseriti

 

3. Creazione di una superficie tramite un comando sweep tra le linee

 

Procedendo con il posizionamento di una griglia di punti sulla superficie creata, ho poi inserito una GraphFunction che dia la possibilità di creare dei poligoni esagonali aventi come punti centrali tutti i punti della griglia

 

 4. Inserimento griglia di punti sulla superficie

 

---------------------------------------------------------------------------------------------------

transaction modelBased "Functions"
{
    feature graphFunction02 Bentley.GC.GraphFunction
    {
        Definition                = function (Point ptGd, int floors, int bays)
                                    {  
                                        Polygon pol = {};
                                        int hexi = 0;
                                        int hexj = 0;
                                        int col = 0;
                                        Point verts = {};
                                        int shift = 0;
                                       
                                        int patternOffseti = {0, 1, 2, 2, 1, 0};
                                                          
                                        int patternOffsetj = {0, 0, 1, 2, 2, 1};
                                           
                                        for (int i = 0; i < floors-3; i=i+1)   
                                        {       
                                           
                                            if (col%2!=0)
                                            {
                                                shift = 1;
                                            }
                                            else
                                            {
                                                shift = 0;
                                            }
                                           
                                            pol[hexi] = {};
                                            for (int j = 0; j < bays-2; j=j+1)
                                            { 
                                                for (int k = 0; k < 6; k++)
                                                {                                  
                                                    verts[k] = ptGd[ i + patternOffseti[k]][ j + patternOffsetj[k] + shift ];
                                                }
                                                pol[hexi][hexj] = new Polygon();
                                                pol[hexi][hexj].ByVertices(verts);
                                                hexj++;
                                               
                                            }
                                            hexi++;
                                            col++;
                                        }   
                                        return pol;
                                        };
        SymbolXY                  = {101, 101};
    }
}
 

--------------------------------------------------------------------------------------------------

 5. Funzione per creare poligoni esagonali sulla griglia di punti

 

6. Poligoni esagonali creati tramite la GraphFunction

 

A questo punto per conoscere gli angoli tra le aste della supeficie devo prima disegnarle tra i punti centrali di ogni poligono ed i vertici dei poligoni stessi.

 

7. Creazione dei punti  centroidi di tutti i poligoni coincidenti con i punti della griglia (ai bordi i punti sono sfalsati poichè i poligoni sono troncati)

 

 

8. Creazione delle linee (aste) tra i centroidi ed i vertici dei poligoni

 

Infine ho trovato sulla Community della Bentley in questo post:

http://communities.bentley.com/forums/thread/13903.aspx

una funzione che serve per calcolare un angolo dati 3 punti, dove il secondo è il punto d'origine dell'angolo.

A questa funzione io ho aggiunto una GraphVariable che sia capace di leggere l'angolo in questione  ed una Feature che scriva la variabile sul punto centrale.

 

----------------------------------------------------------------------------------------------------

transaction modelBased "Add vectorAngle360Function"
{
    feature vectorAngle360Function Bentley.GC.GraphFunction
    {
        Definition                = double function (CoordinateSystem cs, Point thisFirstPoint, Point thisAngleOrigin, Point thisThirdPoint)
                                    {
                                        // function to calculate zero to 360 angle between three points
                                        // angle is measured first to third point in mathematical positive orientation
                                        // when first, origin, third are x, origin, and "y" point

                                   
                                    //    breakpoint;
                                       
                                        CoordinateSystem thePointsCoordSystem = new CoordinateSystem();
                                        double retAngle = 180.0;
                                        Point tfFirstPnt = new Point();
                                        Point tfThirdPnt = new Point();
                                        Point fakeZPnt = new Point();
                                        Point tfFakeZPnt = new Point();
                                       
                                        // thePointsCoordSystem.ByOriginXYPoints(thisAngleOrigin, thisFirstPoint, thisThirdPoint);
                                        thePointsCoordSystem.ByOriginXPoint(thisAngleOrigin, thisThirdPoint);
                                        fakeZPnt.ByCartesianCoordinates(thePointsCoordSystem, 0.0, 0.0, 5000.0);
                                       
                                        // transfer the points to local coordinates to calculate angles in local xy
                                       
                                        tfFirstPnt.CopyTransformGeometricContents(thisFirstPoint, thePointsCoordSystem, cs);
                                        tfThirdPnt.CopyTransformGeometricContents(thisThirdPoint, thePointsCoordSystem, cs);
                                        tfFakeZPnt.CopyTransformGeometricContents(fakeZPnt, thePointsCoordSystem, cs);
                                       
                                        retAngle = Objects.Angle(cs, tfFirstPnt, tfThirdPnt);
                                       
                                        if(tfFirstPnt.Y < 0.0)  retAngle = 360.0 - retAngle;
                                       
                                        return(retAngle);
                                    };
        SymbolXY                  = {104, 92};
    }
}

transaction modelBased "Add angle"
{
    feature angle Bentley.GC.GraphVariable
    {
        Value                     = vectorAngle360Function (baseCS,line03[0].EndPoint,point05[0][0][1],line03[1].EndPoint);
    }
}

---------------------------------------------------------------------------------------------------------

9. Funzione che calcola l'angolo dati 3 punti

 

----------------------------------------------------------------------------------------------------------

transaction modelBased "Add angle"
{
    feature angle Bentley.GC.GraphVariable
    {
        Value                     = vectorAngle360Function (baseCS,line03[0].EndPoint,point05[0][0][1],line03[1].EndPoint);
    }
}

transaction modelBased "Add RealAngle"
{
    feature RealAngle Bentley.GC.GraphVariable
    {
        Value                     = 360-angle;
    }
}

transaction modelBased "Add text to evaluate the angle"
{
    feature text02 Bentley.GC.Text
    {
        Placement                 = point05[0][0][1];
        TextString                = ToString(RealAngle);
    }
}

-------------------------------------------------------------------------------------------------------------

10. Funzioni che leggono e scrivono i valori degli angoli

 

 

11. Valore dell'angolo tra l'asta selezionata e l'asta orizzontale 

caro Matteo,

stai andando avanti davvero bene.
Il consiglio ora è di mandare un post magari piu sintetico con i tuoi progressi anche sul forum di SmartGeometry, per aggiornare il post che hai lì.

Un dettaglio: ma riesci a controllare l'approssimazione degli angoli?

la strada è giusta, keep it simple,
e aggiorna anche Vladimir sui progressi.

a presto,

Stefano
 

Well done, this script enables you to create all sorts of patterns via point grid on surface. Don't forget to set up the script so that it produces only a half of the shape, otherwise all lines are created twice, which you might not need. Bedtime reading on Chris Williams's work: http://people.bath.ac.uk/abscjkw/more on BM roof: http://staff.bath.ac.uk/abscjkw/BritishMuseum/ A presto VM   

Thank you for your suggestions!

In this case I need of complete polygons so I can find the centroids, which are the points of application of the nodes.

PS. I'll write on Bentley's Community soon.

PPS. I'll try to write in english too for to have posts more readable..