Skip to content

Automatic field creation

kmilidonis edited this page Mar 28, 2022 · 1 revision

This tutorial regards to the automatic design of a north type heliostat field using the scripting editor of Tonatiuh++. The heliostat field regards to the PROTEAS heliostat facility of The Cyprus Institute that is sited on a coastal hilly terrain. Upon installation of Tonatiuh++, an examples folder will be also created in the installation directory. The video below shows a step-by-step video on how to use the script to automatically generate the field. The corresponding script is also given below.

auto_heliostat_field_creation2

Script var file = DataObject(); file.read("heliostats.csv");

function makeHeliostat(parent, name, position, aiming, focus) { var nm = parent.createNode(name); nm.setParameter("translation", position); nm.setParameter("rotation", "0 0 1 180");

var t = nm.createTracker(); t.setName("LF"); t.setPart("armature", hLF); var tt = t.getPart("target"); tt.setParameter("aimingPoint", aiming);

var n = nm.createNode("primary"); n = n.createNode("secondary"); n = n.createNode("facet"); n.setParameter("translation", "0 0.125 0"); n.setParameter("rotation", "1 0 0 -90");

var s = n.createShape();

var q = s.insertSurface("Parabolic"); q.setParameter("fX", focus); q.setParameter("fY", focus);

var p = s.insertProfile("Box"); p.setParameter("uSize", 2.25); p.setParameter("vSize", 2.25);

var m = s.insertMaterial("Specular"); m.setParameter("slope", "0.002");

var mG = s.getPart("material"); mG.setParameter("ambientColor", "0.65 0.72 0.79"); mG.setParameter("diffuseColor", "0.05 0.05 0.05"); mG.setParameter("specularColor", "0.3 0.25 0.2"); mG.setParameter("shininess", "0.5");

// pylon n = nm.createNode("pylon"); n.setParameter("scale", "0.05 0.05 1"); s = n.createShape(); m = s.insertMaterial("Transparent"); q = s.insertSurface("Cylinder"); p = s.insertProfile("Rectangular"); p.setParameter("vMin", 0.); p.setParameter("vMax", 1.5); var mG = s.getPart("material"); mG.setParameter("ambientColor", "0.5 0.5 0.5"); mG.setParameter("diffuseColor", "0.3 0.3 0.3"); mG.setParameter("specularColor", "0.2 0.2 0.2"); mG.setParameter("shininess", "0.1"); }

var node = NodeObject(); var t = node.createTracker(); var hLF = t.insertArmature("two-axes"); hLF.setParameter("primaryShift", "0 0.04 1.5"); hLF.setParameter("primaryAxis", "1 0 0"); hLF.setParameter("primaryAngles", "-90 90"); hLF.setParameter("secondaryShift", "0 0.175 0"); hLF.setParameter("secondaryAxis", "0 0 1"); hLF.setParameter("secondaryAngles", "-90 90"); hLF.setParameter("facetShift", "0 0.125 0"); hLF.setParameter("facetNormal", "0 1 0");

function makeTowerMaterial(shape) { var mG = shape.getPart("material"); mG.setParameter("ambientColor", "0.47 0.5 0.47"); mG.setParameter("diffuseColor", "0.45 0.45 0.45"); }

function makeTower(nT, xSize, ySize, zSize, zWindow) { var wall = 0.2;

n = nT.createNode("North"); n.setParameter("translation", "0 " + (-wall/2) + " " + (zSize - zWindow)/2); n.setParameter("scale", "" + xSize + " " + wall + " " + (zSize - zWindow)); s = n.createShape(); s.insertSurface("Cube"); makeTowerMaterial(s);

n = nT.createNode("South"); n.setParameter("translation", "0 " + (-ySize + wall/2) + " " + zSize/2); n.setParameter("scale", "" + xSize + " " + wall + " " + zSize); s = n.createShape(); s.insertSurface("Cube"); makeTowerMaterial(s);

n = nT.createNode("Top"); n.setParameter("translation", "0 " + (-ySize/2) + " " + (zSize - wall/2)); n.setParameter("scale", "" + xSize + " " + ySize + " " + wall); s = n.createShape(); s.insertSurface("Cube"); makeTowerMaterial(s);

n = nT.createNode("Floor"); n.setParameter("translation", "0 " + (-ySize/2) + " " + (zSize - zWindow - wall/2)); n.setParameter("scale", "" + xSize + " " + ySize + " " + wall); s = n.createShape(); s.insertSurface("Cube"); makeTowerMaterial(s);

n = nT.createNode("East"); n.setParameter("translation", "" + (xSize/2 - wall/2) + " " + (-ySize/2) + " " + zSize/2); n.setParameter("scale", "" + wall + " " + ySize + " " + zSize); s = n.createShape(); s.insertSurface("Cube"); makeTowerMaterial(s);

n = nT.createNode("West"); n.setParameter("translation", "" - (xSize/2 - wall/2) + " " + (-ySize/2) + " " + zSize/2); n.setParameter("scale", "" + wall + " " + ySize + " " + zSize); s = n.createShape(); s.insertSurface("Cube"); makeTowerMaterial(s); }

function makeField() { var nodeRoot = NodeObject(); nodeRoot.setName("Script");

var nodeHeliostats = nodeRoot.createNode("Heliostats"); nodeHeliostats.setParameter("translation", "0 0 -1.5");

var nMax = file.rows(); for (var n = 1; n < nMax; n++) { var data = file.array(n); name = data[0]; position = data[1]; focus = data[2]; makeHeliostat(nodeHeliostats, name, position, vRec, focus); }

var nT = nodeRoot.createNode("Tower"); nT.setParameter("translation", "0 0 0"); nT.setParameter("rotation", "0 0 1 5"); makeTower(nT, 6, 6, zReceiver + 5, 10);

var nR = nodeRoot.createNode("Receiver"); nR.setParameter("translation", vRec); nR.setParameter("rotation", "-1 0 0 110"); var n = nR.createNode("Plate"); n.setParameter("rotation", "0 0 1 180"); s = n.createShape(); q = s.insertSurface("Planar"); p = s.insertProfile("Box"); p.setParameter("uSize", 5); p.setParameter("vSize", 5); var mG = s.getPart("material"); mG.setParameter("ambientColor", "0.3 0.3 0.3"); mG.setParameter("diffuseColor", "0.1 0.1 0.1"); mG.setParameter("specularColor", "0. 0. 0."); mG.setParameter("shininess", "0.1");

tn.InsertScene(nodeRoot); }

var zReceiver = 13.8347 + 1.5; var vRec = "0.0467 -2.0216 " + zReceiver;

tn.Clear(); makeField();

var scene = NodeObject().getScene();

var scene = NodeObject().getScene(); var sp = scene.getPart("world.sun.position"); sp.setParameter("azimuth", 180); sp.setParameter("elevation", 70);

var cm = scene.getPart("world.camera"); cm.setParameter("position", "-61.9296 -66.3768 75.5367"); cm.setParameter("rotation", "33.4011 -32.917");

var tg = scene.getPart("world.terrain.grid"); tg.setParameter("steps", "5 5 1"); tg.setParameter("file", "../examples/facilities/Proteas/terrain/terrain.obj");

Clone this wiki locally