he picture (4).
Previously, I had a problem with generating intersections between the two directions of the beams, but a colleague helped me by extending beams, so there was no problem with lines of intersection. But this solution has generated curl (5) at the highest vertex geometry, which I ignored in order to repair it before printing, perhaps this mean my problem with my beam spread properly. Only when the beams is 19, does not jump no problem, but I still can not distribute them properly.
(1)
(2)
(3)
(4)
(5)
I tried to show as simply as possible by removing or signing my code in GHX file.
Thank you in advance for your help
…
giornata inaugurale sarà dedicata alla free-lecture introduttiva finalizzata alla realizzazione di un modello d'architettura complesso attraverso l'utilizzo di comandi e tecniche avanzate di rappresentazione con Grasshopper (plug-in parametrica di Rhinoceros) e 3dsMax. Sarà illustrato inoltre il potenziale di V-ray per 3dsMax realizzando un rendering concettuale. Durante il mini-corso dell' openDAY verranno mostrate le caratteristiche e le potenzialità degli strumenti per far luce sui nuovi valori assunti dalla modellazione 3D. La modellazione 3D sta interessando un pubblico sempre più vasto inserendosi in una nuova fase di ampia disponibilità per conoscenze, software, hardware di prototipazione e modelli. Pur mantenendo tutti i suoi valori già noti la questione si è talmente ampliata fino ad interessare norme giuridiche (diritti sui modelli ,concorrenza con offerte di servizi apparentemente simili, informazioni deformate e onfusione nei media) Makers University[http://www.makersuniversity.com], in collaborazione con parametricart, vi propone un punto di vista ampio e sintetico su queste tematiche.
Al termine della free-lecture, sarà illustrata l'offerta formativa [CLICCA QUI] di parametricart riferita ai corsi che si terranno nei mesi di Gennaio e Febbraio 2013 inseriti all'interno della più ampia programmazione della Makers University. SONO PREVISTE TARIFFE PROMOZIONALI PER COLORO CHE SI ISCRIVERANNO AI CORSI durante l'OpenDAY.
La lezione e la presentazione si terranno nel nuovo spazio co-working il PEDONE.
PROGRAMMAZIONE
- I temi della Makers University [Leo Sorge];
- Modellazione della parametricTower (concept di architettura complessa) utilizzando Grasshopper, applicativo per la modellazione parametrica [VIDEO] [Michele Calvano];
- Modellazione di una copertura reticolare 3D a completamento della parametricTower con 3dsMax utilizzando tecniche di modellazione mesh complesse [Wissam Wahbeh];
- Rendering con V-ray per 3dsMax illustrando la nuova interfaccia nodale [Wissam Wahbeh].
- Question Time per chiarimenti sugli argomenti illustrati.
COME
L'openDAY sarà aperto a tutti gli interessati,completamente gratuito e sarà replicato in tre sessioni di uguali contenuti organizzate nei seguenti orari:
Sessione [1] 11,30 - 13,30
Sessione [2] 15,30 - 17,30
Sessione [3] 17,30 - 19,30
Per necessità di organizzazione è importante la prenotazione all'evento utilizzando il form in fondo alla pagina specificando nella stringa apposita, il nome dell'evento e la sessione (es. open day sessione 1) oltre agli altri dati richiesti.…
la corretta comprensione del software che di livello specialistico per un confronto diretto con alcuni aspetti fondamentali dell’ architettura e del design.
Attraverso l'utilizzo di Grasshopper rivoluzionaria plug-in di Rhinoceros, si insegneranno nuove tecniche di modellazione parametrica.
Grasshopper, permette di esprimere al massimo le qualità e le potenzialità della modellazione Nurbs abbandonando in parte l'interfaccia classica di Rhinoceros. Quest'ultimo infatti viene sostituito da un menù a tendine dove vengono collezionati nodi utili alla composizione di algoritmi risolutivi.
La plug-in Grasshopper, dimostra come il linguaggio del computer stia diventando un reale strumento progettuale.
Il corso si svolgerà nei seguenti giorni: Sabato 26 Ottobre dalle ore 10.00 alle ore 19.00 Domenica 27 Ottobre dalle ore 10.00 alle ore 19.00 Scadenza preiscrizione per Grasshopper: 23/10
Contenuti
Nella prima parte del corso attraverso degli esercizi base si insegneranno i metodi di esplicitazione degli algoritmi generativi. In queste ore di lezione si illustreranno, attraverso fasi operative, i seguenti argomenti:
Suddivisione degli algoritmi in parametri e componenti;
Tipologie di dati comptiili con Grasshopper e loro combinazione creando definizioni minime;
Funzioni matematiche e logiche;
Data flow, liste e filtri di esclusione;
Costruzione di curve e superfici e loro trasformazione;
Nella seconda parte del corso lo strumento viene specializzato affrontando editing e trasformazioni complesse sulle superfici:
Elaborazione delle superfici di suddivisione;
Tassellazione spaziale di superfici a doppia curvatura;
Gestione di parametri variabili per la progettazione di definizioni finalizzate al controllo del movimento;
Ideazione di algoritmi per il passaggio dal modello digitale al modello reale attraverso la tecnica dello sliceing;
Alla fine del corso, verrà rilasciato l’attestato di partecipazione ad un corso di Rhinoceros qualificato certificato dalla casa sviluppatrice McNeel, valido anche per la richiesta di crediti formativi universitari.
Tutor del corso
Il corso sarà tenuto da un docente qualificato, esperto in disegno e rappresentazione dell' architettura e del design:
Michele Calvano| _architetto, dottore di ricerca in rappresentazione architettonica specializzato nella modellazione matematica (Nurbs) e modellazione parametrica.
Docente ART (Autorized Rhino Trainer)
Info
Responsabile didattico e docente del corso: arch. Michele Calvano cell: 340 3476330
Info mail: parametricart@gmail.com
…
azione tramite interfaccia grafica 6 ore
Interfaccia Grasshopper
Parametri e Componenti
Operazione di Logica e Matematica
Vettori
Case study: concetto base di attrattore
Gestione data matching
Primi approcci alla modellazione parametrica – 4 ore
Trasformazioni di base (sposta ruota scala orienta)
Strumenti di Morphing
Utilizzo di Sweep e Loft e di altri strumenti di creazione superfici già noti da Rhinoceros
Esercitazione pratica: creazione del modello concettuale della Serpentine Gallery - B.I.G.
Focus sulla gestione dei dati - 4 ore
Creazione e gestione delle liste
Studio del data tree
Esercitazione pratica: creazione di un soffitto cassettonato
Creazione di geometrie tramite mesh – 6 ore
Utilizzo degli algoritmi di Delaunay
Utilizzo del Facet Dome
Utilizzo del Substrate
Utilizzo degli algoritmi di Voronoi
Esercitazione pratica: creazione di un gazebo attraverso l’uso di pattern
Creazione di ‘paneling’ di superfici curve – 6 ore
Discretizzazione di una superficie a doppia curvatura tramite pannelli piani
Strumenti analisi superfici
Visualizzazione superfici tramite falsi colori
Esercitazione pratica: creazione di una facciata interattiva
Digital Fabrication e messa in tavola – 6 ore
Interoperabilità tra Grasshopper e altri applicativi
Creazione di Truss parametrica
Gestione dell’abaco dei pezzi
Esercitazione pratica: la Facciata dello Stadio Friuli di Udine - Ipotesi di costruzione e gestione tramita fabbricazione digitale
Requisiti di accesso
Conoscenza delle tematiche CAD di base e dei comandi principali e interfaccia Rhinoceros 5.
Certificazioni
Alla fine del corso verranno rilasciate le certificazioni ufficiali da ART (Authorized Rhinoceros Trainer)
Numero partecipanti
Il corso parte al raggiungimento di un minimo di 4 persone ad un massimo di 8. Ogni partecipante dovrà essere munito di proprio computer con Rhinoceros.
Costo del corso
Il costo del corso è di 600 € + IVA
Sconto di 50,00 € per i giovani che hanno meno di 26 anni.
Ulteriore sconto di 50,00 € Early Bird per tutti coloro che si iscriveranno entro il 5 Settembre 2016
Nel prezzo è compresa l’iscrizione al FabLab Toscana – maggiori informazioni qui
FabLab Toscana
Il FabLab Toscana presenta un insieme di per i propri associati: sarà possibile l’accesso ai laboratori del FabLab (durante i normali orari di apertura), partecipare ai workshops gratuitamente o a prezzi calmierati, l’utilizzo della macchine (seguendo il regolamento interno), …
.
Things have been working swimmingly in many areas of the plugin, but one particular problem has been tough to solve. I have two components that are trying to read/write to the same memory at the same time, causing Rhino exceptions and crashes.
The conflicts appear to be happening between two components -- one is a "Layer Events Listener" that reports essentially what type of layer event just happened. The other is a "Set Layer Visibility" component that toggles the visibility of a list of layers.
The code:
public class LayerTools_LayerEventsListener : GH_Component { /// <summary> /// Initializes a new instance of the LayerTools_LayerListener class. /// </summary> public LayerTools_LayerEventsListener() : base("Layer Events Listener", "Layer Listener", "Get granular information about the layer events happening in the Rhino document.", "Squirrel", "Layer Tools") { }
/// <summary> /// Registers all the input parameters for this component. /// </summary> protected override void RegisterInputParams(GH_Component.GH_InputParamManager pManager) { pManager.AddBooleanParameter("Active", "A", "Set to true to listen to layer events in the Rhino document.", GH_ParamAccess.item, false); pManager.AddTextParameter("Exclusions", "E", "Provide a list of exclusions to stop reading specific events (Added, Deleted, Moved, Renamed, Locked, Visibility, Color, Active).", GH_ParamAccess.list); pManager[1].Optional = true; }
/// <summary> /// Registers all the output parameters for this component. /// </summary> protected override void RegisterOutputParams(GH_Component.GH_OutputParamManager pManager) { pManager.AddBooleanParameter("Initialized", "I", "Whether the listener changed from passive to active.", GH_ParamAccess.item); pManager.AddTextParameter("Document Name", "doc", "Name of the Rhino document that is changing.", GH_ParamAccess.item); pManager.AddTextParameter("Layer Path", "path", "Path of the modifed layer.", GH_ParamAccess.item); pManager.AddIntegerParameter("Layer Index", "ID", "Index of the modified layer.", GH_ParamAccess.item); pManager.AddIntegerParameter("Sort Index", "SID", "Sort index of the modified layer.", GH_ParamAccess.item); pManager.AddTextParameter("Event Type", "T", "Type of the modification.", GH_ParamAccess.item); pManager.AddBooleanParameter("Added", "A", "If the layer has been added.", GH_ParamAccess.item); pManager.AddBooleanParameter("Deleted", "D", "If the layer has been deleted.", GH_ParamAccess.item); pManager.AddBooleanParameter("Moved", "M", "If the layer has been moved.", GH_ParamAccess.item); pManager.AddBooleanParameter("Renamed", "R", "If the layer has been renamed.", GH_ParamAccess.item); pManager.AddBooleanParameter("Locked", "L", "If the layer locked setting has changed.", GH_ParamAccess.item); pManager.AddBooleanParameter("Visibility", "V", "If the layer's visibility has changed.", GH_ParamAccess.item); pManager.AddBooleanParameter("Color", "C", "If the layer's color has changed.", GH_ParamAccess.item); pManager.AddBooleanParameter("Active", "Act", "If the active layer has changed.", GH_ParamAccess.item); }
/// <summary> /// This is the method that actually does the work. /// </summary> /// <param name="DA">The DA object is used to retrieve from inputs and store in outputs.</param> protected override void SolveInstance(IGH_DataAccess DA) { bool active = false; List<string> exclusions = new List<string>();
DA.GetData(0, ref active); DA.GetDataList(1, exclusions);
RhinoDoc thisDoc = null;
bool initialize = false;
string dName = null; string activePath = null; int layerIndex = -1; int sortIndex = -1; string eventType = null; bool added = false; bool deleted = false; bool moved = false; bool renamed = false; bool locked = false; bool visibility = false; bool color = false; bool current = false;
if (active) { thisDoc = RhinoDoc.ActiveDoc;
initialize = (!previouslyActive) ? true : false;
RhinoDoc.LayerTableEvent -= RhinoDoc_LayerTableEvent; RhinoDoc.LayerTableEvent += RhinoDoc_LayerTableEvent; previouslyActive = true;
} else {
RhinoDoc.LayerTableEvent -= RhinoDoc_LayerTableEvent; previouslyActive = false; }
if (ev != null) { dName = ev.Document.Name; layerIndex = ev.LayerIndex; eventType = ev.EventType.ToString();
if (!exclusions.Contains("Active")) { if (ev.EventType.ToString() == "Current") { // active layer has just been changed current = true; }
}
if (!exclusions.Contains("Moved")) { if (ev.EventType.ToString() == "Sorted") { // active layer has just been changed moved = true; }
}
if (!exclusions.Contains("Added")) { if (ev.EventType.ToString() == "Added") { // layer has just been added activePath = ev.NewState.FullPath; added = true; }
}
if (!exclusions.Contains("Active")) { if (ev.EventType.ToString() == "Deleted") { // layer has just been added
deleted = true; } }
if (ev.EventType.ToString() == "Modified") { // layer has been modified activePath = ev.NewState.FullPath;
//skip sortindex eventType = ev.EventType.ToString();
if (ev.OldState != null && ev.NewState != null) { if (!exclusions.Contains("Locked")) { if (ev.OldState.IsLocked != ev.NewState.IsLocked) locked = true;
} if (!exclusions.Contains("Visibility")) { if (ev.OldState.IsVisible != ev.NewState.IsVisible) visibility = true; }
if (!exclusions.Contains("Moved")) { if (ev.OldState.ParentLayerId != ev.NewState.ParentLayerId) moved = true; }
//if (ev.OldState.SortIndex != ev.NewState.SortIndex) moved = true; if (!exclusions.Contains("Renamed")) { if (ev.OldState.Name != ev.NewState.Name) renamed = true; }
if (!exclusions.Contains("Color")) { if (ev.OldState.Color != ev.NewState.Color) color = true; } }
} }
DA.SetData(0, initialize); DA.SetData(1, dName); DA.SetData(2, activePath); DA.SetData(3, layerIndex); DA.SetData(4, sortIndex); DA.SetData(5, eventType); DA.SetData(6, added); DA.SetData(7, deleted); DA.SetData(8, moved); DA.SetData(9, renamed); DA.SetData(10, locked); DA.SetData(11, visibility); DA.SetData(12, color); DA.SetData(13, current);
}
static bool previouslyActive = false; Rhino.DocObjects.Tables.LayerTableEventArgs ev = null;
void RhinoDoc_LayerTableEvent(object sender, Rhino.DocObjects.Tables.LayerTableEventArgs e) { ev = e;this.ExpireSolution(true); }
And for the layer visibility component:
public LayerTools_SetActiveLayer() : base("Set Active Layer", "SetActiveLayer", "Set the active layer in the Rhino document.", "Squirrel", "Layer Tools") { }
/// <summary> /// Registers all the input parameters for this component. /// </summary> protected override void RegisterInputParams(GH_Component.GH_InputParamManager pManager) { pManager.AddBooleanParameter("Active", "A", "Set to true to change the active layer in Rhino.", GH_ParamAccess.item, false); pManager.AddTextParameter("Path", "P", "Full path of the layer to be activated.", GH_ParamAccess.item); }
/// <summary> /// Registers all the output parameters for this component. /// </summary> protected override void RegisterOutputParams(GH_Component.GH_OutputParamManager pManager) { pManager.AddIntegerParameter("Layer ID", "ID", "Index of layer that has been activated.", GH_ParamAccess.item); pManager.AddBooleanParameter("Status", "St", "True when the layer has been activated.", GH_ParamAccess.item); }
/// <summary> /// This is the method that actually does the work. /// </summary> /// <param name="DA">The DA object is used to retrieve from inputs and store in outputs.</param> protected override void SolveInstance(IGH_DataAccess DA) { bool active = false; string path = "";
if (!DA.GetData(0, ref active)) return; if (!DA.GetData(1, ref path)) return;
int layer_index = -1; bool status = false;
if (path != null) {
Rhino.RhinoDoc doc = Rhino.RhinoDoc.ActiveDoc; Rhino.DocObjects.Tables.LayerTable layertable = doc.Layers;
layer_index = layertable.FindByFullPath(path, true);
if (layer_index > 0) { // if exists RhinoDoc.ActiveDoc.Layers.SetCurrentLayerIndex(layer_index, true); status = true; } }
DA.SetData(0, layer_index); DA.SetData(1, status); }
Now originally I was getting exceptions when changing multiple layers' visibility properties, which would cause the Event Listener to fire and try to read the Visibility property before the memory has been released by the Set Layer Visibility component. That led me to add an "Exceptions" input, that would allow me to disable the reading of Visibility events at the source in the Layer Events listener. That helped me manage about 95% of the crashes I was getting, but I still get strange crashes in other event properties, even when that property shouldn't be affected. For instance, I am getting a crash here on the Name property in the event from the delegate function, even though I am only changing Visibility at any one time:
I have a few ideas but they all seem pretty hacky. One is to try to set a flag that is readable by any component in the plugin -- so that the event listener can see if a "set" component is currently running and abort before causing an exception. The other is creating a delay in the event listener, somthing like 200ms, to allow any set components to finish what they are doing before reading the event. Neither seems super ideal.
Any ideas?
Thanks,
Marc
…